mirror of
https://github.com/adambard/learnxinyminutes-docs.git
synced 2025-09-03 11:43:12 +02:00
Simplify language codes in directories
This commit is contained in:
107
hu/coffeescript.md
Normal file
107
hu/coffeescript.md
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
language: CoffeeScript
|
||||
contributors:
|
||||
- ["Tenor Biel", "http://github.com/L8D"]
|
||||
- ["Xavier Yao", "http://github.com/xavieryao"]
|
||||
translators:
|
||||
- ["Tamás Diószegi", "http://github.com/ditam"]
|
||||
lang: hu-hu
|
||||
filename: coffeescript-hu.coffee
|
||||
---
|
||||
|
||||
A CoffeeScript egy apró nyelv ami egy-az-egyben egyenértékű JavaScript kódra fordul, és így futásidőben már nem szükséges interpretálni.
|
||||
Mint a JavaScript egyik követője, a CoffeeScript mindent megtesz azért, hogy olvasható, jól formázott és jól futó JavaScript kódot állítson elő, ami minden JavaScript futtatókörnyezetben jól működik.
|
||||
|
||||
Rézletekért lásd még a [CoffeeScript weboldalát](http://coffeescript.org/), ahol egy teljes CoffeScript tutorial is található.
|
||||
|
||||
```coffeescript
|
||||
# A CoffeeScript egy hipszter nyelv.
|
||||
# Követi több modern nyelv trendjeit.
|
||||
# Így a kommentek, mint Ruby-ban és Python-ban, a szám szimbólummal kezdődnek.
|
||||
|
||||
###
|
||||
A komment blokkok ilyenek, és közvetlenül '/ *' és '* /' jelekre fordítódnak
|
||||
az eredményül kapott JavaScript kódban.
|
||||
|
||||
Mielőtt tovább olvasol, jobb, ha a JavaScript alapvető szemantikájával
|
||||
tisztában vagy.
|
||||
|
||||
(A kód példák alatt kommentként látható a fordítás után kapott JavaScript kód.)
|
||||
###
|
||||
|
||||
# Értékadás:
|
||||
number = 42 #=> var number = 42;
|
||||
opposite = true #=> var opposite = true;
|
||||
|
||||
# Feltételes utasítások:
|
||||
number = -42 if opposite #=> if(opposite) { number = -42; }
|
||||
|
||||
# Függvények:
|
||||
square = (x) -> x * x #=> var square = function(x) { return x * x; }
|
||||
|
||||
fill = (container, liquid = "coffee") ->
|
||||
"Filling the #{container} with #{liquid}..."
|
||||
#=>var fill;
|
||||
#
|
||||
#fill = function(container, liquid) {
|
||||
# if (liquid == null) {
|
||||
# liquid = "coffee";
|
||||
# }
|
||||
# return "Filling the " + container + " with " + liquid + "...";
|
||||
#};
|
||||
|
||||
# Szám tartományok:
|
||||
list = [1..5] #=> var list = [1, 2, 3, 4, 5];
|
||||
|
||||
# Objektumok:
|
||||
math =
|
||||
root: Math.sqrt
|
||||
square: square
|
||||
cube: (x) -> x * square x
|
||||
#=> var math = {
|
||||
# "root": Math.sqrt,
|
||||
# "square": square,
|
||||
# "cube": function(x) { return x * square(x); }
|
||||
# };
|
||||
|
||||
# "Splat" jellegű függvény-paraméterek:
|
||||
race = (winner, runners...) ->
|
||||
print winner, runners
|
||||
#=>race = function() {
|
||||
# var runners, winner;
|
||||
# winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
|
||||
# return print(winner, runners);
|
||||
# };
|
||||
|
||||
# Létezés-vizsgálat:
|
||||
alert "I knew it!" if elvis?
|
||||
#=> if(typeof elvis !== "undefined" && elvis !== null) { alert("I knew it!"); }
|
||||
|
||||
# Tömb értelmezések: (array comprehensions)
|
||||
cubes = (math.cube num for num in list)
|
||||
#=>cubes = (function() {
|
||||
# var _i, _len, _results;
|
||||
# _results = [];
|
||||
# for (_i = 0, _len = list.length; _i < _len; _i++) {
|
||||
# num = list[_i];
|
||||
# _results.push(math.cube(num));
|
||||
# }
|
||||
# return _results;
|
||||
# })();
|
||||
|
||||
foods = ['broccoli', 'spinach', 'chocolate']
|
||||
eat food for food in foods when food isnt 'chocolate'
|
||||
#=>foods = ['broccoli', 'spinach', 'chocolate'];
|
||||
#
|
||||
#for (_k = 0, _len2 = foods.length; _k < _len2; _k++) {
|
||||
# food = foods[_k];
|
||||
# if (food !== 'chocolate') {
|
||||
# eat(food);
|
||||
# }
|
||||
#}
|
||||
```
|
||||
|
||||
## További források
|
||||
|
||||
- [Smooth CoffeeScript](http://autotelicum.github.io/Smooth-CoffeeScript/)
|
||||
- [CoffeeScript Ristretto](https://leanpub.com/coffeescript-ristretto/read)
|
337
hu/go.md
Normal file
337
hu/go.md
Normal file
@@ -0,0 +1,337 @@
|
||||
---
|
||||
language: Go
|
||||
lang: hu-hu
|
||||
filename: learngo-hu.go
|
||||
contributors:
|
||||
- ["Sonia Keys", "https://github.com/soniakeys"]
|
||||
translators:
|
||||
- ["Szabó Krisztián", "https://github.com/thenonameguy/"]
|
||||
- ["Árpád Goretity", "https://github.com/H2CO3"]
|
||||
---
|
||||
|
||||
A Go programozási nyelv az életszerű feladatok könnyebb elvégzése miatt született.
|
||||
A mai legújabb programozási trendeket elkerülve,
|
||||
praktikus megoldást nyújt a valós, üzleti problémákra.
|
||||
|
||||
C-szerű szintaktikával és statikus típuskezeléssel rendelkezik.
|
||||
A fordító szempillantás alatt végez és egy gyorsan futó,statikus futtatható állományt hoz létre.
|
||||
A nyelv könnyen érthető, folyamatok közötti csatornákon áthaladó üzenetekkel kommunikáló konkurens programozást tesz lehetővé, így könnyen ki lehet használni
|
||||
a mai számítógépek több magos processzorait, ez nagy rendszerek építéséhez ideális.
|
||||
|
||||
A Go alap könyvtára mindenre területre kiterjed, ennek köszönhetően a nyelvnek egyre növekvő tábora van.
|
||||
|
||||
```go
|
||||
// Egy soros komment
|
||||
/* Több
|
||||
soros komment */
|
||||
|
||||
// Minden forrás fájl egy csomag-definícióval kezdődik, ez hasonlít a Python
|
||||
// csomagkezelésére
|
||||
// A main egy különleges csomagnév, ennek a fordítása futtatható állományt hoz
|
||||
// létre egy könyvtár helyett.
|
||||
package main
|
||||
|
||||
// Az import rész meghatározza melyik csomagokat kívánjuk használni ebben a
|
||||
// forrásfájlban
|
||||
import (
|
||||
"fmt" // A Go alap könyvtárának része
|
||||
"net/http" // Beépített webszerver!
|
||||
"strconv" // Stringek átalakítására szolgáló csomag
|
||||
)
|
||||
|
||||
// Függvénydeklarálás, a main nevű függvény a program kezdőpontja.
|
||||
func main() {
|
||||
// Println kiírja a beadott paramétereket a standard kimenetre.
|
||||
// Ha más csomagot függvényeit akarjuk használni, akkor azt jelezni kell a
|
||||
// csomag nevével
|
||||
fmt.Println("Hello world!")
|
||||
|
||||
// Meghívunk egy másik függvényt ebből a csomagból
|
||||
beyondHello()
|
||||
}
|
||||
|
||||
// A függvények paraméterei zárójelek között vannak.
|
||||
// Ha nincsenek paraméterek, akkor is kötelező a zárójel-pár.
|
||||
func beyondHello() {
|
||||
var x int // Változó deklaráció, használat előtt muszáj ezt megtenni.
|
||||
x = 3 // Változó értékadás
|
||||
// "Rövid" deklaráció is létezik, ez az érték alapján deklarálja,
|
||||
// definiálja és értéket is ad a változónak
|
||||
y := 4
|
||||
sum, prod := learnMultiple(x, y) // a függvényeknek több
|
||||
// visszatérési értéke is lehet
|
||||
fmt.Println("sum:", sum, "prod:", prod) // egyszerű kiíratás
|
||||
learnTypes()
|
||||
}
|
||||
|
||||
// A funkcióknak elnevezett visszatérési értékük is lehet
|
||||
func learnMultiple(x, y int) (sum, prod int) {
|
||||
return x + y, x * y // visszatérünk két értékkel
|
||||
/*
|
||||
sum = x + y
|
||||
prod = x * y
|
||||
return
|
||||
Ez ugyanezzel az eredménnyel járt volna, mint a fenti sor.
|
||||
Üres return esetén, az elnevezett visszatérési változók
|
||||
aktuális értékeikkel térnek vissza. */
|
||||
}
|
||||
|
||||
// Beépített típusok
|
||||
func learnTypes() {
|
||||
// Rövid deklarálás az esetek többségében elég lesz a változókhoz
|
||||
s := "Tanulj Go-t!" // string típus
|
||||
|
||||
s2 := `A "nyers" stringekben lehetnek
|
||||
újsorok is!` // de ettől még ez is ugyanolyan string mint az s, nincs külön
|
||||
// típusa
|
||||
|
||||
// nem ASCII karakterek. Minden Go forrás UTF-8 és a stringek is azok.
|
||||
g := 'Σ' // rúna(rune) típus, megegyezik az uint32-vel, egy UTF-8 karaktert
|
||||
// tárol
|
||||
|
||||
f := 3.14159 // float64, az IEEE-754 szabványnak megfelelő 64-bites
|
||||
// lebegőpontos szám
|
||||
c := 3 + 4i // complex128, belsőleg két float64-gyel tárolva
|
||||
|
||||
// Var szintaxis változótípus-definiálással
|
||||
var u uint = 7 // unsigned, az implementáció dönti el mekkora, akárcsak az
|
||||
// int-nél
|
||||
var pi float32 = 22. / 7
|
||||
|
||||
// Rövid deklarásnál átalakítás is lehetséges
|
||||
n := byte('\n') // byte típus, ami megegyezik az uint8-al
|
||||
|
||||
// A tömböknek fordítás-időben fixált méretük van
|
||||
var a4 [4]int // egy tömb 4 int-tel, mind 0-ra inicializálva
|
||||
a3 := [...]int{3, 1, 5} // egy tömb 3 int-tel, láthatóan inicalizálva egyedi
|
||||
// értékekre
|
||||
|
||||
// A "szeleteknek" (slices) dinamikus a méretük. A szeleteknek és a tömböknek is
|
||||
// megvannak az előnyeik de a szeleteket sokkal gyakrabban használjuk.
|
||||
s3 := []int{4, 5, 9} // vesd össze a3-mal, nincsenek pontok.
|
||||
s4 := make([]int, 4) // allokál 4 int-et, mind 0-ra inicializálva
|
||||
var d2 [][]float64 // ez csak deklaráció, semmi sincs még allokálva
|
||||
bs := []byte("a slice") // típus konverzió szintaxisa
|
||||
|
||||
p, q := learnMemory() // deklarál két mutatót (p,q), két int-re
|
||||
fmt.Println(*p, *q) // * követi a mutatót. Ez a sor kiírja a két int értékét.
|
||||
|
||||
// A map a dinamikusan növelhető asszociatív tömb része a nyelvnek, hasonlít
|
||||
// a hash és dictionary típusokra más nyelvekben.
|
||||
m := map[string]int{"three": 3, "four": 4}
|
||||
m["one"] = 1
|
||||
|
||||
// A felhasználatlan változók fordítás-idejű hibát okoznak a Go-ban.
|
||||
// Az aláhúzással "használod" a változókat, de eldobod az értéküket.
|
||||
_, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs
|
||||
// Kiíratás is természetesen használatnak minősül
|
||||
fmt.Println(s, c, a4, s3, d2, m)
|
||||
|
||||
learnFlowControl()
|
||||
}
|
||||
|
||||
// A Go nyelvben szemétgyűjtés (garbage collection) működik. Megtalálhatók benne
|
||||
// mutatók, de nincs pointeraritmetika. Ez azt jelenti, hogy üres (null) mutatóval még
|
||||
// mindig hibázhatsz, de hozzáadni/műveleteket végezni már nem lehet.
|
||||
func learnMemory() (p, q *int) {
|
||||
// Elnevezett visszatérési változóknak int-re mutató a típusa
|
||||
p = new(int) // a beépített "new" funkció, egy típusnak elegendő memóriát
|
||||
// allokál, és visszaad rá egy mutatót.
|
||||
// Az allokált int nullázva van, p többé nem üres mutató.
|
||||
s := make([]int, 20) // allokáljunk 20 int változót egy memóriaterületen.
|
||||
s[3] = 7 // adjunk értéket az egyiknek
|
||||
r := -2 // hozzánk létre egy lokális változót
|
||||
return &s[3], &r // A & megadja a memóriacímét a változónak
|
||||
}
|
||||
|
||||
func expensiveComputation() int {
|
||||
return 1e6
|
||||
}
|
||||
|
||||
func learnFlowControl() {
|
||||
// Az elágazásoknak kötelező a kapcsos zárójel, a zárójel nem szükséges.
|
||||
if true {
|
||||
fmt.Println("megmondtam")
|
||||
}
|
||||
// A kód formátumát a nyelvvel járó "go" parancssori program "go fmt"
|
||||
// parancsa szabványosítja
|
||||
if false {
|
||||
// így lehet
|
||||
} else {
|
||||
// if/else-t csinálni
|
||||
}
|
||||
// Használjunk switchet a hosszabb elágazások alkalmazása helyett.
|
||||
x := 1
|
||||
switch x {
|
||||
case 0:
|
||||
case 1:
|
||||
// Az "esetek" nem "esnek át", tehát
|
||||
case 2:
|
||||
// ez nem fog lefutni, nincs szükség break-ekre.
|
||||
}
|
||||
// A for ciklus sem használ zárójeleket
|
||||
for x := 0; x < 3; x++ {
|
||||
fmt.Println("iteráció", x)
|
||||
}
|
||||
// itt az x == 1.
|
||||
|
||||
// A for az egyetlen ciklus fajta a Go-ban, de több formája van.
|
||||
for { // végtelen ciklus
|
||||
break // csak vicceltem
|
||||
continue // soha nem fut le
|
||||
}
|
||||
|
||||
//Akárcsak a for-nál, az if-nél is lehet rövid deklarálással egy lokális változót létrehozni,
|
||||
//ami a blokk összes if/else szerkezetén keresztül érvényes marad.
|
||||
if y := expensiveComputation(); y > x {
|
||||
x = y
|
||||
}
|
||||
// Függvényeket használhatjuk closure-ként is.
|
||||
xBig := func() bool {
|
||||
return x > 100 // a switch felett deklarált x-et használjuk itt
|
||||
}
|
||||
fmt.Println("xBig:", xBig()) // igaz (utoljára 1e6 lett az értéke az x-nek)
|
||||
x /= 1e5 // így most már x == 10
|
||||
fmt.Println("xBig:", xBig()) // 10 pedig kisebb mint 100, tehát hamis
|
||||
|
||||
// Ha nagyon-nagyon szükséges, akkor használhatjuk a jó öreg goto-t.
|
||||
goto love
|
||||
love:
|
||||
|
||||
learnInterfaces() // Itt kezdődnek az érdekes dolgok!
|
||||
}
|
||||
|
||||
// Definiáljuk a Stringert egy olyan interfésznek, amelynek egy metódusa van, a
|
||||
// String, ami visszatér egy stringgel.
|
||||
type Stringer interface {
|
||||
String() string
|
||||
}
|
||||
|
||||
// Definiáljuk a pair-t egy olyan struktúrának amelynek két int változója van,
|
||||
// x és y.
|
||||
type pair struct {
|
||||
x, y int
|
||||
}
|
||||
|
||||
// Definiáljunk egy metódust a pair struktúrának, ezzel teljesítve a Stringer interfészt.
|
||||
func (p pair) String() string { // p lesz a "fogadó" (receiver)
|
||||
// Sprintf az fmt csomag egy publikus függvénye, műkődése megegyezik a C-s
|
||||
// megfelelőjével. A pontokkal érjük el a mindenkori p struktúra elemeit
|
||||
return fmt.Sprintf("(%d, %d)", p.x, p.y)
|
||||
}
|
||||
|
||||
func learnInterfaces() {
|
||||
// A kapcsos zárójellel jelezzük, hogy egyből inicializálni
|
||||
// szeretnénk a struktúra változóit a sorrendnek megfelelően.
|
||||
p := pair{3, 4}
|
||||
fmt.Println(p.String()) // meghívjuk a p String metódusát.
|
||||
var i Stringer // deklaráljuk i-t Stringer típusú interfésznek
|
||||
i = p // lehetséges, mert a pair struktúra eleget tesz a
|
||||
// Stringer interfésznek
|
||||
// Meghívjuk i String metódusát, az eredmény ugyanaz, mint az előbb.
|
||||
fmt.Println(i.String())
|
||||
|
||||
// Az fmt csomag függvényei automatikusan meghívják a String függvényt
|
||||
// hogy megtudják egy objektum szöveges reprezentációját.
|
||||
fmt.Println(p) // ugyan az az eredmény mint az előbb, a Println meghívja
|
||||
// a String metódust.
|
||||
fmt.Println(i) // dettó
|
||||
|
||||
learnErrorHandling()
|
||||
}
|
||||
|
||||
func learnErrorHandling() {
|
||||
// ", ok" szokásos megoldás arra, hogy jól működött-e a függvény.
|
||||
m := map[int]string{3: "three", 4: "four"}
|
||||
if x, ok := m[1]; !ok { // ok hamis lesz, mert az 1 nincs benne a map-ban.
|
||||
fmt.Println("nincs meg")
|
||||
} else {
|
||||
fmt.Print(x) // x lenne az érték, ha benne lenne a map-ban.
|
||||
}
|
||||
// A hiba érték többet is elmond a függvény kimeneteléről, mint hogy minden
|
||||
// "ok" volt-e
|
||||
if _, err := strconv.Atoi("non-int"); err != nil { // _ eldobja az értéket,
|
||||
// úgy se lesz jó jelen
|
||||
// esetben
|
||||
// kiírja, hogy "strconv.ParseInt: parsing "non-int": invalid syntax"
|
||||
fmt.Println(err)
|
||||
}
|
||||
// Az interfészekre még visszatérünk, addig is jöjjön a konkurens programozás!
|
||||
learnConcurrency()
|
||||
}
|
||||
|
||||
// c egy csatorna, egy konkurens-biztos kommunikációs objektum.
|
||||
func inc(i int, c chan int) {
|
||||
c <- i + 1 // <- a "küldés" operátor, ha a bal oldalán csatorna van, így
|
||||
// i+1-et küld be a csatornába
|
||||
}
|
||||
|
||||
// Az inc-et fogjuk arra használni, hogy konkurensen megnöveljünk számokat
|
||||
func learnConcurrency() {
|
||||
// Ugyanaz a make függvény, amivel korábban szeleteket hoztunk létre.
|
||||
// A make allokál map-eket, szeleteket és csatornákat.
|
||||
c := make(chan int)
|
||||
// Indítsunk három konkurens goroutine-t. A számok konkurensen lesznek
|
||||
// megnövelve, ha a számítógép képes rá és jól be van állítva, akkor pedig
|
||||
// paralellizálva/egymás mellett. Mind a 3 ugyanabba a csatornába küldi az
|
||||
// eredményeket.
|
||||
go inc(0, c) // A go utasítás indít el goroutine-okat.
|
||||
go inc(10, c)
|
||||
go inc(-805, c)
|
||||
// Beolvassuk 3x a csatornából az eredményeket és kiírjuk őket a kimenetre.
|
||||
// Nem lehet tudni milyen sorrendben fognak érkezni az eredmények!
|
||||
fmt.Println(<-c, <-c, <-c) // hogyha a jobb oldalon csatorna van, akkor a
|
||||
// "<-" a beolvasó/kapó operátor
|
||||
|
||||
cs := make(chan string) // még egy csatorna, ez stringekkel kommunikál
|
||||
cc := make(chan chan string) // egy csatorna csatornával
|
||||
go func() { c <- 84 }() // indítsunk egy új goroutine-t, csak azért
|
||||
// hogy küldjünk egy számot
|
||||
go func() { cs <- "wordy" }() // ugyanez, csak a cs csatornába stringet
|
||||
// küldünk
|
||||
// A select olyan mint a switch, csak feltételek helyett csatorna műveletek
|
||||
// vannak. Véletlenszerűen kiválasztja az első olyan esetet, ahol létrejöhet
|
||||
// kommunikáció.
|
||||
select {
|
||||
case i := <-c: // a megkapott értéket el lehet tárolni egy változóban
|
||||
fmt.Println("ez egy", i)
|
||||
case <-cs: // vagy el lehet dobni az értékét
|
||||
fmt.Println("ez egy string volt")
|
||||
case <-cc: // üres csatorna, soha nem fog rajta semmi se érkezni
|
||||
fmt.Println("sose futok le :'( ")
|
||||
}
|
||||
// Ezen a ponton vagy c vagy a cs goroutine-ja lefutott.
|
||||
// Amelyik hamarabb végzett, annak a megfelelő case-e lefutott, a másik
|
||||
// blokkolva vár.
|
||||
|
||||
learnWebProgramming() // a Go képes rá. Te is képes akarsz rá lenni.
|
||||
}
|
||||
|
||||
// Egy függvény a http csomagból elindít egy webszervert.
|
||||
func learnWebProgramming() {
|
||||
// A ListenAndServe első paramétre egy TCP port, amin kiszolgálunk majd.
|
||||
// Második paramétere egy interfész, pontosabban a http.Handler interfész.
|
||||
err := http.ListenAndServe(":8080", pair{})
|
||||
fmt.Println(err) // nem felejtjük el kiírni az esetleges hibákat!
|
||||
}
|
||||
|
||||
// Csináljunk a pair-ból egy http.Handler-t úgy, hogy implementáljuk az
|
||||
// egyetlen metódusát, a ServeHTTP-t.
|
||||
func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
// Minden kapcsolatra elküldjük ezt a http.ResponseWriter-rel
|
||||
w.Write([]byte("Megtanultad a Go-t Y perc alatt!"))
|
||||
}
|
||||
```
|
||||
|
||||
## További olvasmányok
|
||||
|
||||
Minden Go-val kapcsolatos megtaláható a [hivatalos Go weboldalon](https://go.dev/).
|
||||
Ott követhetsz egy tutorialt, játszhatsz a nyelvvel az interneten, és sok érdekességet olvashatsz.
|
||||
|
||||
A nyelv specifikációját kifejezetten érdemes olvasni, viszonylag rövid és sokat tanul belőle az ember.
|
||||
|
||||
Ha pedig jobban bele akarod vetni magad a Go-ba, akkor a legjobb praktikákat kilesheted a standard könyvtárból.
|
||||
TIPP: a dokumentációban kattints egy függvény nevére és rögtön megmutatja a hozzá tartozó kódot!
|
||||
|
||||
Ha pedig a nyelvnek egy bizonyos részéről szeretnél hasonló leírást találni, akkor a
|
||||
[gobyexample.com](https://gobyexample.com/)-on megtalálod, amit keresel.
|
812
hu/pythonlegacy.md
Normal file
812
hu/pythonlegacy.md
Normal file
@@ -0,0 +1,812 @@
|
||||
---
|
||||
language: Python 2 (legacy)
|
||||
contributors:
|
||||
- ["Louie Dinh", "http://ldinh.ca"]
|
||||
- ["Amin Bandali", "https://aminb.org"]
|
||||
- ["Andre Polykanine", "https://github.com/Oire"]
|
||||
- ["evuez", "http://github.com/evuez"]
|
||||
- ["asyne", "https://github.com/justblah"]
|
||||
- ["habi", "http://github.com/habi"]
|
||||
translators:
|
||||
- ["Tamás Diószegi", "https://github.com/ditam"]
|
||||
filename: learnpythonlegacy-hu.py
|
||||
lang: hu-hu
|
||||
---
|
||||
|
||||
A Python nyelvet Guido Van Rossum alkotta meg a 90-es évek elején. Manapság az
|
||||
egyik legnépszerűbb programozási nyelv. Én a tiszta szintaxisa miatt szerettem
|
||||
bele. Tulajdonképpen futtatható pszeudokód.
|
||||
|
||||
Figyelem: ez a leírás a Python 2.7 verziójára vonatkozik, illetve
|
||||
általánosságban a 2.x verziókra. A Python 2.7 azonban már csak 2020-ig lesz
|
||||
támogatva, ezért kezdőknek ajánlott, hogy a Python 3-mal kezdjék az
|
||||
ismerkedést. A Python 3.x verzióihoz a [Python 3 bemutató](http://learnxinyminutes.com/docs/python/)
|
||||
ajánlott.
|
||||
|
||||
Lehetséges olyan Python kódot írni, ami egyszerre kompatibilis a 2.7 és a 3.x
|
||||
verziókkal is, a Python [`__future__` imports](https://docs.python.org/2/library/__future__.html) használatával.
|
||||
A `__future__` import használata esetén Python 3-ban írhatod a kódot, ami
|
||||
Python 2 alatt is futni fog, így ismét a fenti Python 3 bemutató ajánlott.
|
||||
|
||||
```python
|
||||
# Az egysoros kommentek kettőskereszttel kezdődnek
|
||||
|
||||
""" Többsoros stringeket három darab " közé
|
||||
fogva lehet írni, ezeket gyakran használják
|
||||
több soros kommentként.
|
||||
"""
|
||||
|
||||
####################################################
|
||||
# 1. Egyszerű adattípusok és operátorok
|
||||
####################################################
|
||||
|
||||
# Használhatsz számokat
|
||||
3 # => 3
|
||||
|
||||
# Az alapműveletek meglepetésektől mentesek
|
||||
1 + 1 # => 2
|
||||
8 - 1 # => 7
|
||||
10 * 2 # => 20
|
||||
35 / 5 # => 7
|
||||
|
||||
# Az osztás kicsit trükkös. Egész osztást végez, és a hányados alsó egész része
|
||||
# lesz az eredmény
|
||||
5 / 2 # => 2
|
||||
|
||||
# Az osztás kijavításához a (lebegőpontos) float típust kell használnunk
|
||||
2.0 # Ez egy float
|
||||
11.0 / 4.0 # => 2.75 áh... máris jobb
|
||||
|
||||
# Az egész osztás a negatív számok esetén is az alsó egész részt eredményezi
|
||||
5 // 3 # => 1
|
||||
5.0 // 3.0 # => 1.0 # floatok esetén is
|
||||
-5 // 3 # => -2
|
||||
-5.0 // 3.0 # => -2.0
|
||||
|
||||
# Ha importáljuk a division modult (ld. 6. Modulok rész),
|
||||
# akkor a '/' jellel pontos osztást tudunk végezni.
|
||||
from __future__ import division
|
||||
|
||||
11 / 4 # => 2.75 ...sima osztás
|
||||
11 // 4 # => 2 ...egész osztás
|
||||
|
||||
# Modulo művelet
|
||||
7 % 3 # => 1
|
||||
|
||||
# Hatványozás (x az y. hatványra)
|
||||
2 ** 4 # => 16
|
||||
|
||||
# A precedencia zárójelekkel befolyásolható
|
||||
(1 + 3) * 2 # => 8
|
||||
|
||||
# Logikai operátorok
|
||||
# Megjegyzés: az "and" és "or" csak kisbetűkkel helyes
|
||||
True and False # => False
|
||||
False or True # => True
|
||||
|
||||
# A logikai operátorok egészeken is használhatóak
|
||||
0 and 2 # => 0
|
||||
-5 or 0 # => -5
|
||||
0 == False # => True
|
||||
2 == True # => False
|
||||
1 == True # => True
|
||||
|
||||
# Negálni a not kulcsszóval lehet
|
||||
not True # => False
|
||||
not False # => True
|
||||
|
||||
# Egyenlőségvizsgálat ==
|
||||
1 == 1 # => True
|
||||
2 == 1 # => False
|
||||
|
||||
# Egyenlőtlenség !=
|
||||
1 != 1 # => False
|
||||
2 != 1 # => True
|
||||
|
||||
# További összehasonlítások
|
||||
1 < 10 # => True
|
||||
1 > 10 # => False
|
||||
2 <= 2 # => True
|
||||
2 >= 2 # => True
|
||||
|
||||
# Az összehasonlítások láncolhatóak!
|
||||
1 < 2 < 3 # => True
|
||||
2 < 3 < 2 # => False
|
||||
|
||||
# Stringeket " vagy ' jelek közt lehet megadni
|
||||
"Ez egy string."
|
||||
'Ez egy másik string.'
|
||||
|
||||
# A stringek összeadhatóak!
|
||||
"Hello " + "world!" # => "Hello world!"
|
||||
# '+' jel nélkül is összeadhatóak
|
||||
"Hello " "world!" # => "Hello world!"
|
||||
|
||||
# ... illetve szorozhatóak
|
||||
"Hello" * 3 # => "HelloHelloHello"
|
||||
|
||||
# Kezelhető karakterek indexelhető listájaként
|
||||
"This is a string"[0] # => 'T'
|
||||
|
||||
# A string hosszát a len függvény adja meg
|
||||
len("This is a string") # => 16
|
||||
|
||||
# String formázáshoz a % jel használható
|
||||
# A Python 3.1-gyel a % már deprecated jelölésű, és később eltávolításra fog
|
||||
# kerülni, de azért jó tudni, hogyan működik.
|
||||
x = 'alma'
|
||||
y = 'citrom'
|
||||
z = "A kosárban levő elemek: %s és %s" % (x, y)
|
||||
|
||||
# A string formázás újabb módja a format metódus használatával történik.
|
||||
# Jelenleg ez a javasolt megoldás.
|
||||
"{} egy {} szöveg".format("Ez", "helytartó")
|
||||
"A {0} pedig {1}".format("string", "formázható")
|
||||
# Ha nem akarsz számolgatni, nevesíthetőek a pozíciók.
|
||||
"{name} kedvence a {food}".format(name="Bob", food="lasagna")
|
||||
|
||||
# None egy objektum
|
||||
None # => None
|
||||
|
||||
# A None-nal való összehasonlításhoz ne használd a "==" jelet,
|
||||
# használd az "is" kulcsszót helyette
|
||||
"etc" is None # => False
|
||||
None is None # => True
|
||||
|
||||
# Az 'is' operátor objektum egyezést vizsgál.
|
||||
# Primitív típusok esetén ez nem túl hasznos,
|
||||
# objektumok esetén azonban annál inkább.
|
||||
|
||||
# Bármilyen objektum használható logikai kontextusban.
|
||||
# A következő értékek hamis-ra értékelődnek ki (ún. "falsey" értékek):
|
||||
# - None
|
||||
# - bármelyik szám típus 0 értéke (pl. 0, 0L, 0.0, 0j)
|
||||
# - üres sorozatok (pl. '', (), [])
|
||||
# - üres konténerek (pl., {}, set())
|
||||
# - egyes felhasználó által definiált osztályok példányai bizonyos szabályok szerint,
|
||||
# ld: https://docs.python.org/2/reference/datamodel.html#object.__nonzero__
|
||||
#
|
||||
# Minden egyéb érték "truthy" (a bool() függvénynek átadva igazra értékelődnek ki)
|
||||
bool(0) # => False
|
||||
bool("") # => False
|
||||
|
||||
|
||||
####################################################
|
||||
# 2. Változók és kollekciók
|
||||
####################################################
|
||||
|
||||
# Létezik egy print utasítás
|
||||
print "I'm Python. Nice to meet you!" # => I'm Python. Nice to meet you!
|
||||
|
||||
# Így lehet egyszerűen bemenetet kérni a konzolról:
|
||||
input_string_var = raw_input(
|
||||
"Enter some data: ") # Visszatér a megadott stringgel
|
||||
input_var = input("Enter some data: ") # Kiértékeli a bemenetet python kódként
|
||||
# Vigyázat: a fentiek miatt az input() metódust körültekintően kell használni
|
||||
# Megjegyzés: Python 3-ban az input() már deprecated, és a raw_input() lett input()-ra átnevezve
|
||||
|
||||
# A változókat nem szükséges a használat előtt deklarálni
|
||||
some_var = 5 # Konvenció szerint a névben kisbetu_es_alulvonas
|
||||
some_var # => 5
|
||||
|
||||
# Érték nélküli változóra hivatkozás hibát dob.
|
||||
# Lásd a Control Flow szekciót a kivételkezelésről.
|
||||
some_other_var # name error hibát dob
|
||||
|
||||
# az if használható kifejezésként
|
||||
# a C nyelv '?:' ternáris operátorával egyenértékűen
|
||||
"yahoo!" if 3 > 2 else 2 # => "yahoo!"
|
||||
|
||||
# A listákban sorozatok tárolhatóak
|
||||
li = []
|
||||
# Már inicializáláskor megadhatóak elemek
|
||||
other_li = [4, 5, 6]
|
||||
|
||||
# A lista végére az append metódus rak új elemet
|
||||
li.append(1) # li jelenleg [1]
|
||||
li.append(2) # li jelenleg [1, 2]
|
||||
li.append(4) # li jelenleg [1, 2, 4]
|
||||
li.append(3) # li jelenleg [1, 2, 4, 3]
|
||||
# A végéről a pop metódus távolít el elemet
|
||||
li.pop() # => 3 és li jelenleg [1, 2, 4]
|
||||
# Rakjuk vissza
|
||||
li.append(3) # li jelenleg [1, 2, 4, 3], újra.
|
||||
|
||||
# A lista elemeket tömb indexeléssel lehet hivatkozni
|
||||
li[0] # => 1
|
||||
# A már inicializált értékekhez a = jellel lehet új értéket rendelni
|
||||
li[0] = 42
|
||||
li[0] # => 42
|
||||
li[0] = 1 # csak visszaállítjuk az eredeti értékére
|
||||
# Így is lehet az utolsó elemre hivatkozni
|
||||
li[-1] # => 3
|
||||
|
||||
# A túlindexelés eredménye IndexError
|
||||
li[4] # IndexError hibát dob
|
||||
|
||||
# A lista részeit a slice szintaxissal lehet kimetszeni
|
||||
# (Matekosoknak ez egy zárt/nyitott intervallum.)
|
||||
li[1:3] # => [2, 4]
|
||||
# A lista eleje kihagyható így
|
||||
li[2:] # => [4, 3]
|
||||
# Kihagyható a vége
|
||||
li[:3] # => [1, 2, 4]
|
||||
# Minden második elem kiválasztása
|
||||
li[::2] # =>[1, 4]
|
||||
# A lista egy másolata, fordított sorrendben
|
||||
li[::-1] # => [3, 4, 2, 1]
|
||||
# A fentiek kombinációival bonyolultabb slice parancsok is képezhetőek
|
||||
# li[start:end:step]
|
||||
|
||||
# Listaelemek a "del" paranccsal törölhetőek
|
||||
del li[2] # li jelenleg [1, 2, 3]
|
||||
|
||||
# A listák összeadhatóak
|
||||
li + other_li # => [1, 2, 3, 4, 5, 6]
|
||||
# Megjegyzés: az eredeti li és other_li értékei változatlanok
|
||||
|
||||
# Összefőzhetőek (konkatenálhatóak) az "extend()" paranccsal
|
||||
li.extend(other_li) # li jelenleg [1, 2, 3, 4, 5, 6]
|
||||
|
||||
# Egy elem első előfordulásának eltávolítása
|
||||
li.remove(2) # li jelenleg [1, 3, 4, 5, 6]
|
||||
li.remove(2) # ValueError hibát dob, mivel a 2 nem szerepel már a listában
|
||||
|
||||
# Elemek beszúrhatóak tetszőleges helyre
|
||||
li.insert(1, 2) # li jelenleg [1, 2, 3, 4, 5, 6], ismét
|
||||
|
||||
# Egy elem első előfordulási helye
|
||||
li.index(2) # => 1
|
||||
li.index(7) # ValueError hibát dob, mivel a 7 nem szerepel a listában
|
||||
|
||||
# Egy listában egy elem előfordulása az "in" szóval ellenőrizhető
|
||||
1 in li # => True
|
||||
|
||||
# A lista hossza a "len()" függvénnyel
|
||||
len(li) # => 6
|
||||
|
||||
# Az N-esek ("tuple") hasonlítanak a listákhoz, de nem módosíthatóak
|
||||
tup = (1, 2, 3)
|
||||
tup[0] # => 1
|
||||
tup[0] = 3 # TypeError hibát dob
|
||||
|
||||
# Az összes lista-műveletet ezeken is használható
|
||||
len(tup) # => 3
|
||||
tup + (4, 5, 6) # => (1, 2, 3, 4, 5, 6)
|
||||
tup[:2] # => (1, 2)
|
||||
2 in tup # => True
|
||||
|
||||
# Az N-esek (és listák) kicsomagolhatóak külön változókba
|
||||
a, b, c = (1, 2, 3) # az a így 1, a b 2 és a c pedig 3
|
||||
d, e, f = 4, 5, 6 # a zárójel elhagyható
|
||||
# Ha elhagyod a zárójeleket, alapértelmezés szerint tuple képződik
|
||||
g = 4, 5, 6 # => (4, 5, 6)
|
||||
# Nézd, milyen egyszerű két értéket megcserélni
|
||||
e, d = d, e # d most már 5 és az e 4
|
||||
|
||||
# A Dictionary típusokban hozzárendelések (kulcs-érték párok) tárolhatók
|
||||
empty_dict = {}
|
||||
# Ez pedig rögtön értékekkel van inicializálva
|
||||
filled_dict = {"one": 1, "two": 2, "three": 3}
|
||||
|
||||
# Egy dictionary értékei [] jelek közt indexelhetőek
|
||||
filled_dict["one"] # => 1
|
||||
|
||||
# A "keys()" metódus visszatér a kulcsok listájával
|
||||
filled_dict.keys() # => ["three", "two", "one"]
|
||||
# Megjegyzés: egy dictionary párjainak sorrendje nem garantált
|
||||
# Lehet, hogy már a fenti példán is más sorrendben kaptad meg az elemeket.
|
||||
|
||||
# Az értékek listája a "values()" metódussal kérhető le
|
||||
filled_dict.values() # => [3, 2, 1]
|
||||
# ld. a fenti megjegyzést az elemek sorrendjéről.
|
||||
|
||||
# Az összes kulcs-érték pár megkapható N-esek listájaként az "items()" metódussal
|
||||
filled_dict.items() # => [("one", 1), ("two", 2), ("three", 3)]
|
||||
|
||||
# Az "in" kulcssszóval ellenőrizhető, hogy egy kulcs szerepel-e a dictionary-ben
|
||||
"one" in filled_dict # => True
|
||||
1 in filled_dict # => False
|
||||
|
||||
# Nem létező kulcs hivatkozása KeyError hibát dob
|
||||
filled_dict["four"] # KeyError
|
||||
|
||||
# A "get()" metódus használatával elkerülhető a KeyError
|
||||
filled_dict.get("one") # => 1
|
||||
filled_dict.get("four") # => None
|
||||
# A metódusnak megadható egy alapértelmezett visszatérési érték is, hiányzó értékek esetén
|
||||
filled_dict.get("one", 4) # => 1
|
||||
filled_dict.get("four", 4) # => 4
|
||||
# Megjegyzés: ettől még filled_dict.get("four") => None
|
||||
# (vagyis a get nem állítja be az alapértelmezett értéket a dictionary-ben)
|
||||
|
||||
# A kulcsokhoz értékek a listákhoz hasonló szintaxissal rendelhetőek:
|
||||
filled_dict["four"] = 4 # ez után filled_dict["four"] => 4
|
||||
|
||||
# A "setdefault()" metódus csak akkor állít be egy értéket, ha az adott kulcshoz még nem volt más megadva
|
||||
filled_dict.setdefault("five", 5) # filled_dict["five"] beállítva 5-re
|
||||
filled_dict.setdefault("five", 6) # filled_dict["five"] még mindig 5
|
||||
|
||||
# Egy halmaz ("set") olyan, mint egy lista, de egy elemet csak egyszer tárolhat
|
||||
empty_set = set()
|
||||
# Inicializáljuk ezt a halmazt néhány elemmel
|
||||
some_set = set([1, 2, 2, 3, 4]) # some_set jelenleg set([1, 2, 3, 4])
|
||||
|
||||
# A sorrend itt sem garantált, még ha néha rendezettnek is tűnhet
|
||||
another_set = set([4, 3, 2, 2, 1]) # another_set jelenleg set([1, 2, 3, 4])
|
||||
|
||||
# Python 2.7 óta már {} jelek közt is lehet halmazt definiálni
|
||||
filled_set = {1, 2, 2, 3, 4} # => {1, 2, 3, 4}
|
||||
|
||||
# Új halmaz-elemek hozzáadása
|
||||
filled_set.add(5) # filled_set is now {1, 2, 3, 4, 5}
|
||||
|
||||
# Halmaz metszés a & operátorral
|
||||
other_set = {3, 4, 5, 6}
|
||||
filled_set & other_set # => {3, 4, 5}
|
||||
|
||||
# Halmaz unió | operátorral
|
||||
filled_set | other_set # => {1, 2, 3, 4, 5, 6}
|
||||
|
||||
# Halmaz különbség -
|
||||
{1, 2, 3, 4} - {2, 3, 5} # => {1, 4}
|
||||
|
||||
# Szimmetrikus differencia ^
|
||||
{1, 2, 3, 4} ^ {2, 3, 5} # => {1, 4, 5}
|
||||
|
||||
# Vizsgáljuk, hogy a bal oldali halmaz magában foglalja-e a jobb oldalit
|
||||
{1, 2} >= {1, 2, 3} # => False
|
||||
|
||||
# Vizsgáljuk, hogy a bal oldali halmaz részhalmaza-e a jobb oldalinak
|
||||
{1, 2} <= {1, 2, 3} # => True
|
||||
|
||||
# Halmazbeli elemek jelenléte az in kulcssszóval vizsgálható
|
||||
2 in filled_set # => True
|
||||
10 in filled_set # => False
|
||||
|
||||
|
||||
####################################################
|
||||
# 3. Control Flow
|
||||
####################################################
|
||||
|
||||
# Legyen egy változónk
|
||||
some_var = 5
|
||||
|
||||
# Ez egy if elágazás. A behúzás mértéke (az indentáció) jelentéssel bír a nyelvben!
|
||||
# Ez a kód ezt fogja kiírni: "some_var kisebb 10-nél"
|
||||
if some_var > 10:
|
||||
print "some_var nagyobb, mint 10."
|
||||
elif some_var < 10: # Az elif kifejezés nem kötelező az if szerkezetben.
|
||||
print "some_var kisebb 10-nél"
|
||||
else: # Ez sem kötelező.
|
||||
print "some_var kereken 10."
|
||||
|
||||
"""
|
||||
For ciklusokkal végigiterálhatunk listákon
|
||||
a kimenet:
|
||||
A(z) kutya emlős
|
||||
A(z) macska emlős
|
||||
A(z) egér emlős
|
||||
"""
|
||||
for animal in ["kutya", "macska", "egér"]:
|
||||
# A {0} kifejezéssel formázzuk a stringet, ld. korábban.
|
||||
print "A(z) {0} emlős".format(animal)
|
||||
|
||||
"""
|
||||
"range(number)" visszatér számok listájával 0-től number-ig
|
||||
a kimenet:
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
"""
|
||||
for i in range(4):
|
||||
print i
|
||||
|
||||
"""
|
||||
"range(lower, upper)" visszatér a lower és upper közti számok listájával
|
||||
a kimenet:
|
||||
4
|
||||
5
|
||||
6
|
||||
7
|
||||
"""
|
||||
for i in range(4, 8):
|
||||
print i
|
||||
|
||||
"""
|
||||
A while ciklus a feltétel hamissá válásáig fut.
|
||||
a kimenet:
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
"""
|
||||
x = 0
|
||||
while x < 4:
|
||||
print x
|
||||
x += 1 # Rövidítés az x = x + 1 kifejezésre
|
||||
|
||||
# A kivételek try/except blokkokkal kezelhetőek
|
||||
|
||||
# Python 2.6-tól felfele:
|
||||
try:
|
||||
# A "raise" szóval lehet hibát dobni
|
||||
raise IndexError("Ez egy index error")
|
||||
except IndexError as e:
|
||||
pass # A pass egy üres helytartó művelet. Itt hívnánk a hibakezelő kódunkat.
|
||||
except (TypeError, NameError):
|
||||
pass # Ha szükséges, egyszerre több hiba típus is kezelhető
|
||||
else: # Az except blokk után opcionálisan megadható
|
||||
print "Minden rendben!" # Csak akkor fut le, ha fentebb nem voltak hibák
|
||||
finally: # Mindenképpen lefut
|
||||
print "Itt felszabadíthatjuk az erőforrásokat például"
|
||||
|
||||
# Az erőforrások felszabadításához try/finally helyett a with használható
|
||||
with open("myfile.txt") as f:
|
||||
for line in f:
|
||||
print line
|
||||
|
||||
|
||||
####################################################
|
||||
# 4. Függvények
|
||||
####################################################
|
||||
|
||||
# A "def" szóval hozhatunk létre új függvényt
|
||||
def add(x, y):
|
||||
print "x is {0} and y is {1}".format(x, y)
|
||||
return x + y # A return szóval tudunk értékeket visszaadni
|
||||
|
||||
|
||||
# Így hívunk függvényt paraméterekkel
|
||||
add(5, 6) # => a konzol kimenet "x is 5 and y is 6", a visszatérési érték 11
|
||||
|
||||
# Nevesített paraméterekkel (ún. "keyword arguments") is hívhatunk egy függvényt
|
||||
add(y=6, x=5) # Ez esetben a sorrendjük nem számít
|
||||
|
||||
|
||||
# Változó számú paramétert fogadó függvény így definiálható.
|
||||
# A * használatával a paramétereket egy N-esként kapjuk meg.
|
||||
def varargs(*args):
|
||||
return args
|
||||
|
||||
|
||||
varargs(1, 2, 3) # => (1, 2, 3)
|
||||
|
||||
|
||||
# Változó számú nevesített paramétert fogadó függvény is megadható,
|
||||
# a ** használatával a paramétereket egy dictionary-ként kapjuk meg
|
||||
def keyword_args(**kwargs):
|
||||
return kwargs
|
||||
|
||||
|
||||
# Nézzük meg, mi történik
|
||||
keyword_args(big="foot", loch="ness") # => {"big": "foot", "loch": "ness"}
|
||||
|
||||
|
||||
# A két módszer egyszerre is használható
|
||||
def all_the_args(*args, **kwargs):
|
||||
print args
|
||||
print kwargs
|
||||
|
||||
|
||||
"""
|
||||
all_the_args(1, 2, a=3, b=4) kimenete:
|
||||
(1, 2)
|
||||
{"a": 3, "b": 4}
|
||||
"""
|
||||
|
||||
# Függvények hívásakor a fenti args és kwargs módszerek inverze használható
|
||||
# A * karakter kifejt egy listát külön paraméterekbe, a ** egy dictionary-t nevesített paraméterekbe.
|
||||
args = (1, 2, 3, 4)
|
||||
kwargs = {"a": 3, "b": 4}
|
||||
all_the_args(*args) # egyenértékű: foo(1, 2, 3, 4)
|
||||
all_the_args(**kwargs) # egyenértékű: foo(a=3, b=4)
|
||||
all_the_args(*args, **kwargs) # egyenértékű: foo(1, 2, 3, 4, a=3, b=4)
|
||||
|
||||
|
||||
# A fenti arg és kwarg paraméterek továbbadhatóak egyéb függvényeknek,
|
||||
# a * illetve ** operátorokkal kifejtve
|
||||
def pass_all_the_args(*args, **kwargs):
|
||||
all_the_args(*args, **kwargs)
|
||||
print varargs(*args)
|
||||
print keyword_args(**kwargs)
|
||||
|
||||
|
||||
# Függvény scope
|
||||
x = 5
|
||||
|
||||
|
||||
def set_x(num):
|
||||
# A lokális x változó nem ugyanaz, mint a globális x
|
||||
x = num # => 43
|
||||
print x # => 43
|
||||
|
||||
|
||||
def set_global_x(num):
|
||||
global x
|
||||
print x # => 5
|
||||
x = num # a globális x-et 6-ra állítjuk
|
||||
print x # => 6
|
||||
|
||||
|
||||
set_x(43)
|
||||
set_global_x(6)
|
||||
|
||||
|
||||
# A pythonban a függvény elsőrendű (ún. "first class") típus
|
||||
def create_adder(x):
|
||||
def adder(y):
|
||||
return x + y
|
||||
|
||||
return adder
|
||||
|
||||
|
||||
add_10 = create_adder(10)
|
||||
add_10(3) # => 13
|
||||
|
||||
# Névtelen függvények is definiálhatóak
|
||||
(lambda x: x > 2)(3) # => True
|
||||
(lambda x, y: x ** 2 + y ** 2)(2, 1) # => 5
|
||||
|
||||
# Léteznek beépített magasabb rendű függvények
|
||||
map(add_10, [1, 2, 3]) # => [11, 12, 13]
|
||||
map(max, [1, 2, 3], [4, 2, 1]) # => [4, 2, 3]
|
||||
|
||||
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) # => [6, 7]
|
||||
|
||||
# A listaképző kifejezések ("list comprehensions") jól használhatóak a map és filter függvényekkel
|
||||
[add_10(i) for i in [1, 2, 3]] # => [11, 12, 13]
|
||||
[x for x in [3, 4, 5, 6, 7] if x > 5] # => [6, 7]
|
||||
|
||||
# halmaz és dictionary képzők is léteznek
|
||||
{x for x in 'abcddeef' if x in 'abc'} # => {'a', 'b', 'c'}
|
||||
{x: x ** 2 for x in range(5)} # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
|
||||
|
||||
|
||||
####################################################
|
||||
# 5. Osztályok
|
||||
####################################################
|
||||
|
||||
# Az object osztály egy alosztályát képezzük
|
||||
class Human(object):
|
||||
# Osztály szintű mező: az osztály összes példányában azonos
|
||||
species = "H. sapiens"
|
||||
|
||||
# Ez a függvény meghívódik az osztály példányosításakor.
|
||||
# Megjegyzés: a dupla aláhúzás a név előtt és után egy konvenció a python
|
||||
# előre definiált, a nyelv által belsőleg használt, de a felhasználó által
|
||||
# is látható objektumok és mezők neveire.
|
||||
# Ne vezessünk be új, ilyen elnevezési sémát használó neveket!
|
||||
def __init__(self, name):
|
||||
# A paramétert értékül adjuk a példány name attribútumának
|
||||
self.name = name
|
||||
|
||||
# Inicializálunk egy mezőt
|
||||
self.age = 0
|
||||
|
||||
# Példány metódus. Minden metódus első paramétere a "self", a példány maga
|
||||
def say(self, msg):
|
||||
return "{0}: {1}".format(self.name, msg)
|
||||
|
||||
# Egy osztálymetódus az osztály összes példány közt meg van osztva.
|
||||
# Hívásukkor az első paraméter mindig a hívó osztály.
|
||||
@classmethod
|
||||
def get_species(cls):
|
||||
return cls.species
|
||||
|
||||
# Egy statikus metódus osztály és példányreferencia nélkül hívódik
|
||||
@staticmethod
|
||||
def grunt():
|
||||
return "*grunt*"
|
||||
|
||||
# Egy property jelölésű függvény olyan, mint egy getter.
|
||||
# Használatával az age mező egy csak-olvasható attribútummá válik.
|
||||
@property
|
||||
def age(self):
|
||||
return self._age
|
||||
|
||||
# Így lehet settert megadni egy mezőhöz
|
||||
@age.setter
|
||||
def age(self, age):
|
||||
self._age = age
|
||||
|
||||
# Így lehet egy mező törlését engedélyezni
|
||||
@age.deleter
|
||||
def age(self):
|
||||
del self._age
|
||||
|
||||
|
||||
# Példányosítsuk az osztályt
|
||||
i = Human(name="Ian")
|
||||
print i.say("hi") # kimenet: "Ian: hi"
|
||||
|
||||
j = Human("Joel")
|
||||
print j.say("hello") # kimenet: "Joel: hello"
|
||||
|
||||
# Hívjuk az osztály metódusunkat
|
||||
i.get_species() # => "H. sapiens"
|
||||
|
||||
# Változtassuk meg az osztály szintű attribútumot
|
||||
Human.species = "H. neanderthalensis"
|
||||
i.get_species() # => "H. neanderthalensis"
|
||||
j.get_species() # => "H. neanderthalensis"
|
||||
|
||||
# Hívjuk meg a statikus metódust
|
||||
Human.grunt() # => "*grunt*"
|
||||
|
||||
# Adjunk új értéket a mezőnek
|
||||
i.age = 42
|
||||
|
||||
# Kérjük le a mező értékét
|
||||
i.age # => 42
|
||||
|
||||
# Töröljük a mezőt
|
||||
del i.age
|
||||
i.age # => AttributeError hibát dob
|
||||
|
||||
####################################################
|
||||
# 6. Modulok
|
||||
####################################################
|
||||
|
||||
# Modulokat így lehet importálni
|
||||
import math
|
||||
|
||||
print math.sqrt(16) # => 4.0
|
||||
|
||||
# Lehetséges csak bizonyos függvényeket importálni egy modulból
|
||||
from math import ceil, floor
|
||||
|
||||
print ceil(3.7) # => 4.0
|
||||
print floor(3.7) # => 3.0
|
||||
|
||||
# Egy modul összes függvénye is importálható
|
||||
# Vigyázat: ez nem ajánlott.
|
||||
from math import *
|
||||
|
||||
# A modulok nevei lerövidíthetőek
|
||||
import math as m
|
||||
|
||||
math.sqrt(16) == m.sqrt(16) # => True
|
||||
# Meggyőződhetünk róla, hogy a függvények valóban azonosak
|
||||
from math import sqrt
|
||||
|
||||
math.sqrt == m.sqrt == sqrt # => True
|
||||
|
||||
# A Python modulok egyszerű fájlok.
|
||||
# Írhatsz sajátot és importálhatod is.
|
||||
# A modul neve azonos a tartalmazó fájl nevével.
|
||||
|
||||
# Így lehet megtekinteni, milyen mezőket és függvényeket definiál egy modul.
|
||||
import math
|
||||
|
||||
dir(math)
|
||||
|
||||
|
||||
# Ha van egy math.py nevű Python scripted a jelenleg futó scripttel azonos
|
||||
# mappában, a math.py fájl lesz betöltve a beépített Python modul helyett.
|
||||
# A lokális mappa prioritást élvez a beépített könyvtárak felett.
|
||||
|
||||
|
||||
####################################################
|
||||
# 7. Haladóknak
|
||||
####################################################
|
||||
|
||||
# Generátorok
|
||||
# Egy generátor értékeket "generál" amikor kérik, a helyett, hogy előre eltárolná őket.
|
||||
|
||||
# A következő metódus (ez még NEM egy generátor) megduplázza a kapott iterable elemeit,
|
||||
# és eltárolja őket. Nagy méretű iterable esetén ez nagyon sok helyet foglalhat!
|
||||
def double_numbers(iterable):
|
||||
double_arr = []
|
||||
for i in iterable:
|
||||
double_arr.append(i + i)
|
||||
return double_arr
|
||||
|
||||
|
||||
# A következő kód futtatásakor az összes szám kétszeresét kiszámítanánk, és visszaadnánk
|
||||
# ezt a nagy listát a ciklus vezérléséhez.
|
||||
for value in double_numbers(range(1000000)): # `test_non_generator`
|
||||
print value
|
||||
if value > 5:
|
||||
break
|
||||
|
||||
|
||||
# Használjunk inkább egy generátort, ami "legenerálja" a soron következő elemet,
|
||||
# amikor azt kérik tőle
|
||||
def double_numbers_generator(iterable):
|
||||
for i in iterable:
|
||||
yield i + i
|
||||
|
||||
|
||||
# A lenti kód mindig csak a soron következő számot generálja a logikai vizsgálat előtt.
|
||||
# Így amikor az érték eléri a > 5 határt, megszakítjuk a ciklust, és a lista számainak
|
||||
# nagy részénél megspóroltuk a duplázás műveletet (ez sokkal gyorsabb így!).
|
||||
for value in double_numbers_generator(xrange(1000000)): # `test_generator`
|
||||
print value
|
||||
if value > 5:
|
||||
break
|
||||
|
||||
# Feltűnt, hogy a `test_non_generator` esetén `range`, a `test_generator` esetén
|
||||
# pedig `xrange` volt a segédfüggvény neve? Ahogy `double_numbers_generator` a
|
||||
# generátor változata a `double_numbers` függvénynek, úgy az `xrange` a `range`
|
||||
# generátor megfelelője, csak akkor generálja le a következő számot, amikor kérjük
|
||||
# - esetünkben a ciklus következő iterációjakor
|
||||
|
||||
# A lista képzéshez hasonlóan generátor képzőket is használhatunk
|
||||
# ("generator comprehensions").
|
||||
values = (-x for x in [1, 2, 3, 4, 5])
|
||||
for x in values:
|
||||
print(x) # kimenet: -1 -2 -3 -4 -5
|
||||
|
||||
# Egy generátor összes generált elemét listaként is elkérhetjük:
|
||||
values = (-x for x in [1, 2, 3, 4, 5])
|
||||
gen_to_list = list(values)
|
||||
print(gen_to_list) # => [-1, -2, -3, -4, -5]
|
||||
|
||||
# Dekorátorok
|
||||
# A dekorátor egy magasabb rendű függvény, aminek bemenete és kimenete is egy függvény.
|
||||
# A lenti egyszerű példában az add_apples dekorátor a dekorált get_fruits függvény
|
||||
# kimenetébe beszúrja az 'Apple' elemet.
|
||||
def add_apples(func):
|
||||
def get_fruits():
|
||||
fruits = func()
|
||||
fruits.append('Apple')
|
||||
return fruits
|
||||
return get_fruits
|
||||
|
||||
@add_apples
|
||||
def get_fruits():
|
||||
return ['Banana', 'Mango', 'Orange']
|
||||
|
||||
# A kimenet tartalmazza az 'Apple' elemet:
|
||||
# Banana, Mango, Orange, Apple
|
||||
print ', '.join(get_fruits())
|
||||
|
||||
# Ebben a példában a beg dekorátorral látjuk el a say függvényt.
|
||||
# Beg meghívja say-t. Ha a say_please paraméter igaz, akkor
|
||||
# megváltoztatja az eredmény mondatot.
|
||||
from functools import wraps
|
||||
|
||||
|
||||
def beg(target_function):
|
||||
@wraps(target_function)
|
||||
def wrapper(*args, **kwargs):
|
||||
msg, say_please = target_function(*args, **kwargs)
|
||||
if say_please:
|
||||
return "{} {}".format(msg, "Please! I am poor :(")
|
||||
return msg
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
@beg
|
||||
def say(say_please=False):
|
||||
msg = "Can you buy me a beer?"
|
||||
return msg, say_please
|
||||
|
||||
|
||||
print say() # Can you buy me a beer?
|
||||
print say(say_please=True) # Can you buy me a beer? Please! I am poor :(
|
||||
```
|
||||
|
||||
## Még több érdekel?
|
||||
|
||||
### Ingyenes online tartalmak
|
||||
|
||||
* [Automate the Boring Stuff with Python](https://automatetheboringstuff.com)
|
||||
* [Learn Python The Hard Way](http://learnpythonthehardway.org/book/)
|
||||
* [Dive Into Python](http://www.diveintopython.net/)
|
||||
* [The Official Docs](http://docs.python.org/2/)
|
||||
* [Hitchhiker's Guide to Python](http://docs.python-guide.org/en/latest/)
|
||||
* [Python Module of the Week](http://pymotw.com/2/)
|
||||
* [A Crash Course in Python for Scientists](http://nbviewer.ipython.org/5920182)
|
||||
* [First Steps With Python](https://realpython.com/learn/python-first-steps/)
|
||||
* [LearnPython](http://www.learnpython.org/)
|
||||
* [Fullstack Python](https://www.fullstackpython.com/)
|
||||
|
||||
### Könyvek
|
||||
|
||||
* [Programming Python](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20)
|
||||
* [Dive Into Python](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20)
|
||||
* [Python Essential Reference](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20)
|
554
hu/ruby.md
Normal file
554
hu/ruby.md
Normal file
@@ -0,0 +1,554 @@
|
||||
---
|
||||
language: Ruby
|
||||
lang: hu-hu
|
||||
filename: learnruby-hu.rb
|
||||
contributors:
|
||||
- ["David Underwood", "http://theflyingdeveloper.com"]
|
||||
- ["Joel Walden", "http://joelwalden.net"]
|
||||
- ["Luke Holder", "http://twitter.com/lukeholder"]
|
||||
- ["Tristan Hume", "http://thume.ca/"]
|
||||
- ["Nick LaMuro", "https://github.com/NickLaMuro"]
|
||||
- ["Marcos Brizeno", "http://www.about.me/marcosbrizeno"]
|
||||
- ["Ariel Krakowski", "http://www.learneroo.com"]
|
||||
- ["Dzianis Dashkevich", "https://github.com/dskecse"]
|
||||
- ["Levi Bostian", "https://github.com/levibostian"]
|
||||
- ["Rahil Momin", "https://github.com/iamrahil"]
|
||||
translators:
|
||||
- ["Zsolt Prontvai", "https://github.com/prozsolt"]
|
||||
---
|
||||
|
||||
```ruby
|
||||
# Ez egy komment
|
||||
|
||||
=begin
|
||||
Ez egy többsoros komment
|
||||
Senki sem használja
|
||||
Neked sem kellene
|
||||
=end
|
||||
|
||||
# Először is: Minden objektum
|
||||
|
||||
# A számok objektumok
|
||||
|
||||
3.class #=> Fixnum
|
||||
|
||||
3.to_s #=> "3"
|
||||
|
||||
|
||||
# Néhány alapvető számtani művelet
|
||||
1 + 1 #=> 2
|
||||
8 - 1 #=> 7
|
||||
10 * 2 #=> 20
|
||||
35 / 5 #=> 7
|
||||
2**5 #=> 32
|
||||
|
||||
# A számtani művelet csak szintaktikus cukor
|
||||
# az objektumon történő függvény hívásra
|
||||
1.+(3) #=> 4
|
||||
10.* 5 #=> 50
|
||||
|
||||
# A speciális értékek objektumok
|
||||
nil # Nincs itt semmi látnivaló
|
||||
true # igaz
|
||||
false # hamis
|
||||
|
||||
nil.class #=> NilClass
|
||||
true.class #=> TrueClass
|
||||
false.class #=> FalseClass
|
||||
|
||||
# Egyenlőség
|
||||
1 == 1 #=> true
|
||||
2 == 1 #=> false
|
||||
|
||||
# Egyenlőtlenség
|
||||
1 != 1 #=> false
|
||||
2 != 1 #=> true
|
||||
|
||||
# A false-on kívül, nil az egyetlen hamis érték
|
||||
|
||||
!nil #=> true
|
||||
!false #=> true
|
||||
!0 #=> false
|
||||
|
||||
# Még több összehasonlítás
|
||||
1 < 10 #=> true
|
||||
1 > 10 #=> false
|
||||
2 <= 2 #=> true
|
||||
2 >= 2 #=> true
|
||||
|
||||
# Logikai operátorok
|
||||
true && false #=> false
|
||||
true || false #=> true
|
||||
!true #=> false
|
||||
|
||||
# A logikai operátoroknak alternatív verziójuk is van sokkal kisebb
|
||||
# precedenciával. Ezeket arra szánták, hogy több állítást összeláncoljanak
|
||||
# amíg egyikük igaz vagy hamis értékkel nem tér vissza.
|
||||
|
||||
# `csinalj_valami_mast` csak akkor fut le, ha `csinalj_valamit` igaz értékkel
|
||||
# tért vissza.
|
||||
csinalj_valamit() and csinalj_valami_mast()
|
||||
# `log_error` csak akkor fut le, ha `csinalj_valamit` hamis értékkel
|
||||
# tért vissza.
|
||||
csinalj_valamit() or log_error()
|
||||
|
||||
|
||||
# A sztringek objektumok
|
||||
|
||||
'Én egy sztring vagyok'.class #=> String
|
||||
"Én is egy sztring vagyok".class #=> String
|
||||
|
||||
helykitolto = 'interpolációt használhatok'
|
||||
"Sztring #{helykitolto}, ha dupla időzőjelben van a sztringem"
|
||||
#=> "Sztring interpolációt használhatok, ha dupla időzőjelben van a sztringem"
|
||||
|
||||
# A szimpla idézőjelet preferáljuk, ahol csak lehet,
|
||||
# mert a dupla idézőjel extra számításokat végez.
|
||||
|
||||
# Kombinálhatunk sztringeket, de nem számokkal
|
||||
'hello ' + 'world' #=> "hello world"
|
||||
'hello ' + 3 #=> TypeError: can't convert Fixnum into String
|
||||
'hello ' + 3.to_s #=> "hello 3"
|
||||
|
||||
# kiírás a kimenetre
|
||||
puts "Írok"
|
||||
|
||||
# Változók
|
||||
x = 25 #=> 25
|
||||
x #=> 25
|
||||
|
||||
# Értékadás az adott értékkel tér vissza
|
||||
# Ez azt jelenti, hogy használhatunk többszörös értékadást:
|
||||
|
||||
x = y = 10 #=> 10
|
||||
x #=> 10
|
||||
y #=> 10
|
||||
|
||||
# Konvencióból, snake_case változó neveket használj
|
||||
snake_case = true
|
||||
|
||||
# Leíró változó neveket használj
|
||||
ut_a_projekt_gyokerehez = '/jo/nev/'
|
||||
ut = '/rossz/nev/'
|
||||
|
||||
# A szimbólumok (objektumok)
|
||||
# A szimbólumok megváltoztathatatlan, újra felhasználható konstans,
|
||||
# mely belsőleg egész számként reprezentált. Sokszor sztring helyett használják,
|
||||
# hogy effektíven közvetítsünk konkrét, értelmes értékeket
|
||||
|
||||
:fuggoben.class #=> Symbol
|
||||
|
||||
statusz = :fuggoben
|
||||
|
||||
statusz == :fuggoben #=> true
|
||||
|
||||
statusz == 'fuggoben' #=> false
|
||||
|
||||
statusz == :jovahagyott #=> false
|
||||
|
||||
# Tömbök
|
||||
|
||||
# Ez egy tömb
|
||||
tomb = [1, 2, 3, 4, 5] #=> [1, 2, 3, 4, 5]
|
||||
|
||||
# A tömmbök különböző tipusú dolgokat tartalmazhat
|
||||
|
||||
[1, 'hello', false] #=> [1, "hello", false]
|
||||
|
||||
# Tömbök indexelhetőek
|
||||
# Az elejéről
|
||||
tomb[0] #=> 1
|
||||
tomb[12] #=> nil
|
||||
|
||||
# Akárcsak a számtani műveletek [var] hozzáférés
|
||||
# is csak szintaktikus cukor
|
||||
# a [] függvény hívására az objektumon
|
||||
tomb.[] 0 #=> 1
|
||||
tomb.[] 12 #=> nil
|
||||
|
||||
# A végéről
|
||||
tomb[-1] #=> 5
|
||||
|
||||
# Kezdőértékkel és hosszal
|
||||
tomb[2, 3] #=> [3, 4, 5]
|
||||
|
||||
# Tömb megfordítása
|
||||
a=[1,2,3]
|
||||
a.reverse! #=> [3,2,1]
|
||||
|
||||
# Vagy tartománnyal
|
||||
tomb[1..3] #=> [2, 3, 4]
|
||||
|
||||
# Így adhatunk a tömbhöz
|
||||
tomb << 6 #=> [1, 2, 3, 4, 5, 6]
|
||||
# Vagy így
|
||||
tomb.push(6) #=> [1, 2, 3, 4, 5, 6]
|
||||
|
||||
# Ellenőrízük, hogy a tömb tartalmaz egy elemet
|
||||
tomb.include?(1) #=> true
|
||||
|
||||
# Hash-ek a ruby elsődleges szótárjai kulcs/érték párokkal
|
||||
# Hash-eket kapcsos zárójellel jelöljük
|
||||
hash = { 'szin' => 'zold', 'szam' => 5 }
|
||||
|
||||
hash.keys #=> ['szin', 'szam']
|
||||
|
||||
# Hash-ekben könnyen kreshetünk a kulcs segítségével:
|
||||
hash['szin'] #=> 'zold'
|
||||
hash['szam'] #=> 5
|
||||
|
||||
# Nem létező kulcsra keresve nil-t kapunk:
|
||||
hash['nincs itt semmi'] #=> nil
|
||||
|
||||
# Ruby 1.9-től, egy külnleges szintaxist is használhatunk a szimbólumot
|
||||
# használunk kulcsnak
|
||||
|
||||
uj_hash = { defcon: 3, action: true }
|
||||
|
||||
uj_hash.keys #=> [:defcon, :action]
|
||||
|
||||
# Ellenőrizzük, hogy az adott kulcs és érték bene-e van a hash-ben
|
||||
uj_hash.has_key?(:defcon) #=> true
|
||||
uj_hash.has_value?(3) #=> true
|
||||
|
||||
# Tip: A tömbök és hash-ek is felsorolhatóak
|
||||
# Sok közös függvényük van, akár az each, map, count, és több
|
||||
|
||||
# Kontroll Struktúrák
|
||||
|
||||
if true
|
||||
'ha állítás'
|
||||
elsif false
|
||||
'különben ha, opcionális'
|
||||
else
|
||||
'különben, szintén opcionális'
|
||||
end
|
||||
|
||||
for szamlalo in 1..5
|
||||
puts "iteracio #{szamlalo}"
|
||||
end
|
||||
#=> iteracio 1
|
||||
#=> iteracio 2
|
||||
#=> iteracio 3
|
||||
#=> iteracio 4
|
||||
#=> iteracio 5
|
||||
|
||||
# HOWEVER, No-one uses for loops.
|
||||
# Instead you should use the "each" method and pass it a block.
|
||||
# A block is a bunch of code that you can pass to a method like "each".
|
||||
# It is analogous to lambdas, anonymous functions or closures in other
|
||||
# programming languages.
|
||||
#
|
||||
# The "each" method of a range runs the block once for each element of the range.
|
||||
# The block is passed a counter as a parameter.
|
||||
# Calling the "each" method with a block looks like this:
|
||||
|
||||
(1..5).each do |counter|
|
||||
puts "iteration #{counter}"
|
||||
end
|
||||
#=> iteration 1
|
||||
#=> iteration 2
|
||||
#=> iteration 3
|
||||
#=> iteration 4
|
||||
#=> iteration 5
|
||||
|
||||
# You can also surround blocks in curly brackets:
|
||||
(1..5).each { |counter| puts "iteration #{counter}" }
|
||||
|
||||
# The contents of data structures can also be iterated using each.
|
||||
array.each do |element|
|
||||
puts "#{element} is part of the array"
|
||||
end
|
||||
hash.each do |key, value|
|
||||
puts "#{key} is #{value}"
|
||||
end
|
||||
|
||||
counter = 1
|
||||
while counter <= 5 do
|
||||
puts "iteration #{counter}"
|
||||
counter += 1
|
||||
end
|
||||
#=> iteration 1
|
||||
#=> iteration 2
|
||||
#=> iteration 3
|
||||
#=> iteration 4
|
||||
#=> iteration 5
|
||||
|
||||
jegy = '4'
|
||||
|
||||
case jegy
|
||||
when '5'
|
||||
puts 'Kitünő'
|
||||
when '4'
|
||||
puts 'Jó'
|
||||
when '3'
|
||||
puts 'Közepes'
|
||||
when '2'
|
||||
puts 'Elégsége'
|
||||
when '1'
|
||||
puts 'Elégtelen'
|
||||
else
|
||||
puts 'Alternatív értékelés, hm?'
|
||||
end
|
||||
#=> "Jó"
|
||||
|
||||
# case-ek tartományokat is használhatnak
|
||||
jegy = 82
|
||||
case jegy
|
||||
when 90..100
|
||||
puts 'Hurrá!'
|
||||
when 80...90
|
||||
puts 'Jó munka'
|
||||
else
|
||||
puts 'Megbuktál!'
|
||||
end
|
||||
#=> "Jó munka"
|
||||
|
||||
# kivétel kezelés:
|
||||
begin
|
||||
# kód ami kivételt dobhat
|
||||
raise NoMemoryError, 'Megtelt a memória'
|
||||
rescue NoMemoryError => kivetel_valtozo
|
||||
puts 'NoMemoryError-t dobott', kivetel_valtozo
|
||||
rescue RuntimeError => mas_kivetel_valtozo
|
||||
puts 'RuntimeError dobott most'
|
||||
else
|
||||
puts 'Ez akkor fut ha nem dob kivételt'
|
||||
ensure
|
||||
puts 'Ez a kód mindenképpen lefut'
|
||||
end
|
||||
|
||||
# Függvények
|
||||
|
||||
def ketszeres(x)
|
||||
x * 2
|
||||
end
|
||||
|
||||
# Függvények (és egyébb blokkok) implicit viszatértnek az utolsó értékkel
|
||||
ketszeres(2) #=> 4
|
||||
|
||||
# Zárójelezés opcionális, ha az eredmény félreérthetetlen
|
||||
ketszeres 3 #=> 6
|
||||
|
||||
ketszeres ketszeres 3 #=> 12
|
||||
|
||||
def osszeg(x, y)
|
||||
x + y
|
||||
end
|
||||
|
||||
# Függvény argumentumait vesszővel választjuk el.
|
||||
osszeg 3, 4 #=> 7
|
||||
|
||||
osszeg osszeg(3, 4), 5 #=> 12
|
||||
|
||||
# yield
|
||||
# Minden függvénynek van egy implicit, opcionális block paramétere
|
||||
# 'yield' kulcsszóval hívhatjuk
|
||||
|
||||
def korulvesz
|
||||
puts '{'
|
||||
yield
|
||||
puts '}'
|
||||
end
|
||||
|
||||
korulvesz { puts 'hello world' }
|
||||
|
||||
# {
|
||||
# hello world
|
||||
# }
|
||||
|
||||
|
||||
# Fuggvénynek átadhatunk blokkot
|
||||
# "&" jelöli az átadott blokk referenciáját
|
||||
def vendegek(&block)
|
||||
block.call 'valami_argumentum'
|
||||
end
|
||||
|
||||
# Argumentum lisát is átadhatunk, ami tömbé lesz konvertálva
|
||||
# Erre való a splat operátor ("*")
|
||||
def vendegek(*array)
|
||||
array.each { |vendeg| puts vendeg }
|
||||
end
|
||||
|
||||
# Osztályt a class kulcsszóval definiálhatunk
|
||||
class Ember
|
||||
|
||||
# Az osztály változó. Az osztály minden példánnyával megvan osztva
|
||||
@@faj = 'H. sapiens'
|
||||
|
||||
# Alap inicializáló
|
||||
def initialize(nev, kor = 0)
|
||||
# Hozzárendeli az argumentumot a "nev" példány változóhoz
|
||||
@nev = nev
|
||||
# Ha nem adtunk meg kort akkor az alapértemezet értéket fogja használni
|
||||
@kor = kor
|
||||
end
|
||||
|
||||
# Alap setter függvény
|
||||
def nev=(nev)
|
||||
@nev = nev
|
||||
end
|
||||
|
||||
# Alap getter függvény
|
||||
def nev
|
||||
@nev
|
||||
end
|
||||
|
||||
# A fönti funkcionalítást az attr_accessor függvénnyel is elérhetjük
|
||||
attr_accessor :nev
|
||||
|
||||
# Getter/setter függvények egyenként is kreálhatóak
|
||||
attr_reader :nev
|
||||
attr_writer :nev
|
||||
|
||||
# Az osztály függvények "self"-et hasznalnak, hogy megkülönböztessék magukat a
|
||||
# példány függvényektől
|
||||
# Az osztályn hívhatóak, nem a példányon
|
||||
def self.mond(uzenet)
|
||||
puts uzenet
|
||||
end
|
||||
|
||||
def faj
|
||||
@@faj
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Példányosítsuk az osztályt
|
||||
jim = Ember.new('Jim Halpert')
|
||||
|
||||
dwight = Ember.new('Dwight K. Schrute')
|
||||
|
||||
# Hívjunk meg pár függvényt
|
||||
jim.faj #=> "H. sapiens"
|
||||
jim.nev #=> "Jim Halpert"
|
||||
jim.nev = "Jim Halpert II" #=> "Jim Halpert II"
|
||||
jim.nev #=> "Jim Halpert II"
|
||||
dwight.faj #=> "H. sapiens"
|
||||
dwight.nev #=> "Dwight K. Schrute"
|
||||
|
||||
# Hívjuk meg az osztály függvényt
|
||||
Ember.mond('Hi') #=> "Hi"
|
||||
|
||||
# Változók szókjait az elnevezésük definiálja
|
||||
# $ kezdetű változók globálisak
|
||||
$var = "Én egy globális változó vagyok"
|
||||
defined? $var #=> "global-variable"
|
||||
|
||||
# Változók amik @-al kezdődnek példány szkópjuk van
|
||||
@var = "Én egy példány változó vagyok"
|
||||
defined? @var #=> "instance-variable"
|
||||
|
||||
# Változók amik @@-al kezdődnek példány szkópjuk van
|
||||
@@var = "Én egy osztály változó vagyok"
|
||||
defined? @@var #=> "class variable"
|
||||
|
||||
# Változók amik nagy betűvel kezdődnek a konstansok
|
||||
Var = "Konstans vagyok"
|
||||
defined? Var #=> "constant"
|
||||
|
||||
# Az osztály is objetum. Tehát az osztálynak lehet példány változója
|
||||
# Az osztályváltozón osztozik minden pédány és leszármazott
|
||||
|
||||
# Ős osztály
|
||||
class Ember
|
||||
@@foo = 0
|
||||
|
||||
def self.foo
|
||||
@@foo
|
||||
end
|
||||
|
||||
def self.foo=(ertek)
|
||||
@@foo = ertek
|
||||
end
|
||||
end
|
||||
|
||||
# Leszarmazott osztály
|
||||
class Dolgozo < Ember
|
||||
end
|
||||
|
||||
Ember.foo # 0
|
||||
Dolgozo.foo # 0
|
||||
|
||||
Ember.foo = 2 # 2
|
||||
Dolgozo.foo # 2
|
||||
|
||||
# Az osztálynak példány változóját nem látja az osztály leszármazottja.
|
||||
|
||||
class Ember
|
||||
@bar = 0
|
||||
|
||||
def self.bar
|
||||
@bar
|
||||
end
|
||||
|
||||
def self.bar=(ertek)
|
||||
@bar = ertek
|
||||
end
|
||||
end
|
||||
|
||||
class Doctor < Ember
|
||||
end
|
||||
|
||||
Ember.bar # 0
|
||||
Doctor.bar # nil
|
||||
|
||||
module ModulePelda
|
||||
def foo
|
||||
'foo'
|
||||
end
|
||||
end
|
||||
|
||||
# Modulok include-olása a fügvényeiket az osztály példányaihoz köti.
|
||||
# Modulok extend-elésa a fügvényeiket magához az osztályhoz köti.
|
||||
|
||||
class Szemely
|
||||
include ModulePelda
|
||||
end
|
||||
|
||||
class Konyv
|
||||
extend ModulePelda
|
||||
end
|
||||
|
||||
Szemely.foo # => NoMethodError: undefined method `foo' for Szemely:Class
|
||||
Szemely.new.foo # => 'foo'
|
||||
Konyv.foo # => 'foo'
|
||||
Konyv.new.foo # => NoMethodError: undefined method `foo'
|
||||
|
||||
# Callback-ek végrehajtódnak amikor include-olunk és extend-elünk egy modult
|
||||
|
||||
module ConcernPelda
|
||||
def self.included(base)
|
||||
base.extend(ClassMethods)
|
||||
base.send(:include, InstanceMethods)
|
||||
end
|
||||
|
||||
module ClassMethods
|
||||
def bar
|
||||
'bar'
|
||||
end
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
def qux
|
||||
'qux'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Valami
|
||||
include ConcernPelda
|
||||
end
|
||||
|
||||
Valami.bar # => 'bar'
|
||||
Valami.qux # => NoMethodError: undefined method `qux'
|
||||
Valami.new.bar # => NoMethodError: undefined method `bar'
|
||||
Valami.new.qux # => 'qux'
|
||||
```
|
||||
|
||||
## Egyéb források
|
||||
|
||||
- [Official Documentation](http://www.ruby-doc.org/core-2.1.1/)
|
||||
- [Ruby from other languages](https://www.ruby-lang.org/en/documentation/ruby-from-other-languages/)
|
||||
- [Programming Ruby](http://www.amazon.com/Programming-Ruby-1-9-2-0-Programmers/dp/1937785491/) - A régebbi [ingyenes változat](http://ruby-doc.com/docs/ProgrammingRuby/) elérhető online.
|
||||
- [Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide)
|
172
hu/typescript.md
Normal file
172
hu/typescript.md
Normal file
@@ -0,0 +1,172 @@
|
||||
---
|
||||
language: TypeScript
|
||||
contributors:
|
||||
- ["Philippe Vlérick", "https://github.com/pvlerick"]
|
||||
translators:
|
||||
- ["Tamás Diószegi", "https://github.com/ditam"]
|
||||
filename: learntypescript-hu.ts
|
||||
lang: hu-hu
|
||||
---
|
||||
|
||||
A TypeScript nyelv a JavaScript nyelven írt nagy méretű alkalmazások fejlesztését kívánja megkönnyíteni.
|
||||
A TypeScript olyan, más nyelvekből ismert gyakori fogalmakat ad hozzá a JavaScripthez, mint például osztályok, interfészek, generikusság, és (opcionális) statikus típusosság.
|
||||
A JavaScript egy befoglaló halmazát képzi: minden JavaScript kód érvényes TypeScript kód, így könnyen hozzáadható meglévő projektekhez. A TypeScript fordító kimenetként JavaScript kódot állít elő.
|
||||
|
||||
Ez a dokumentum a TypeScript által hozzáadott új szintaxissal foglalkozik, nem pedig a [JavaScripttel](../javascript/).
|
||||
|
||||
Hogy kipróbáld a TypeScript fordítót, látogass el a [Játszótérre avagy Playground-ra](https://www.typescriptlang.org/Playground) ahol kódot írhatsz automatikus kódkiegészítéssel, és közvetlenül láthatod az előállított JavaScript kódot.
|
||||
|
||||
```ts
|
||||
// 3 alapvető típus létezik TypeScriptben
|
||||
var isDone: boolean = false;
|
||||
var lines: number = 42;
|
||||
var name: string = "Anders";
|
||||
|
||||
// Amikor nem lehet a típust előre tudni, használható az "Any" típus
|
||||
var notSure: any = 4;
|
||||
notSure = "talán mégis sztring lesz";
|
||||
notSure = false; // tévedtem, mégis boolean
|
||||
|
||||
// Kollekciókból létezik típusos és generikus tömb
|
||||
var list: number[] = [1, 2, 3];
|
||||
// ugyanez a generikus típus használatával
|
||||
var list: Array<number> = [1, 2, 3];
|
||||
|
||||
// Enumerált típusok:
|
||||
enum Color {Red, Green, Blue};
|
||||
var c: Color = Color.Green;
|
||||
|
||||
// Végül, "void" használható a visszatérési értékkel nem bíró függvényeknél
|
||||
function bigHorribleAlert(): void {
|
||||
alert("Kis idegesítő doboz vagyok!");
|
||||
}
|
||||
|
||||
// A függvények elsőrangú (first-class) típusok, használható a vastag nyilas
|
||||
// lambda szintaxis,
|
||||
// a compiler pedig kikövetkezteti a típusokat (inferred types)
|
||||
|
||||
// A következők egyenértékűek, ugyanaz a szignatúra kerül kikövetkeztetésre, és
|
||||
// így ugyanaz a JavaScript kód lesz előállítva
|
||||
var f1 = function(i: number): number { return i * i; }
|
||||
// Következtetett visszatérési értékkel
|
||||
var f2 = function(i: number) { return i * i; }
|
||||
var f3 = (i: number): number => { return i * i; }
|
||||
// Következtetett visszatérési értékkel
|
||||
var f4 = (i: number) => { return i * i; }
|
||||
// Következtetett visszatérési értékkel,
|
||||
// ebben az egysoros formában nem szükséges a return kulcsszó
|
||||
var f5 = (i: number) => i * i;
|
||||
|
||||
// Az interfészek szerkezeti alapon működnek, vagyis minden objektum, ahol
|
||||
// jelen vannak a megfelelő mezők kompatibilis az interfésszel
|
||||
interface Person {
|
||||
name: string;
|
||||
// Az opcionális tagokat "?" jelöli
|
||||
age?: number;
|
||||
// És persze függvények is:
|
||||
move(): void;
|
||||
}
|
||||
|
||||
// Egy objektum, ami megvalósítja a "Person" interfészt
|
||||
// Tekinthető Personnek, hiszen van name és move mezője
|
||||
var p: Person = { name: "Bobby", move: () => {} };
|
||||
// Egy objektum, ahol az opcionális mező is jelen van:
|
||||
var validPerson: Person = { name: "Bobby", age: 42, move: () => {} };
|
||||
// Ez viszont nem Person, mert az age mező típusa nem szám!
|
||||
var invalidPerson: Person = { name: "Bobby", age: true };
|
||||
|
||||
// Az interfészekkel függvény típusok is leírhatóak:
|
||||
interface SearchFunc {
|
||||
(source: string, subString: string): boolean;
|
||||
}
|
||||
// Csak a paraméterek típusai számítanak, a neveik nem.
|
||||
var mySearch: SearchFunc;
|
||||
mySearch = function(src: string, sub: string) {
|
||||
return src.search(sub) != -1;
|
||||
}
|
||||
|
||||
// Osztályok - a mezők alapértelmezésben publikusak
|
||||
class Point {
|
||||
// Mezők
|
||||
x: number;
|
||||
|
||||
// Konstruktor - a public/private kulcsszavak ebben a kontextusban
|
||||
// legenerálják a mezőkhöz szükséges kódot a konstruktorban.
|
||||
// Ebben a példában az "y" ugyanúgy definiálva lesz, mint az "x", csak
|
||||
// kevesebb kóddal.
|
||||
// Alapértelmezett (default) értékek is megadhatóak.
|
||||
|
||||
constructor(x: number, public y: number = 0) {
|
||||
this.x = x;
|
||||
}
|
||||
|
||||
// Metódusok
|
||||
dist() { return Math.sqrt(this.x * this.x + this.y * this.y); }
|
||||
|
||||
// Statikus mezők
|
||||
static origin = new Point(0, 0);
|
||||
}
|
||||
|
||||
var p1 = new Point(10 ,20);
|
||||
var p2 = new Point(25); //y itt 0 lesz
|
||||
|
||||
// Öröklés
|
||||
class Point3D extends Point {
|
||||
constructor(x: number, y: number, public z: number = 0) {
|
||||
super(x, y); // Szükséges az ősosztály konstruktorának explicit hívása
|
||||
}
|
||||
|
||||
// Felülírás
|
||||
dist() {
|
||||
var d = super.dist();
|
||||
return Math.sqrt(d * d + this.z * this.z);
|
||||
}
|
||||
}
|
||||
|
||||
// Modulok
|
||||
// ("." használható az almodulok számára)
|
||||
module Geometry {
|
||||
export class Square {
|
||||
constructor(public sideLength: number = 0) {
|
||||
}
|
||||
area() {
|
||||
return Math.pow(this.sideLength, 2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var s1 = new Geometry.Square(5);
|
||||
|
||||
// Új lokális név definiálása a module számára
|
||||
import G = Geometry;
|
||||
|
||||
var s2 = new G.Square(10);
|
||||
|
||||
// Generikus típusok
|
||||
// Osztályok
|
||||
class Tuple<T1, T2> {
|
||||
constructor(public item1: T1, public item2: T2) {
|
||||
}
|
||||
}
|
||||
|
||||
// Interfészek
|
||||
interface Pair<T> {
|
||||
item1: T;
|
||||
item2: T;
|
||||
}
|
||||
|
||||
// és függvények
|
||||
var pairToTuple = function<T>(p: Pair<T>) {
|
||||
return new Tuple(p.item1, p.item2);
|
||||
};
|
||||
|
||||
var tuple = pairToTuple({ item1:"hello", item2:"world"});
|
||||
|
||||
// definíciós fájl hivatkozása:
|
||||
/// <reference path="jquery.d.ts" />
|
||||
```
|
||||
|
||||
## További források
|
||||
|
||||
* [TypeScript hivatalos weboldala](https://www.typescriptlang.org/)
|
||||
* [Forráskód GitHubon](https://github.com/microsoft/TypeScript)
|
147
hu/yaml.md
Normal file
147
hu/yaml.md
Normal file
@@ -0,0 +1,147 @@
|
||||
---
|
||||
language: YAML
|
||||
filename: learnyaml-hu.yaml
|
||||
contributors:
|
||||
- ["Leigh Brenecki", "https://github.com/adambrenecki"]
|
||||
translators:
|
||||
- ["Tamás Diószegi", "https://github.com/ditam"]
|
||||
lang: hu-hu
|
||||
---
|
||||
|
||||
A YAML egy adat sorosító nyelv, amit úgy terveztek, hogy közvetlenül is
|
||||
olvasható és írható legyen emberi szemmel.
|
||||
|
||||
A JSON formátum egy szigorú befoglaló halmazát alkotja, kiegészítve azt
|
||||
szintaktikai jelentéssel bíró sortörésekkel és indentációval,
|
||||
a Pythonhoz hasonlóan. A Pythonnal ellentétben azonban a YAML nem engedélyezi
|
||||
a közvetlen tab karakterek jelenlétét.
|
||||
|
||||
Megjegyzés: UTF-8 ékezetes betűk használhatóak, ha a fájl kódlása megfelelő,
|
||||
a kódolást a tartalomban explicit nem kell (és nem is lehet) feltüntetni.
|
||||
|
||||
```yaml
|
||||
# A kommentek YAML-ban így néznek ki.
|
||||
|
||||
##################
|
||||
# Skalár típusok #
|
||||
##################
|
||||
|
||||
# A gyökér objektumunk (az egész dokumentumra értve) egy map,
|
||||
# ami a más nyelvekből ismert dictionary, hash vagy object típusokkal egyenértékű.
|
||||
kulcs: érték
|
||||
masik_kulcs: Másik érték jön ide.
|
||||
egy_szam: 100
|
||||
tudomanyos_jelolessel: 1e+12
|
||||
boolean: true
|
||||
null_value: null
|
||||
kulcs benne szóközökkel: érték
|
||||
# Látható, hogy a sztringeket nem szükséges idézőjelek közé zárni, bár szabad.
|
||||
Továbbá: "Idézőjelekkel megadott sztring."
|
||||
"A kulcs is lehet idézőjeles.": "Hasznos lehet, ha ':'-ot akarsz a kulcsban."
|
||||
|
||||
# Többsoros sztringek írhatóak 'literal block'-ként ('|' jelet használva)
|
||||
# vagy 'folded block'-ként is ('>' jelet használva).
|
||||
literal_block: |
|
||||
Ez az egész szöveg-blokk lesz az értéke a literal_block kulcsnak,
|
||||
a sortöréseket megtartva.
|
||||
|
||||
Az ilyen sztringet az indentáció visszahúzása zárja le, a behúzás pedig
|
||||
eltávolításra kerül.
|
||||
|
||||
A 'még jobban' behúzott részek megtartják a behúzásukat -
|
||||
ezeknek a soroknak 4 szóköz behúzása lesz.
|
||||
folded_style: >
|
||||
Az az egész szöveg-blokk lesz az értéke a 'folded_style' kulcsnak, de
|
||||
ezúttal minden sortörés egy szóközre lesz cserélve.
|
||||
|
||||
Az üres sorok, mint a fenti, új sor karakterre cserélődnek.
|
||||
|
||||
A 'még jobban' behúzott sorok megtartják a sortöréseiket, -
|
||||
ez a szöveg két sorban jelenik meg.
|
||||
|
||||
######################
|
||||
# Gyűjtemény típusok #
|
||||
######################
|
||||
|
||||
# Egymásba ágyazás a behúzás változtatásával érhető el.
|
||||
beagyazott_map:
|
||||
key: value
|
||||
another_key: Another Value
|
||||
masik_beagyazott_map:
|
||||
hello: hello
|
||||
|
||||
# A mapeknek nem csak sztring kulcsaik lehetnek.
|
||||
0.25: lebegőpontos kulcs
|
||||
|
||||
# A kulcsok lehetnek többsoros objektumok is, ? jellel jelezve a kulcs kezdetét
|
||||
? |
|
||||
Ez itt egy
|
||||
többsoros kulcs
|
||||
: és ez az értéke
|
||||
|
||||
# Szintén engedélyezett a kollekció típusok használata kulcsként, de egyéb
|
||||
# nyelvekben ez gyakran problémákat fog okozni.
|
||||
|
||||
# Szekvenciák (listákkal vagy tömbökkel egyenértékűek) így néznek ki:
|
||||
egy_szekvencia:
|
||||
- Item 1
|
||||
- Item 2
|
||||
- 0.5 # Többféle típust is tartalmazhat
|
||||
- Item 4
|
||||
- key: value
|
||||
another_key: another_value
|
||||
-
|
||||
- Ez egy szekvencia
|
||||
- egy másik szekvenciába ágyazva
|
||||
|
||||
# Mivel a YAML a JSON befoglaló halmazát alkotja, JSON szintaxisú
|
||||
# mapek és szekvenciák is használhatóak:
|
||||
json_map: {"key": "value"}
|
||||
json_seq: [3, 2, 1, "takeoff"]
|
||||
|
||||
#########################
|
||||
# EXTRA YAML KÉPESSÉGEK #
|
||||
#########################
|
||||
|
||||
# A YAML-ben ún. 'anchor'-ök segítségével könnyen lehet duplikálni
|
||||
# tartalmakat a dokumentumon belül. A következő kulcsok azonos értékkel bírnak:
|
||||
anchored_tartalom: &anchor_neve Ez a sztring két kulcs értéke is lesz.
|
||||
másik_anchor: *anchor_neve
|
||||
|
||||
# Vannak a YAML-ben tagek is, amivel explicit lehet típusokat jelölni.
|
||||
explicit_string: !!str 0.5
|
||||
# Bizonyos implementációk nyelv-specifikus tageket tartalmaznak, mint
|
||||
# például ez a Python komplex szám típusának jelölésére:
|
||||
python_complex_number: !!python/complex 1+2j
|
||||
|
||||
######################
|
||||
# EXTRA YAML TÍPUSOK #
|
||||
######################
|
||||
|
||||
# Nem a sztringek és a számok az egyedüli skalár típusok YAML-ben.
|
||||
# ISO-formátumú dátumok és dátumot jelölő literal kifejezések is értelmezettek.
|
||||
datetime: 2001-12-15T02:59:43.1Z
|
||||
datetime_with_spaces: 2001-12-14 21:59:43.10 -5
|
||||
date: 2002-12-14
|
||||
|
||||
# A !!binary tag jelöli, hogy egy sztring valójában base64-kódolású
|
||||
# reprezentációja egy bináris blob-nak
|
||||
gif_file: !!binary |
|
||||
R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5
|
||||
OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+
|
||||
+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC
|
||||
AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=
|
||||
|
||||
# Létezik a YAML-ban egy halmaz típus (set) is, ami így néz ki:
|
||||
set:
|
||||
? elem1
|
||||
? elem2
|
||||
? elem3
|
||||
|
||||
# Mint Pythonban, a halmazok null értékekkel feltöltött mapek, vagyis a fenti
|
||||
# halmaz egyenértékű a következővel:
|
||||
set2:
|
||||
elem1: null
|
||||
elem2: null
|
||||
elem3: null
|
||||
```
|
Reference in New Issue
Block a user