TIMin ohjelmointikielet ja olennaisimmat kirjastot
Sisältö
- Python
- versio 3, ei 2!
- muuttujat
- funktiot
- perustietotyypit ja -rakenteet
- kontrollirakenteet
- luokat ja metodit
- moduulit
- tyypittäminen
- Flask-kirjasto
- TypeScript
- muuttujat
- funktiot
- perustietotyypit
- rajapinnat
- kontrollirakenteet
- luokat ja metodit
- moduulit
- Angular ja AngularJS
1. Python
1.1 Yleistä
- TIMissä käytössä Python 3 (tarkemmin 3.8)
- Python 2 vanha ja epäyhteensopiva Python 3:n kanssa
- Jos luet Python-dokumentaatiota, varmista, että valittuna on versio 3.8
1.2 Muuttujat
luku = 6
jono = 'terve!'
jono2 = "heippa"
luku = 3
print(luku) # tulostaa 3
1.3 Funktiot
def plussaa(a, b=4):
return a + b
print(plussaa(1, 2)) # tulostaa 3
print(plussaa(1)) # tulostaa 5
print(plussaa(a=1, b=2)) # tulostaa 3
1.4 Perustietotyypit ja -rakenteet
luku = 6 # int - kokonaisluku
liuku = 6.2 # float - liukuluku
jono = 'terve!' # str - merkkijono
jono2 = "heippa" # str - merkkijono
jono2 = """heippa""" # str - merkkijono
eimitaan = None # None - tyhjä / "null"
numerot = {'yksi': 1, 'kaksi': 2} # dict - sanakirja
print(numerot['yksi']) # tulostaa 1
print(numerot.get('kaksi')) # tulostaa 2
print(numerot.get('kolme')) # tulostaa None
print(numerot['kolme']) # heittää poikkeuksen KeyError
joukko = {2, 3, 5, 7, 11} # set - joukko
print(2 in joukko) # tulostaa True
print(4 in joukko) # tulostaa False
tiedot = (12, 'kissa', joukko) # tuple
print(tiedot[0]) # tulostaa 12
eka, toka, kolmas = tiedot
print(toka) # tulostaa kissa
lista = ['yksi', 'kaksi', 'kolme'] # list
print(lista[2]) # tulostaa kolme
lista.append('neljä')
print(len(lista)) # tulostaa 4
lista[1] = 'kaa'
print(lista[1]) # tulostaa kaa
1.5 Kontrollirakenteet
if luku > 5:
print(f'luku on > 5 ja se on {luku}')
elif luku > 3:
print(f'luku on > 3 mutta <= 5')
if lista: # huom. ei tarvitse: "if len(lista) > 0:"
print('lista on epätyhjä')
else:
print('lista on tyhjä')
for luku in lista:
print(luku)
for i, luku in enumerate(lista)
print(f'paikassa {i} on luku {luku}')
while 3 < luku < 10:
luku += 1
if luku == 8:
break
try:
x = numerot['kolme']
except KeyError:
x = 0
1.6 Luokat ja metodit
class Document:
def __init__(self, name, content):
self.name = name
self.content = content
def get_name(self):
return self.name
d = Document(name='test', content='hello')
Perintä:
class ColorDocument(Document):
def __init__(self, name, content, color):
super().__init__(self, name, content)
self.color = color
1.7 Moduulit
.py
-päätteinen tiedosto = moduuli- voi sisältää funktioita, muuttujia, luokkia yms., joita voi
import
ata toisiin moduuleihin
# tiedosto document.py
class Document:
...
# tiedosto colordocument.py
from document import Document
class ColorDocument(Document):
...
1.8 Tyypittäminen
- sitä hyödyllisempää, mitä isompi projekti
- kehitysympäristö havaitsee tyyppivirheet
- dokumentointi
- tyypitys vähintään parametreihin ja paluuarvoihin, joskus lokaaliin muuttujiin
luku: int = 6
def plussaa(a: int, b: int = 4) -> int:
return a + b
class Document:
def __init__(self, name: str, content: str):
self.name = name
self.content = content
def get_name(self) -> str:
return self.name
1.9 Flask-kirjasto
- web-kehys Pythonille
- reitit, ks. esim. tim.py
- blueprintit, ks. esim. bookmarks.py
1.10 attrs-kirjasto
- vähentää luokkien "boilerplatea", esim. muodostajaa ei tarvitse itse kirjoittaa
2. TypeScript
- TypeScript = moderni JavaScript + tyypit
2.1 Muuttujat
- lokaalit muuttujat esitellään joko
let
taiconst
- esittelyssä
var
vanhentunut tapa ja ei suositeltu - käytä
const
aina kun mahdollista
let luku: number = 6; // tyypiksi ilmoitetaan number, mutta tarpeeton tässä tapauksessa
let jono = "terve"; // tyypiksi päätellään string
jono = 3; // virhe: numeroa ei voi sijoittaa merkkijonotyyppiin
luku = 3;
const vakio = {yksi: 1, kaksi: 2};
vakio = {}; // virhe: vakio on const; ei saa sijoittaa uudelleen
var x = 0; // sallittu, mutta ei suositeltu
2.2 Funktiot
function plussaa(a: number, b: number = 4): number {
return a + b;
}
- paluutyyppi useimmiten päätellään, eli esittelyriviltä
: number
voisi jättää pois
2.3 Perustietotyypit
const a = false; // boolean
const luku = 5; // number
const c = 5.6; // number
const d = "moi"; // string
const e = {id: 1, name: "joku"}; // object, mutta TypeScriptissä {id: number, name: string}
e.x = 4; // virhe: objektissa 'e' ei ole ominaisuutta 'x'
const f = null; // null
const g = undefined; // undefined
const lista = [1, 2, 3]; // Array, TypeScriptissä number[]
const uusi = {...e, color: "red"}; // {id: number, name: string, color: string}
Huom: JavaScriptissä (ja siten TypeScriptissä) ei ole erikseen kokonaisluku- ja liukulukutyyppejä, vaan vain number
.
2.4 Rajapinnat
- voivat sisältää sekä dataa (
number
,string
, ...) että metodeja - tapana aloittaa nimet
I
-kirjaimella
interface IDocument {
name: string;
content: string;
getName: () => string; // tai: getName(): string;
}
2.5 Tyypeistä tarkemmin
- TypeScriptissä on rakenteellinen tyypitys: oliomuuttujat
x
jay
ovat yhteensopivia, jos niillä on samannimiset ja samantyyppiset ominaisuudet (likimain sanottuna)
2.6 Kontrollirakenteet
if (luku > 5) {
console.log(`luku on > 5 ja se on ${luku}`); // huom. template string
} else if (luku > 3) {
console.log("luku on > 3 mutta <= 5");
} else {
console.log("luku on <= 3");
}
for (const luku of lista) {
console.log(luku);
}
while (3 < luku && luku < 10) {
luku++;
if (luku == 8) {
break;
}
}
2.6.1 Async/await
- hyvin hyödyllinen esim. haettaessa palvelimelta dataa
await
"odottaa" jonkin operaation valmistumista (usein esim. HTTP-pyyntö) ennen kuin suoritusta jatketaan seuraavalta riviltäawait
in käyttö vaatiiasync
-määreen
async function fetchUser(id: number) {
const response = await $http.get<IUser>(`/users/${id}`);
return response.data;
}
2.7 Luokat ja metodit
class Document {
private name: string;
// 2 tapaa esitellä attribuutti
constructor(name: string, private content: string) {
this.name = name;
}
public getName(): string {
return this.name;
}
}
Perintä:
class ColorDocument extends Document {
private color: string;
constructor(name: string, content: string, color: string) {
super(name, content);
this.color = color;
}
}
2.8 Moduulit
- moduuli on
.ts
-päätteinen tiedosto, jossa on vähintään yksiexport
taiimport
- voi sisältää funktioita, muuttujia, luokkia yms., joita voi
import
ata toisiin moduuleihin, kunhan ne onexport
attu
// tiedosto document.ts
export class Document {
// ...
}
// tiedosto colordocument.ts
import {Document} from "./document";
class ColorDocument extends Document {
// ...
}
2.9 Strict mode -huomioita
TypeScriptissä on päällä strict mode: tyyppien arvoalueisiin ei kuulu automaattisesti null
eikä undefined
.
let a = "hei";
a = null; // virhe
a = undefined; // virhe
let b: string | undefined = "hei";
b = undefined; // ok
b = null; // virhe
2.10 Angular ja AngularJS
- Angular ja AngularJS ovat eri kirjastoja. AngularJS näistä vanhempi, "legacy"
- TIMissä käytössä on sekä Angular että AngularJS. Uudet komponentit kirjoitettava Angularilla.
AngularJS-huomioita:
- laajentaa HTML:n syntaksia
- oleellisin käsite: komponentti (component)
bindings
: komponentin "parametrit"template
/templateUrl
: komponentin ulkoasu/HTMLcontroller
: komponentin ohjainrequire
: komponentin mahdollisesti tarvitsemat isäntäkomponentit
- esimerkki: timCopyFolder
- Koska TIM käyttää TypeScriptiä, monet netistä löytyvät AngularJS-vinkit eivät ole kopioitavissa suoraan, vaan ne täytyy muuntaa TypeScriptiksi. Erityisesti vanhassa netissä esiintyvässä koodissa
$scope
a käytetään paljon.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.