Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Python, pitäis keksiä kysymys kaavaan

Sivun loppuun

Vanutyyny [10.06.2021 15:48:44]

#

from fractions import Fraction
LukuA = float (input ("Syötä 1 Luku: "));
LukuB = float (input ("Syötä 2 Luku: "));
LukuC = float (input ("Syötä 3 Luku:"))


def JakajaA():
    DivA = Fraction (LukuA / LukuB)
    return DivA


def JakajaB(DivB):
    DivB == Fraction ((LukuA + LukuB) / LukuC)
    return DivB

print ("Jako A on:", JakajaA().limit_denominator(10))
print ("Jakaja B ...:", JakajaB().limit_denominator(10))

Mä opiskelen huvikseni tässä murtolukuja. Täytyy myöntää, että luulin osaavani ne, ennen kuin aloin lätkiin niitä tuonne koodiin.
Mut joo, kysymys olis, että mikä olisi hyvä kysymys, jonka voisin laittaa tuohon B:hen, et saisin ratkaistuksi jotain sekä ilman, että parametrin kanssa. Tuliskos äkkiä mieleen jokin kiva?

osku91 [11.06.2021 11:51:19]

#

En ihan ymmärtänyt kysymystä. Haluat siis kysymyksen B:hen? Minkä kysymyksen? Mihin B:hen? Mikä ratkaisu? Mikä parametri?

Mutta tämä:

Fraction (LukuA / LukuB)

Kannattaa mielummin laittaa näin:

Fraction (LukuA, LukuB)

Koska muuten teet ensin float muotoisen luvun, jossa voi joissain tapauksissa kadota tarkkuutta. Luomalla Fraction objektin kahdella eri parametrilla tarkkuus säilyy aina.

osku91 [11.06.2021 11:55:02]

#

Nythän JakajaB funktio ottaa parametrin, jota et sille kutsuttaessa anna. Mutta et myöskään käytä tuota DivB parametria mihinkään JakajaB funktiossa. Mitä haluaisit että JakajaB funktio tekee?

Tuolla JakajaB funktiossa on `==`. Pitäisikö olla vain `=`?

Vanutyyny [11.06.2021 12:39:27]

#

osku91 kirjoitti:

(11.06.2021 11:51:19): En ihan ymmärtänyt kysymystä. Haluat siis...

Juuri ne kysymyset, mitä tässä pohdin :)
Eli kun harjoittelen näitä murtolukuja ja niiden sijoitusta funktioon, että se tekisi jotain, niin mulla ei ratas pyöri, kun pitäisi keksiä kysymys. Mitä haluaisin, että funktio tekee, että se palauttaisi jonkin parametrin.
Suunnittelin, että laittaisin ne myöhemmin niin, että kun käyttäjä syöttää luvut 3, 5, 9, se tekisi, että muuttaa kaikki x/3 osiksi. Mut se on vähän vaikeempi juttu, ja ajattelin harjoitella ensin helpommalla jutulla. Et se funktio palauttaisi DivB:hen edes jotain.

Tossa A:ssa, eli jakajaA:ssa halusin, että jos syöttää kaksi lukua, niin se muuttaa ne kaksi lukua, flat/ int, murtoluvuksi. Ei sen muuta tarvi tehdä. Siinä tuli tuo lukujen muuttaminen ja tulostus kerratuksi. Kokeilen, mitä pilkulla tapahtuu, kiitos. Mutta siksi on siis toi /, kun myöhemmin ajattelin käyttää sitä x/3 - juttua.

Vanutyyny [11.06.2021 12:48:47]

#

osku91 kirjoitti:

Nythän JakajaB funktio ottaa parametrin, jota et sille kutsuttaessa anna. Mutta et myöskään käytä tuota DivB parametria mihinkään JakajaB funktiossa. Mitä haluaisit että JakajaB funktio tekee?

Tuolla JakajaB funktiossa on `==`. Pitäisikö olla vain `=`?

Hyvin mahdollista. Mä nyt oon ehtinyt valitettavasti leikkiä tuolla pätkällä, mut siinä oli vaihe, jossa = ei toiminut ja == toimi. En tiedä miksi, saattoi olla muutakin kyseessä. Mut periaatteessa saman tyylinen se oli, että
funktio
laskutoimitus == jotain
return toista

Nythän se herjaa mulle, et:
JakajaB() missing 1 required positional argument: 'DivB'
oli siinä = tai ==.

Et ajattelin, jos yrittäis vielä yksinkertaistaa jollain helpolla kysymyksellä, et sais pohjat sinne. Mä oon kaivanu pari päivää netistä funktio-ohjeita, joissa käsitellään lukuja, mut en ole onnistunu soveltaan.

osku91 [11.06.2021 14:42:01]

#

Jees eli sulla menee nyt muutama perus asia sekasin. Funktiolle voi siis antaa parametreja ja funktio palauttaa jotain. Esim:

def esim_1():
    return 1

def esim_2(ensimmainen, toinen):
    return ensimmainen + toinen

# Tässä on nyt 2 funktiota joista ensimmäinen ei ota parametreja ja toinen ottaa
# kaksi parametria. Näitä kutsuttaisiin vaikka näin:

print(esim_1())
print(esim_2(5, 10))

# Nyt ensimmäinen print kutsu tulostaisi 1, koska esim_1 palauttaa 1. Toinen print
# tulostaisi 15, koska esim_2 ottaa 2 parametria ja palauttaa niiden
# summan. Funktion paluuarvon voi myös vaikka tallettaa muuttujaan:

m1 = esim_1()
m2 = esim_2(7, 6)

# Nyt ei tulosteta mitään, mutta m1 muuttujassa on arvo 1 ja m2
# muuttujassa arvo 13.

Nyt sun koodissa siis kutsut funktiota näin: JakajaB(), vaikka funktion määritelmässä funktio ottaa yhden parametrin. Siitä johtuu tuo `missing 1 required positional argument` virhe. Eli joudut joko kutsumaan funktiota jollain parametrilla tai poistamaan tuon parametrin funktion määritelmästä.

Vanutyyny [14.06.2021 12:48:51]

#

muuskanuikku kirjoitti:

Korjaa ensin nuo funktiot kuntoon ja mieti ohjelmalogiikkaa vasta sen jälkeen. Murtoluvut eivät liity tähän ongelmaan millään tavoin.

Moikka vaan..
Lähdin tästä ohjeesta liikenteeseen:

$ python3 adding.py

def add(a, b):
    result = a + b
    return result

print(add(2, 2))

Mut ilmeisesti ei siis sovelleta, että saatais syötteestä jotain irti, vaan täytyy kaivaa vielä lisää ohjeta jostain netistä ja toivoa, että törmää oikeeseen ohjeeseen ja vielä, et keksis kysymyksen, johon vois yrittää soveltaa. Ja ei, murtoluvut ei liity ongelmaan, eikä se ongelma ollutkaan, vaan se kysymys. Et jos sulla ei ole mitään annettavaa, niin miksi soittaa suuta tyhjästä.

Metabolix [14.06.2021 12:57:48]

#

Minustakin on epäselvää, mitä haluat. Aloituksessa oli viallinen koodi ja murtolukuja ja "kysymys" hukassa, ja nyt haluatkin soveltaa funktioesimerkkiä jotenkin. Eli haluatko vain jonkin tehtävän, jossa pitäisi laskea funktiolla jotain käyttäjän syötteestä?

No mitä jos vaikka tuossa laskisit yhteen kaksi käyttäjän antamaa murtolukua? Siinä on varmaan ihan tarpeeksi tekemistä alkuun.

Yleensä float kannattaa unohtaa kokonaan, jos aikoo käyttää murtolukuja. Tuo Fraction-luokka voi ottaa suoraan syötteen muodossa "3/4".

Vanutyyny [15.06.2021 12:37:54]

#

Metabolix kirjoitti:

(14.06.2021 12:57:48): Minustakin on epäselvää, mitä haluat...

No joo, mä lähden tuosta liikenteeseen. Näinhän sen voi ajatella. Eli ensin tosissaan kun harjoittelin tuota, missä muuttaa floatin murtoluvuksi, niin jotenkin luonnollisena olin vain menossa siitä etiäpäin, mutta voihan siitä ottaa taaksepäinkin, tai siis eihän se taaksepäin mene, vaan eri tavalla vaan.
Mä käytin inttiä ensin tossa ja kokeilin floateilla.. Hitsi, kun en muista, oliko noissa inteisä jokin ongelma. Taisi laskea niitä sitten pyöristyksissä jotenkin ihmeellisesti. Pitäis varmaan lukkiutua viikoksi huoneeseen, ettei tulis keskeytyksiä näissä jutuissa! Mä laitan tähän ketjuun maininnan, jos törmään siihen uusiksi.
Mut eikö olis ihan sika kiva, jos vaikka harrastajat alkaisi laskea, että jos alkossa on viiniä, olutta, viinaa ja likööreitä, ja niitä olis 50 hyllymetriä, ja 10 metriä olis olutta, niin paljon niille lopuille jäis.. et sitten olutta olis vaan alle neljäsosa tavaravalokoimasta.. tai jotain vastaavaa. Ei olis vaan niitä hinnastojen pyörittämisiä :)

Vanutyyny [15.06.2021 12:39:08]

#

Metabolix kirjoitti:

(14.06.2021 12:57:48): Minustakin on epäselvää, mitä haluat...

Niinjoo, kiitos tuosta, joskus pitää pyytää jeesiä, et saa yksinkertaistettua asiat, kun niitä on liikaa pyöritellyt, niin ajattelee liian monimutkaisesti!

Metabolix [15.06.2021 13:13:56]

#

Vanutyyny kirjoitti:

Mä käytin inttiä ensin tossa ja kokeilin floateilla.. Hitsi, kun en muista, oliko noissa inteisä jokin ongelma.

Int on kokonaisluku, eli sillä ei voi laskea mitään osia. Jakolaskun tulos muuttuu automaattisesti float-tyyppiseksi. Kokonaislukujen jakolaskua merkitään //, ja silloin myös tulos katkaistaan kokonaisluvuksi.

Float on ”liukuluku”, usein se sekoitetaan desimaalilukuun, mutta koska tietokone käyttää binäärijärjestelmää, float (pienten lukujen tapauksessa) on enemmänkin murtoluku, jonka alapuoli on kakkosen potenssi (2, 4, 8, 16 jne.). Sen takia esimerkiksi lukua 1/5 (eli 0,2) ei ole mahdollista esittää tarkasti float-tyyppisenä ja laskuihin tulee pyöristysvirheitä. (Pyöristysvirheiden takia ==-vertailu tuottaa usein ”väärän” tuloksen.) Voit nähdä tämän float-lukujen ominaisuuden, kun muutat float-luvun Fraction-luvuksi:

print(Fraction(0.2))
# ei olekaan 1/5 vaan 3602879701896397/18014398509481984
# 18014398509481984 == 2**54 eli siis 2 potenssiin 54

print(f"{0.2 :.54f}")
# eli 0.2 näytettynä 54 desimaalin tarkkuudella
# tulostaa: 0.200000000000000011102230246251565404236316680908203125

Syötteen lukemisesta vinkkini oli siis, että voit muuttaa sen suoraan murtoluvuksi.

a = Fraction(input("Anna murtoluku: "))
print(a)

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta