Menetkö hämillesi, jos funktion kutsussa on * muuttujan edessä?
Kommentit (14)
Muistinhallinta on syytä jättää ammattilaisille. Siksi käytän javaa.
Miksi menisin hämilleni?
Luuletko että vain viisaat osaa koodata ja eri kielien tapa käyttää muuttujia suoraan tai pointterien ja referenssien olisi jotenkin liian vaikeaa?
Tähti (*) funktion kutsun edessä liittyy yleensä Python-ohjelmointikieleen ja se tarkoittaa argumenttien pakkaamista (packing) ja purkamista (unpacking). Tässä on tärkeimmät käyttötavat:
1. **Pakkaaminen (Packing):**
Kun tähti (*) sijoitetaan argumenttilistan eteen funktiota kutsuttaessa, se pakkaa ylimääräiset argumentit tupleen. Esimerkiksi:
```python
def tulosta_tiedot(*args):
for arg in args:
print(arg)
tulosta_tiedot(1, 2, 3)
```
Tässä `args` on tuple, joka sisältää kaikki annetut arvot `(1, 2, 3)`.
2. **Purkaminen (Unpacking):**
Kun tähti (*) sijoitetaan argumenttilistan eteen funktiota määriteltäessä tai esimerkiksi toisessa funktiokutsussa, se purkaa tuplesta tai listasta arvot erillisiksi argumenteiksi. Esimerkiksi:
```python
def tulosta_kolme_lukua(a, b, c):
print(a, b, c)
tuple_arvot = (1, 2, 3)
tulosta_kolme_lukua(*tuple_arvot)
```
Tässä `*tuple_arvot` purkaa tuplesta arvot `(1, 2, 3)` erillisiksi argumenteiksi `tulosta_kolme_lukua`-funktiolle.
Tähti (*) on siis hyödyllinen työkalu, kun halutaan käsitellä muuttuva määrä argumentteja tai kun halutaan purkaa arvot tuplesta tai listasta erillisiksi argumenteiksi.
F(x)=2x^2 -3x +2
Versus
F(x)=2*x^2 -3*x +2
Katsos, ei muuttunut mitenkään tuo funktio.😆
Vierailija kirjoitti:
Muistinhallinta on syytä jättää ammattilaisille. Siksi käytän javaa.
Itse kirjoitan Assemblylla koodin koska sulautetuissa sovelluksissa ei ole varaa turhia prosesseja pyöritellä.
Vierailija kirjoitti:
Mikä eroa on pointterilla ja referenssillä?
Pointterit (pointers) ja referenssit (references) ovat molemmat ohjelmointikäsitteitä, jotka liittyvät muistin osoittamiseen ja käsittelyyn, mutta niillä on joitain merkittäviä eroja. Tässä on keskeiset erot:
### Pointterit
1. **Määritelmä:** Pointteri on muuttuja, joka sisältää toisen muuttujan muistiosoitteen.
2. **Muokattavuus:** Pointterit voidaan asettaa osoittamaan mihin tahansa muistipaikkaan. Niitä voidaan muuttaa osoittamaan eri paikkoihin ohjelman aikana.
3. **Arvo-operaatiot:** Pointterin arvoa (osoitettua muistiosoitetta) voidaan muuttaa. Pointteria voidaan käyttää muistipaikan suorana käsittelemiseen esimerkiksi osoitearitmetiikassa.
4. **Null-arvot:** Pointterit voivat olla null (tyhjä osoitin), mikä tarkoittaa, että ne eivät osoita mihinkään.
5. **Syntax:** Pointtereiden kanssa käytetään dereferointioperaattoria (*) ja osoitteenotto-operaattoria (&). Esimerkiksi:
```cpp
int x = 5;
int* p = &x; // p on osoitin, joka osoittaa x:ään
*p = 10; // x muuttuu arvoon 10
```
### Referenssit
1. **Määritelmä:** Referenssi on alias toiselle muuttujalle, eli se on toinen nimi olemassa olevalle muuttujalle.
2. **Muokattavuus:** Kun referenssi on alustettu osoittamaan tiettyyn muuttujaan, sitä ei voi muuttaa osoittamaan toiseen muuttujaan.
3. **Arvo-operaatiot:** Referenssi itsessään ei ole muuttuja, vaan se toimii suoraan alkuperäisen muuttujan kanssa. Ei ole erillisiä osoite- tai dereferointioperaatioita.
4. **Null-arvot:** Referenssit eivät voi olla null. Niiden on aina osoitettava johonkin olemassa olevaan muuttujaan.
5. **Syntax:** Referenssit ovat helpommin käytettäviä kuin pointterit, koska ne eivät vaadi osoite- tai dereferointioperaattoreita. Esimerkiksi:
```cpp
int x = 5;
int& r = x; // r on referenssi x:ään
r = 10; // x muuttuu arvoon 10
```
### Yhteenveto
- **Muokattavuus:** Pointterit voidaan muuttaa osoittamaan eri paikkoihin, referenssejä ei voi.
- **Null-arvot:** Pointterit voivat olla null, referenssit eivät.
- **Käytettävyys:** Pointterit vaativat osoite- ja dereferointioperaatioita, referenssit eivät.
- **Osoitteenotto:** Pointterit käyttävät osoitteenotto-operaattoria (&) ja dereferointioperaattoria (*), kun taas referenssit eivät tarvitse tällaisia operaatioita.
Pointterit tarjoavat enemmän joustavuutta, mutta myös monimutkaisuutta, kun taas referenssit tarjoavat turvallisemman ja helpomman tavan viitata toisiin muuttujiin.
Entä jos kutsuttavan funktion pitäisi apin mukaan palauttaa return String RSVP, voiko silloin tulla paikalle ilman ennakkoilmoitusta ja vedota siihen että kyseessä oli muuttujan lazy evaluation?
Koodariroskasakki leviää jo.pätemää olemattomia vauvafoorumille :D
Terveydenhuollon apotteineen ne jo pilasivatkin, niin kuin lukuisat muut Suomessa toimineet asiat.
Vierailija kirjoitti:
F(x)=2x^2 -3x +2
Versus
F(x)=2*x^2 -3*x +2
Katsos, ei muuttunut mitenkään tuo funktio.😆
Kun tarkastellaan kahta esitystapaa funktiolle \( F(x) \) eli \( F(x) = 2x^2 - 3x + 2 \) ja \( F(x) = 2 * x^2 - 3 * x + 2 \), ero on lähinnä syntaktinen ja riippuu käytetystä ohjelmointikielestä. Tässä esimerkissä selitän eron Pythonin ja C++:n näkökulmasta, koska molemmat ovat yleisesti käytettyjä ohjelmointikieliä.
### Matematiikassa
Matemaattisessa notaatiossa käytetään yleensä lyhyempää merkintätapaa:
\[ F(x) = 2x^2 - 3x + 2 \]
### Ohjelmoinnissa
#### Python
Pythonissa kertolaskun (*multiplication*) symbolia \(*\) on käytettävä eksplisiittisesti. Siten molemmat esitystavat eivät ole synonyymejä, ja Python-koodi, joka käyttää ensimmäistä kaavaa ilman tähtimerkkiä, aiheuttaa syntaksivirheen.
```python
def F(x):
return 2 * x**2 - 3 * x + 2
```
#### C++
C++-kielessä kertolaskuoperaattoria \(*\) on myös käytettävä eksplisiittisesti. Ilman tähtiä, lausekkeella ei ole kelvollista merkitystä, ja se aiheuttaa virheen.
```cpp
double F(double x) {
return 2 * x * x - 3 * x + 2;
}
```
### Yhteenveto
- **Matemaattinen notaati**: `2x^2 - 3x + 2` on hyväksytty merkintätapa, ja kertolasku ymmärretään kontekstista.
- **Ohjelmointikielet**: Kuten Python ja C++, vaativat eksplisiittisen kertolaskuoperaattorin käytön, joten `2 * x^2 - 3 * x + 2` on oikein ja suositeltava tapa esittää funktion laskutoimitus.
Ohjelmointikielissä tähti (*) tarvitaan aina kertolaskun ilmaisemiseksi, joten toinen esitystapa on ainoa oikein toimiva koodissa.
Vierailija kirjoitti:
Vierailija kirjoitti:
Muistinhallinta on syytä jättää ammattilaisille. Siksi käytän javaa.
Itse kirjoitan Assemblylla koodin koska sulautetuissa sovelluksissa ei ole varaa turhia prosesseja pyöritellä.
Niinkö teet? :D Miltä elo kortistossa maistuu?
Vierailija kirjoitti:
Entä jos kutsuttavan funktion pitäisi apin mukaan palauttaa return String RSVP, voiko silloin tulla paikalle ilman ennakkoilmoitusta ja vedota siihen että kyseessä oli muuttujan lazy evaluation?
Ei, tässä kontekstissa "lazy evaluation" ei ole relevantti eikä hyväksyttävä perustelu olla ilmoittautumatta etukäteen.
### Lazy Evaluation
Lazy evaluation tarkoittaa, että ilmaisuja ei arvioida heti niiden määrittelyn yhteydessä, vaan vasta, kun niiden arvoa tarvitaan ensimmäisen kerran. Tämä konsepti liittyy ohjelmointiin ja erityisesti tiettyihin ohjelmointikieliin, kuten Haskell, jotka tukevat laiskaa arviointia natiivisti.
### RSVP
RSVP (Répondez s'il vous plaît) tarkoittaa "Vastatkaa, olkaa hyvä" ja sitä käytetään tapahtumien yhteydessä pyytämään vierailta ennakkoilmoitusta osallistumisestaan. Tällä ei ole mitään tekemistä ohjelmointikäsitteiden, kuten lazy evaluationin, kanssa. RSVP on kohtelias pyyntö järjestäjille tapahtuman suunnittelun helpottamiseksi.
### Konteksti: Palauttaa String RSVP
Jos kutsuttavan funktion pitäisi palauttaa `String RSVP`, se tarkoittaa ohjelmointikielessä, että funktion tulee palauttaa merkkijono, jossa on teksti "RSVP". Tämä ei kuitenkaan liity tapahtuman RSVP-konseptiin, jossa odotetaan etukäteisilmoitusta osallistumisesta.
### Yhteenveto
- **Lazy Evaluation**: Ohjelmointikäsitteellä, joka viivästyttää arvon laskemista siihen asti, kun sitä tarvitaan, ei ole merkitystä RSVP-tilanteessa.
- **RSVP**: Tapahtumaan osallistumiseen liittyvä ennakkoilmoituspyyntö, johon tulee vastata järjestäjän ohjeiden mukaisesti.
Et voi vedota "lazy evaluationiin" välttääksesi etukäteisilmoitusta tapahtumaan, koska nämä kaksi käsitettä ovat täysin erillisiä ja liittyvät eri konteksteihin. Tapahtumaan osallistumisessa on tärkeää kunnioittaa järjestäjän pyyntöjä ja ilmoittautua etukäteen, jos niin pyydetään.
Tosi ärsyttävää kun asiattomaan kommenttiin vastataan kuivan asiallisesti.
Mikä eroa on pointterilla ja referenssillä?