Strings

Deze pagina bevat uitvoerbare code.

Tekstuele data en collecties

Verzamelingen van data zijn heel natuurlijk, denk bijvoorbeeld aan een reeksen van dagelijkse temperaturen (het werk van het KNMI) of verkoopcijfers van een winkel om bijvoorbeeld de maand- of jaaromzet te kunnen berekenen. De volgorde maakt in al deze gevallen uit: het heeft betekenis. Tekst (wat je nu leest) is een opeenvolging van karakters en het datatype om tekstuele data te representeren is een string. Vergelijk het met een draad waar je individuele karakters aan vast rijgt. (book)

character string

Een computer herkent een string aan dubbele of enkele quotes, zolang je maar consequent bent, bijvoorbeeld "hoi' zal een syntaxfout geven!

a = "123"
b = 123

In bovenstaande voorbeeld is variabele a een string en variabele b een integer. Om te checken welke type een variabele is kan de functie type() gebruikt worden

strings: tekstuele data

Voorbeeld

strings

s = "hanze", c = "hogeschool"

type

type(s)

lengte

len(s)

optellen

s + c

vermenigvuldigen

2*s + 3*c

type("hanzehogeschool")
str

Je zult zien dat je bijzonder veel met strings kan doen, van bij elkaar optellen tot vermenigvuldigen! (book)

Gegeven de volgende twee strings

s1 = "ha"
s2 = "k"

Strings optellen …

s1 = "ha"
s2 = "k"

print(s1 + s2)
hak

Strings vermenigvuldigen …

s1 = "ha"
s2 = "k"

print(2*s1 + s2 + 2*(s1 + s2))
hahakhakhak

Lists

Verzamelingen van data. (book)

M = [4, 7, 100, 42, 5, 47]

In het Nederlands noemen we dit een lijst; het type heet in Python list. Net als bij een string gebruiken we de Nederlandse term als we erover praten en de Engelse als we de code bedoelen. Je ziet hier een lijst met 6 elementen die aan de variabele M wordt toegekend. Met de vierkante haken geef je Python aan dat je hier een list bedoelt, elementen in de lijst scheid je met komma’s.

Lengte

De lengte van een lijst

M = [4, 7, 100, 42, 5, 47]

len(M)
6

Een lijst is een sequentie en net als bij een string kan je de lengte (het aantal elementen) opvragen met len(x).

Index

De elementen in de lijst zijn geïndexeerd, ze hebben een vaste positie.

0

1

2

3

4

5

[

4,

7,

100,

42,

5,

47

]

In een sequentie staat elk element op een vaste positie en we beginnen altijd te tellen vanaf 0.

Positie

Het element op index positie 0 opvragen

M = [4, 7, 100, 42, 5, 47]

M[0]
4

De syntax lijkt wat eigenaardig omdat je hier wéér vierkante haken moet gebruiken, deze keer achter de varabele naam om het karakter op deze positie op te vragen.

Slicing

Een opeenvolgende selectie van elementen opvragen. (book) (book)

M = [4, 7, 100, 42, 5, 47]

M[0:3]
[4, 7, 100]

Slicing, alsof je een puntje uit een taart snijdt! De eerste positie is de start index (0), de tweede de stop index (3). Stop is tot de index (en niet tot en met). Slicing geeft als resultaat altijd hetzelfde type terug (een list in dit geval). We zullen straks zien dat je ook strings kan slicen en dan zal het een substring teruggeven.

Alle data

Een lijst kan alle datatypen bevatten

L = [3.14, [2, 40], "derde", 42]

Let hier even op, je ziet hier een een lijst als element op index positie 1 en een string op positie 2. Een lijst in een lijst, wat zal len(x) nu tellen?

L = [3.14, [2, 40], 'derde', 42]

len(L)
4

Alleen de elementen van de lijst zelf worden geteld!

Strings en indexering

String indexering met []

0

1

2

3

4

h

a

n

z

e

Goed nieuws! Net als lijsten zijn strings geïndexeerd en ook hier begint tellen bij 0!

Positie

Het karakter op index positie 0 opvragen

s = 'hanze'

s[0]
'h'

Exact dezelfde syntaxis en werking als bij lijsten!

Negatieve indices

Negatieve indicess tellen van achteren naar voren!

0

1

2

3

4

h

a

n

z

e

-5

-4

-3

-2

-1

s = 'hanze'

s[-5]
'h'

Negatieve indices introduceren we nu voor strings, maar je kan misschien al raden dat dit op dezelfde manier ook bij lijsten werkt!

Slicing

Een substring opvragen:

s = "hanzehogeschool"

s[0:5]
'hanze'
s = "hanzehogeschool"

s[5:]
'hogeschool'

Het is je misschien opgevallen dat je de “stop” positie leeg kan laten, Python neemt dan aan dat je tot en met het einde van de sequentie (de string in dit geval) bedoelt. Wat zou gebeuren als we de “start” positie ook leeg laten?

s = "hanzehogeschool"

s[:]
'hanzehogeschool'

De substring is in dit geval de hele string! Python vult voor jou het begin en einde in op basis van de lengte van de string. Je krijgt hier een nieuwe string terug; de oorspronkelijke verandert niet. Strings zijn in Python namelijk nooit aan te passen: elke bewerking levert een nieuwe string op.

Stappen

Met hoeveel stappen door de sequentie lopen (skip-slicing)

[start:stop:step]

Standaard is de stap 1, dat wil zeggen, neem steeds 1 stap voor het volgend element dat we in de selectie zouden willen hebben.

s = 'hanzehogeschool'

s[::1]
'hanzehogeschool'

Twee stappen per keer:

s = 'hanzehogeschool'

s[::2]
'hneoecol'

Achteruit lopen

Stappen kunnen ook negatief zijn!

s = 'hanzehogeschool'

s[::-1]
'loohcsegoheznah'

Als je goed oplet zie je dat we met een negatieve stap de string hebben omgedraaid! Python gebruikers willen graag opscheppen met deze “truc” om een string om te draaien en misschien hebben ze wel gelijk!

Let op

Bij een negatieve staprichting moet de start- en stopindex omgekeerd zijn!

s = 'hanzehogeschool'

s[14:8:-1]
'loohcs'

Omdat de staprichting wijzigt, wijzigt ook op welke index moet worden begonnen en tot welke index moet worden gelopen.

max of min

De niet subtiele kunst van het uitzoeken van het beste (en slechtste) van alles: > of < (book])

"m&m's" > "koffie"
True
[0, 42] < [4, 2]
True
[0, "m&m's"] < [4, "koffie"]
True

strings to the max

Zowel bij strings als bij lijsten kiest Python het eerste element voor vergelijkingen. Zijn deze aan elkaar gelijk, dan vergelijkt Python de volgende twee elementen. Een leeg element is altijd kleiner.

"w" > "e"
True

Intuïtief zou je denken dat dit een vergelijking is op basis van de positie in het alfabet. Hoe verder in het alfabet, hoe hoger de waarde van de letter.

"Emily" > "Misja"
False

M ligt verder in het alfabet dan E en dus is de statement false.

"Mug" > "Muis"
False

De eerste letters (M) zijn gelijk aan elkaar, er wordt dan gekeken naar de twee letters.
De tweede letters (u) zijn ook gelijk aan elkaar, er wordt dan gekeken naar de derde letters De derde letters zijn niet gelijk aan elkaar. i ligt verder in het alfebet dan g en dus is de statement false.

Opdrachten

Opdracht 1

Wat is de output?

a.

a = "123"
print(2 * a)

b.

a = "hanze"
b = "Hogeschool"
print(2 * a + b)

c.

a = 123
b = "456"
print(a, b)

Opdracht 2

pi = [3, 1, 4, 1, 5, 9]

L = ['pi', "isn't", [4, 2]]
  1. Wat is len(pi)?

  2. Wat is len(L)?

  3. Wat is len(L[1])?

  4. Wat is pi[2:4]?

  5. Welk puntje (“slice”) pi is gelijk aan [3,1,4]? (hint, neem het aantal elementen als stop waarde)

  6. Welk puntje pi is [3,4,5]?

Opdracht 3

L = ['pi', "isn't", [4,2]]

M = 'You need parentheses for chemistry !'
#    0   4   8   12  16  20  24  28  32
  1. Wat is L[0]?

  2. Wat is L[0][1]?

  3. Wat is L[0:1]?

  4. Wat is M[9:15]?

  5. Wat is M[::5]?

  6. Welk puntje M is 'try'?

  7. Welk puntje M is 'shoe'?

Opdracht 4

pi = [3, 1, 4, 1, 5, 9]
  1. Wat is pi[0] * (pi[1] + pi[2])?

  2. Wat is pi[0] * (pi[1:2] + pi[2:3])?

  3. Hoe krijg je [3, 4, 5, 3, 4, 5, 3, 4, 5]?

Opdracht 5

True or false?

  1. [4,2] > [42]

  2. "hoi" > "doei"

  3. "eten" > "werken"

  4. "Haard" < "Huis"

  5. "F" < "Fiets"

  6. [4, "m&m's"] < [1, "koffie"]