Advertisement
tuomasvaltanen

Untitled

Nov 12th, 2024 (edited)
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.90 KB | None | 0 0
  1. # KOKEILE HETI LUENNON ALUSSA TOIMIIKO SEURAAVA KOODI PYCHARMISSASI:
  2. # Jos ei toimi, ks. Moodlesta "SSL-ongelmat internet-datan kanssa, korjausvaihtoehdot"
  3.  
  4. # Toimiessaan oikein, tulostaa ohjelma raakadataa konsoliin
  5. # Jos tulee SSL-virhe, silloin koodi ei toimi oikein
  6.  
  7. import urllib.request
  8.  
  9. # get internet data
  10. url = 'https://edu.frostbit.fi/api/events'
  11. req = urllib.request.Request(url)
  12. raw_data = urllib.request.urlopen(req).read().decode("UTF-8")
  13.  
  14. print(raw_data)
  15.  
  16. # UUSI TIEDOSTO
  17.  
  18. # kokoelmat kokoelman sisällä, esim. lista
  19. temp_day_1 = [13.5, 16.4, 11.6, 11.3]
  20. temp_day_2 = [12.1, 15.2, 11.9, 10.4]
  21. temp_day_3 = [15.3, 17.6, 12.5, 11.6]
  22.  
  23. temperatures = [temp_day_1, temp_day_2, temp_day_3]
  24.  
  25. # suoraan tulostaminen ei ole muutoin kuin testimielessä hyödyllistä
  26. # koska tätä formaattia ei tavallinen käyttäjä oikein pysty hahmottamaa
  27. # yleensä vain katsotaan tuleehan edes jotakin dataa läpi
  28. # print(temperatures)
  29.  
  30. # muistisääntö: jos on lista, joka koostuu listoista
  31. # tarvitaan silmukka, jossa on silmukka
  32. # esim. for-silmukka -> sisällä toinen for-silmukka
  33.  
  34. # silmukoidaan kaikista lämpötiloista yksi päivä kerrallaan
  35. for day in temperatures:
  36.     print("Vaihdetaan päivää!")
  37.  
  38.     # silmukoidaan tämänhetkisen päivän
  39.     # jokainen lämpötila
  40.     for temperature in day:
  41.         print(temperature)
  42.  
  43.     print()
  44.  
  45. # UUSI TIEDOSTO, kokeile PYTHON TUTORISSA!
  46.  
  47. # tuotteet omissa kategorioissaan
  48. books = ["Da Vinci Code", "Taru sormusten herrasta", "Light Fantastic"]
  49. movies = ["Jurassic Park", "Interstellar", "Forrest Gump"]
  50.  
  51. # kaikki verkkokaupan tuotteet ovat omina listoinaan tässä listassa
  52. products = [books, movies]
  53.  
  54. # silmukoidaan kategoriat läpi
  55. for category in products:
  56.    
  57.     # ... ja sitten silmukoidaan tämän hetkisen / aktiivisen kategorian kaikki tuotteet
  58.     for item in category:
  59.         print(item)
  60.  
  61. # UUSI TIEDOSTO
  62.  
  63. # dictionary dictionaryn sisällä
  64. book = {
  65.     "name":  "My Lady Jane",
  66.     "year":  2016,
  67.     "publisher": {
  68.         "name": "HarperTeen",
  69.         "organization": "HarperCollins Publishers",
  70.         "location": "New York"
  71.     }
  72. }
  73.  
  74. # pelkkä kirjan nimi
  75. print(book['name'])
  76.  
  77. # tapa 1: tallennetaan alidictionary omaan muuttujaan
  78. publisher = book['publisher']
  79. print(publisher['organization'])
  80.  
  81. # tapa 2: voidaan myös suoraan ketjuttaa, mutta jos aiempi
  82. # tapa on helpompi, käytä sitä
  83. print(book['publisher']['organization'])
  84.  
  85. # UUSI TIEDOSTO
  86.  
  87. # esimerkki, lista dictionaryn sisällä
  88. book = {
  89.     "name":  "My Lady Jane",
  90.     "year":  2016,
  91.     "authors": ["Cynthia Hand", "Brodi Ashton", "Jodi Meadows"]
  92. }
  93.  
  94. # jos halutaan yksittäinen kirjoittaja, käytetään indeksiä
  95. # tapa 1: käytetään apumuuttujia
  96. authors = book['authors']
  97. first_author = authors[0]
  98. print(first_author)
  99.  
  100. # tapa 2: suoraan ketjuttamalla -> authors -> ensimmäinen indeksi
  101. print(book['authors'][0])
  102. print()
  103.  
  104. # jos halutaan kaikki kirjailijat käydä läpi, käytetään listaa
  105. for author in book['authors']:
  106.     print(author)
  107.  
  108. # UUSI TIEDOSTO
  109. # ehdottomasti yleisin datarakenne työelämässä
  110. # eli lista joka koostuu dictionaryistä
  111. # jokainen dictionary yleensä koostuu myös monesta muusta rakenteesta
  112. products = [
  113.     {"name": "Kahvinkeitin", "price": 79},
  114.     {"name": "Astianpesukone", "price": 299},
  115.     {"name": "Arkkupakastin", "price": 199},
  116.     {"name": "Hammasharja", "price": 3}
  117. ]
  118.  
  119. # tyypillisesti tällaista listaa käsitellään for-silmukalla
  120. for item in products:
  121.     # puretaan tuotteen osat apumuuttujiin
  122.     name = item['name']
  123.     price = item['price']
  124.  
  125.     # tulostetaan tämän hetkisen tuotteen tiedot
  126.     print(f"{name} --- {price} €")
  127.  
  128. # UUSI TIEDOSTO
  129.  
  130. # esimerkki 1
  131. import var_dump as vd
  132.  
  133. # luodaan hotelli no. 1
  134. hotel_1 = {
  135.     "name": "Snow Line Hotels",
  136.     "rating": 4.3,
  137.     "wifi": True,
  138.     "free_breakfast": True,
  139.     "services": ["sauna", "meetings", "restaurant", "parking", "safaris"],
  140.     "price_level": 4
  141. }
  142.  
  143. # luodaan hotelli no. 2
  144. hotel_2 = {
  145.     "name": "North Ice Hostel",
  146.     "rating": 3.5,
  147.     "wifi": True,
  148.     "free_breakfast": False,
  149.     "services": ["sauna", "parking"],
  150.     "price_level": 2
  151. }
  152.  
  153. # asetetaan molemmat hotellit samaan listaan
  154. hotels = [hotel_1, hotel_2]
  155.  
  156. # print(hotels)
  157. # print()
  158.  
  159. # yksittäinen hotelli sisältää tämäntyylistä tietoa.
  160. # koska alkuperäinen data on lista hotelleja,
  161. # silmukan sisällä oleva hotelli sisältää aina nämä tiedot:
  162. # [0] => dict(6)
  163. #         ['name'] => str(16) "Snow Line Hotels"
  164. #         ['rating'] => float(4.3)
  165. #         ['wifi'] => bool(True)
  166. #         ['free_breakfast'] => bool(True)
  167. #         ['services'] => list(5)
  168. #             [0] => str(5) "sauna"
  169. #             [1] => str(8) "meetings"
  170. #             [2] => str(10) "restaurant"
  171. #             [3] => str(7) "parking"
  172. #             [4] => str(7) "safaris"
  173. #         ['price_level'] => int(4)
  174.  
  175. vd.var_dump(hotels)
  176.  
  177. # myös yhtä hotellia voidaan tutkia, esim:
  178. # first_hotel = hotels[0]
  179. # vd.var_dump(first_hotel)
  180.  
  181. # UUSI TIEDOSTO
  182.  
  183. # esimerkki 1
  184. import var_dump as vd
  185.  
  186. # luodaan hotelli no. 1
  187. hotel_1 = {
  188.     "name": "Snow Line Hotels",
  189.     "rating": 4.3,
  190.     "wifi": True,
  191.     "free_breakfast": True,
  192.     "services": ["sauna", "meetings", "restaurant", "parking", "safaris"],
  193.     "price_level": 4
  194. }
  195.  
  196. # luodaan hotelli no. 2
  197. hotel_2 = {
  198.     "name": "North Ice Hostel",
  199.     "rating": 3.5,
  200.     "wifi": True,
  201.     "free_breakfast": False,
  202.     "services": ["sauna", "parking"],
  203.     "price_level": 2
  204. }
  205.  
  206. # asetetaan molemmat hotellit samaan listaan
  207. hotels = [hotel_1, hotel_2]
  208.  
  209. # print(hotels)
  210. # print()
  211.  
  212. # yksittäinen hotelli sisältää tämäntyylistä tietoa.
  213. # koska alkuperäinen data on lista hotelleja,
  214. # silmukan sisällä oleva hotelli sisältää aina nämä tiedot:
  215. # [0] => dict(6)
  216. #         ['name'] => str(16) "Snow Line Hotels"
  217. #         ['rating'] => float(4.3)
  218. #         ['wifi'] => bool(True)
  219. #         ['free_breakfast'] => bool(True)
  220. #         ['services'] => list(5)
  221. #             [0] => str(5) "sauna"
  222. #             [1] => str(8) "meetings"
  223. #             [2] => str(10) "restaurant"
  224. #             [3] => str(7) "parking"
  225. #             [4] => str(7) "safaris"
  226. #         ['price_level'] => int(4)
  227.  
  228. # vd.var_dump(hotels)
  229.  
  230. # silmukoidaan hotellidata läpi
  231. for hotel in hotels:
  232.     print(hotel['name'])
  233.  
  234. # UUSI VERSIO
  235.  
  236. # hotellidata samalla tavalla kuin aikasemmin
  237.  
  238. # silmukoidaan hotellidata läpi
  239. for hotel in hotels:
  240.     print(hotel['name'])
  241.  
  242.     # yhdessä hotellissa on aina x-määrä palveluita (lista)
  243.     # joten tarvitaan toinen silmukka
  244.     # for service in hotel['services']:
  245.     #    print(service)
  246.  
  247.     # lähtökohtaisesti jos datassa on vain simppeli tekstilista
  248.     # voidaan välttää for-silmukka käyttämällä join() -funktiota
  249.     # eli yhdistetään kaikki palveluiden nimet rivinvaihdolla
  250.     # lopputulos on sama kuin ylläolevassa for-silmukassa
  251.     # (kommentoitu pois)
  252.     services = "\n".join(hotel['services'])
  253.     print(services)
  254.     print()
  255.  
  256. # UUSI VERSIO
  257.  
  258. # hotellidata samalla tavalla kuin aiemmin
  259.  
  260. # silmukoidaan hotellidata läpi
  261. for hotel in hotels:
  262.     print(hotel['name'])
  263.  
  264.     # yhdessä hotellissa on aina x-määrä palveluita (lista)
  265.     # joten tarvitaan toinen silmukka
  266.     # for service in hotel['services']:
  267.     #    print(service)
  268.  
  269.     # lähtökohtaisesti jos datassa on vain simppeli tekstilista
  270.     # voidaan välttää for-silmukka käyttämällä join() -funktiota
  271.     # eli yhdistetään kaikki palveluiden nimet rivinvaihdolla
  272.     # lopputulos on sama kuin ylläolevassa for-silmukassa
  273.     # (kommentoitu pois)
  274.     services = "\n".join(hotel['services'])
  275.  
  276.     # myös ylimääräistä logiikkaa voidana tehdä ehtolauseilla
  277.     if "restaurant" in hotel['services']:
  278.         print("Hotellissa on ravintola.")
  279.  
  280.     if "sauna" in hotel['services']:
  281.         print("Hotellissa on sauna.")
  282.  
  283.     print()
  284.  
  285. # UUSI VERSIO
  286.  
  287. # tehdään tyhjä lista, jonka ideana on kerätä kaikkien niiden hotellien
  288. # nimet, joissa on sauna
  289. restaurant_hotels = []
  290.  
  291. # silmukoidaan hotellidata läpi
  292. for hotel in hotels:
  293.     print(hotel['name'])
  294.  
  295.     # suodatetaan vain ne hotellit, joissa on ravintola
  296.     if "restaurant" in hotel['services']:
  297.         restaurant_hotels.append(hotel['name'])
  298.  
  299.  
  300. # nyt kun kaikki hotellit on käsitelty, voidaan tarkastella
  301. # missä hotelleissa on sauna, tulostetaan testimielessä lista suoraan
  302. print()
  303. print(restaurant_hotels)
  304.  
  305. # UUSI TIEDOSTO
  306.  
  307. # urllib mahdollistaa raakadatan lataamisen internetistä
  308. # json mahdollistaa raakadatan muuntamiseen Python-formaattiin
  309. import urllib.request
  310. import json
  311. import var_dump as vd
  312.  
  313. # get internet data
  314. url = 'https://edu.frostbit.fi/api/events'
  315. req = urllib.request.Request(url)
  316. raw_data = urllib.request.urlopen(req).read().decode("UTF-8")
  317.  
  318. # raw_data on nyt raakamuotoinen JSON-data, joka pitää
  319. # muuntaa Pythonin datamuotoon
  320. data = json.loads(raw_data)
  321.  
  322. # var_dumpilla katsotaan sisällön rakenne
  323. # vd.var_dump(data)
  324.  
  325. # kommenttiin ylös yhden esimerkki-eventin sisältö:
  326.  
  327. # [3] => dict(4)
  328. #     ['name'] => str(66) "Helena Saarikoski: Kirjeitä Eppu Normaalille: Päiväkirja 2009–2019"
  329. #     ['date'] => str(10) "17.12.2024"
  330. #     ['categories'] => list(4)
  331. #         [0] => str(10) "keskustelu"
  332. #         [1] => str(12) "kirjallisuus"
  333. #         [2] => str(6) "kirjat"
  334. #         [3] => str(19) "kulttuuritapahtumat"
  335. #     ['address'] => dict(2)
  336. #         ['street_address'] => str(18) "Töölönlahdenkatu 4"
  337. #         ['postal_code'] => str(5) "00100"
  338.  
  339. # käydään jokainen eventti silmukassa läpi
  340. for event in data:
  341.     print(event['name'])
  342.  
  343. # UUSI TIEDOSTO
  344.  
  345. # data samalla tavalla kuin aiemmin
  346.  
  347. # käydään jokainen eventti silmukassa läpi
  348. for event in data:
  349.     # nimitieto saadaan suoraa päätasolta
  350.     print(event['name'])
  351.  
  352.     # haetaan osoitetiedot
  353.     street_address = event['address']['street_address']
  354.     postal_code = event['address']['postal_code']
  355.  
  356.     print(f"{postal_code} {street_address}")
  357.  
  358.     # kategoriat
  359.     categories = ", ".join(event['categories'])
  360.  
  361.     # jos kategoriat puuttuu => ilmoitetaan käyttäjälle
  362.     if categories != "":
  363.         print(f"KATEGORIAT: {categories}")
  364.     else:
  365.         print(f"-- EI KATEGORIOITA --")
  366.  
  367.     print()
  368.  
  369. # UUSI VERSIO
  370.  
  371. # VERSIO 2: yksinkertainen hakukone:
  372. # näytä vain sellaiset tapahtumat, joissa on haettu kategoria
  373.  
  374. # urllib mahdollistaa raakadatan lataamisen internetistä
  375. # json mahdollistaa raakadatan muuntamiseen Python-formaattiin
  376. import urllib.request
  377. import json
  378.  
  379. # get internet data
  380. url = 'https://edu.frostbit.fi/api/events'
  381. req = urllib.request.Request(url)
  382. raw_data = urllib.request.urlopen(req).read().decode("UTF-8")
  383.  
  384. # raw_data on nyt raakamuotoinen JSON-data, joka pitää
  385. # muuntaa Pythonin datamuotoon
  386. data = json.loads(raw_data)
  387.  
  388. # käyttäjän hakusana kategorialle
  389. choice = input("Millaisia tapahtumia haet?\n")
  390.  
  391. # käydään jokainen eventti silmukassa läpi
  392. for event in data:
  393.     # kategoriat
  394.     categories = ", ".join(event['categories'])
  395.  
  396.     # continue on kätevä suodatusasioissa
  397.     # eli jos haettu kategoria puuttuu => continue
  398.     # => eli skipataan tämä tapahtuma
  399.     if choice not in categories:
  400.         continue
  401.  
  402.     # nimitieto saadaan suoraa päätasolta
  403.     print(event['name'])
  404.  
  405.     # haetaan osoitetiedot
  406.     street_address = event['address']['street_address']
  407.     postal_code = event['address']['postal_code']
  408.  
  409.     print(f"{postal_code} {street_address}")
  410.  
  411.     # jos kategoriat puuttuu => ilmoitetaan käyttäjälle
  412.     if categories != "":
  413.         print(f"KATEGORIAT: {categories}")
  414.     else:
  415.         print(f"-- EI KATEGORIOITA --")
  416.  
  417.     print()
  418.  
  419. # UUSI VERSIO
  420.  
  421. # VERSIO 3: yksinkertainen hakukone:
  422. # näytä vain yksi tapahtuma, eli ensimmäinen joka osuu hakusanaan
  423. # älä hae muita tapahtumia
  424.  
  425. # urllib mahdollistaa raakadatan lataamisen internetistä
  426. # json mahdollistaa raakadatan muuntamiseen Python-formaattiin
  427. import urllib.request
  428. import json
  429.  
  430. # get internet data
  431. url = 'https://edu.frostbit.fi/api/events'
  432. req = urllib.request.Request(url)
  433. raw_data = urllib.request.urlopen(req).read().decode("UTF-8")
  434.  
  435. # raw_data on nyt raakamuotoinen JSON-data, joka pitää
  436. # muuntaa Pythonin datamuotoon
  437. data = json.loads(raw_data)
  438.  
  439. # käyttäjän hakusana kategorialle
  440. choice = input("Millaisia tapahtumia haet?\n")
  441.  
  442. # käydään jokainen eventti silmukassa läpi
  443. for event in data:
  444.     # kategoriat
  445.     categories = ", ".join(event['categories'])
  446.  
  447.     # continue on kätevä suodatusasioissa
  448.     # eli jos haettu kategoria puuttuu => continue
  449.     # => eli skipataan tämä tapahtuma
  450.     if choice in categories:
  451.         # nimitieto saadaan suoraa päätasolta
  452.         print("\nNäytetään vain ensimmäinen löydetty hakutulos:")
  453.         print(event['name'])
  454.  
  455.         # haetaan osoitetiedot
  456.         street_address = event['address']['street_address']
  457.         postal_code = event['address']['postal_code']
  458.  
  459.         print(f"{postal_code} {street_address}")
  460.  
  461.         # jos kategoriat puuttuu => ilmoitetaan käyttäjälle
  462.         if categories != "":
  463.             print(f"KATEGORIAT: {categories}")
  464.         else:
  465.             print(f"-- EI KATEGORIOITA --")
  466.  
  467.         # koska löydettiin tapahtuma, mikä täsmää hakusanaan
  468.         # kutsutaan break eli lopetaan etsintä
  469.         break
  470.  
  471. # VINKKEJÄ TEHTÄVÄÄN 7.5
  472.  
  473. import json
  474. import urllib.request
  475.  
  476. url = "https://edu.frostbit.fi/api/weather/"
  477. req = urllib.request.Request(url)
  478. raw_data = urllib.request.urlopen(req).read().decode("UTF-8")
  479.  
  480. weather = json.loads(raw_data)
  481.  
  482. strongest_wind = 0
  483. strongest_wind_city = ""
  484. weakest_wind = 0
  485.  
  486. # jne jne
  487.  
  488. # silmukoidaan säädata mittauspaikka kerrallaan
  489. for city in weather:
  490.     print(city['location'])
  491.     print(city['wind'])
  492.     print()
  493.      
  494.     # tässä sitten ehtolauseita jotka pitää kirjaa suurimmasta ja pienimmästä tuulesta
  495.     # ks. myös tehtävänannon vinkit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement