Data Analysis - Programming - 1

Week 2

Onderwerpen week 2:

  • string formatting
  • talstelsels
  • string indexing
  • user input

String formatting (1)

  • tekstuele output is de eenvoudigste manier om de computer
    begrijpelijke antwoorden op je vragen te laten geven
  • de print()-function maakt tekstuele output mogelijk,
    maar de opmaak laat nog wat te wensen over zoals
    je hebt gezien bij de waarheidstabellen

  • format() is een functie die wordt toegepast op een string:

    count = 100
    success = 73
    print("P(X) = {} / {} = {}".format(
          success, count, success / count))
    

    drukt af: P(X) = 73 / 100 = 0.73

  • de string voor de punt, "P(X) = {} / {} = {}" in het voorbeeld,
    wordt de format string genoemd en dient als sjabloon
  • de sjabloon bevat placeholders, de accoladeparen {}
  • de argumenten voor de format()-functie, count, success en (count / success) in het voorbeeld, worden ingevuld op de plaats van de placeholders

String formatting (2)

  • in de placeholders voor de format()-functie kun je aanwijzingen geven
    voor de manier waarop het argument op die plaats moet worden ingevuld
  • enkele veelgebruikte voorbeelden zijn:
    • argument index, bepaalt welk argument wordt gebruikt:
      "P(X) = {2} / {1} = {0}".format(success / count, count, success)
      
    • breedte, reserveert ruimte
      "{:8}|{:8}|{:8}".format("A", "B", "(A or B)")
      
    • uitlijning binnen de gereserveerde ruimte
      "{:<8}|{:^8}|{:>8}".format(str(False), str(False), str(False))
      
    • precisie voor getallen
      "P(X) = {:.0f} / {:.3f} = {:.6f}".format(12, 13, 12 / 13)
      

In [12]:
count = 4
success = 2
print("P(X) = {2} / {1} = {0}".format(success / count, count, success))
print("{:8}|{:8}|{:8}".format("A", "B", "(A or B)"))
print("{!s:<8}|{!s:^8}|{:>8}".format(False, False, False))
print("P(X) = {:.0f} / {:.3f} = {:.6f}".format(12, 13, 12 / 13))


P(X) = 2 / 4 = 0.5
A       |B       |(A or B)
False   | False  |       0
P(X) = 12 / 13.000 = 0.923077

Opdracht 1

  • vorige week heb je Python waarheidstabellen laten afdrukken,
    maar die waren nogal schots en scheef. Pas het onderstaande programma aan,
    zodat de afgedrukte tabel leesbaar en netjes uitgelijnd afgedrukt wordt.
    print("A", "B", "A|B", "A&B", "not A")
    for A in [False, True]:
      for B in [False, True]:
          print(A, B, A or B, A and B, not A)
    

Talstelsels (1)

  • je hebt van jongs af aan leren tellen en rekenen in het tientallig of decimale talstelsel:
    $321_{10} + 987_{10} = 1308_{10}$
  • computers rekenen echter, om technische redenen, in het tweetallig of binaire talstelsel:
    $101000001_2 + 1111011011_2 = 10100011100_2$
  • en ook het achttallig (octale) stelsel en het 16-tallig (hexadecimale) stelsel worden veel gebruikt bij het werken met computers:
    $501_8 + 1733_8 = 2434_8$
    $141_{16} + 3DB_{16} = 51C_{16}$
    in het 16-tallig stelsel zijn de decimale cijfers op na 9 en daarom worden de letters A t/m F gebruikt om de 'cijfers' 10 t/m 16 voor te stellen

Talstelsels (2)

  • algoritme voor talstelsel conversie,
    decimaal naar iets anders:
    1. gegeven: het decimale getal number,
      de gewenste nieuwe basis rbase,
      en een lege resultaat string result = ""
    2. bepaal de rest van de deling number / rbase,
      en voeg het resultaat toe als meest linkse digit aan result:
      remainder = number % rbase  ## % is de modulo operator in Python
      result = str(remainder) + result
      
    3. bepaal de nieuwe waarde van number als
      het gehele deel van de deling number / rbase:
      number = number // rbase  ## // geeft het geheel van de deling
                                ## deze bewerking wordt integer deling genoemd
      
    4. als number > 0, ga verder bij stap 2,
      anders bevat result het getal in de nieuwe basis

In [13]:
## number system conversion decimal to any
number = 321
rbase = 2
result = ""

while number > 0:
    remainder = number % rbase
    result = str(remainder) + result
    number = number // rbase

print(result)


101000001

String indexing (1)

  • de talstelsel conversie gaat prima voor talstelsels
    met een basis tot en met 10,
    maar daarboven raken we door de cijfers heen
  • een gebruikelijke oplossing is om
    alle cijfers uit een string te peuteren,
    bijvoorbeeld voor basis 16:
    digits: "0123456789ABCDEF"
    index :            111111
             0123456789012345
  • in Python kun je een karakter uit een string halen
    met behulp van indexing. Het getal tussen blokhaken is
    de 0-based index van het element van de string dat je wilt hebben:
    digits = "0123456789ABCDEF"
    print(digits[0], digits[3], digits[10], digits[15])
    for i in range(0, len(digits), 4):
      print(digits[i])
    

In [17]:
digits = "0123456789ABCDEF"
print(digits[0], digits[3], digits[10], digits[15])
for i in range(0, len(digits), 4):
    print(digits[i])


3 A F
0
4
8
C

String indexing (2)

  • zoals je met indexing een karakter op
    een specifieke plek in een string kan opzoeken, zo kun je met de index()-functie precies het omgekeerde doen:
digits = "0123456789ABCDEF"
print(digits.index("0"), digits.index("3"), digits.index("E"), digits.index("F"))
0 3 14 15
  • met behulp van de index()-functie zou je
    bijvoorbeeld de waarde van digits in een string kunnen bepalen
    (zie Oefeningen, opgave 1)

Opdracht 2

  • pas het programma voor talstelsel conversie zo aan dat
    ook het hexadecimale stelsel correcte conversies oplevert
number = 987
rbase = 16
result = ""

while number > 0:
    remainder = number % rbase
    result = str(remainder) + result
    number = number // rbase

print(result)

Talstelsels (3)

  • algoritme voor talstelsel conversie,
    ander talstelsel naar decimaal:
    1. gegeven: het getal number als string,
      de basis van number, genaamd base,
      en een resultaat variabele result = 0
    2. voor iedere digit in number, van achter naar voren,
      bepaal de positie van digit in number,
      geteld van achter naar voren,
      waarbij de laatste digit positie 0 heeft,
      en noem deze positie power
    3. tel digit * (base ** power) op bij result en voeg het resultaat toe als meest linkse digit aan result

Python user interaction (1)

  • tot nu toe zijn alle "parameters" in je programma's
    als constanten opgegeven (hardcoded)
  • je programma wordt bruikbaarder en generieker wanneer je
    in plaats van constanten kunt werken met input van de gebruiker
  • zo zou je de talstelselconversie programma's kunnen aanpassen
    zodat de gebruiker kan opgeven welke bases hij wil gebruiken en
    welk getal geconverteerd dient te worden:
    Geef de basis van het originele getal: 16
    Geef het getal: 3DB
    Geef de gewenste basis: 8
    Resultaat: 1703
  • de functie waarmee je input aan de gebruiker kunt vragen heet input()

Opdracht 3

  • zoek met behulp van Jupyter Notebook's ingebouwde Python documentatie
    uit hoe de input() functie werkt
  • schrijf een kort programma dat de gebruiker vraagt om zijn of haar naam,
    en daarmee een groet afdrukt:
    Hoe heet je: Pascal
    Hallo Pascal!

Python user interaction (2)

  • de input() functie geeft altijd een string terug,
    het onderstaande programma zou niet werken omdat
    je twee strings niet kunt vermenigvuldigen
    (probeer dit soort dingen zelf uit!)
    mass = input("Geef de massa: ")
    velocity = input("Geef de snelheid: ")
    momentum = mass * velocity
    print("Momentum: {}".format(momentum))
    
  • als je een getal nodig hebt,
    kun je Python de string input van de gebruiker laten
    converteren naar het gewenste datatype
  • de functies die je daarvoor gebruikt, zijn vernoemd
    naar de corresponderende datatypen:
    mass_txt = input("Geef de massa: ")  ## mass_text wordt een string
    mass = float(mass_txt)               ## mass wordt een float
    count_txt = input("Geef het aantal: ")
    count = int(count_txt)               ## count wordt een int
    
  • de conversie naar een getal werkt natuurlijk alleen
    als de opgegeven waarde ook een geldig getal op zou leveren

Opdracht 4

Pas het onderstaande programma aan, zodat het wel werkt.

mass = input("Geef de massa (in kg): ")
velocity = input("Geef de snelheid (in m/s): ")
momentum = mass * velocity
print("Momentum: {} N/s".format(momentum))

Oefeningen

  1. Schrijf een programma dat het algoritme
    uit de slide Talstelsels (3) implementeert,
    dat wil zeggen, waarmee een getal uit een willekeurig talstelsel
    omgezet kan worden naar een tientallige representatie.

  2. Nu je de programma's hebt om de conversie van een willekeurig talstelsel
    naar 10-tallig uit te voeren en tevens de conversie van 10-tallig naar een
    willekeurig talstelsel, kun je ze samen gebruiken om van het ene
    willekeurige talstelsel, zeg $n$, naar het andere willekeurige talstelsel $m$ te converteren:
    $x_n \rightarrow y_{10} \rightarrow z_m$
    Schrijf een programma dat een getal in een opgegeven talstelsel kan
    converteren naar een ander opgegeven talstelsel. Je kunt de onderstaande code
    gebruiken om je programma te beginnen:

    org_base = 8
     org_number = "4607"
     tgt_base = 16
    
     ## converteer org_number (basis org_base) naar dec_number (10-tallig),
     ## converteer dec_number (10-tallig) naar tgt_number (basis tgt_base),
     ## druk tgt_number af
    
  3. Pas het programma uit opgave 2 aan zodat de gebruiker de beide bases
    en het te converteren getal mag opgeven, zoals beschreven
    in de slide Python User Interaction (1)

In [ ]: