SVG 03 =========================== Automatisch reeksen maken met range() ------------------------------------- In opgave 6 werd de “for-loop” geïntroduceerd. Hiermee kan je Python bepaalde acties meermaals laten uitvoeren. In onderstaande code wordt de letter “a” drie maal op het scherm afgedrukt:: for i in [4, 5, 6]: print('a') We zagen ook dat “i” hier een variabele is, die opeenvolgend de waardes 4, 5 en tenslotte 6 krijgt. Dus, onderstaande code heeft als resultaat dat 4, 5 en 6 op het scherm afgedrukt worden:: for i in [4, 5, 6]: print(i) Voor korte lijsten -zoals hierboven getoond- is het nog praktisch doenbaar om de lijst uit te schrijven, maar als je tientallen getallen wil gebruiken wordt dit snel vervelend. Daarom voorziet Python de functie range(). Onderstaande code is identiek aan het vorige voorbeeld: for​ i ​ in​ range(4, 7): print​ (i) De range() functie heeft in dit geval 2 parameters: De eerste geeft aan welk de startwaarde is (hier 4), en de tweede parameter geeft de stop-waarde aan. Enkele voorbeelden: - range(0, 10) geeft de getallen 0 tot en met 9 - range(10, 20) geeft de getallen 10 tot en met 19 - range(1, 1000) geeft de getallen 1 tot en met 999 Opgave 10 --------- Pas de code uit opgave 9 aan zodat er 100 cirkels gemaakt worden. Laat de x- en de y-posities overeenkomen met de variabele in je for-loop. Dubbele for-loop ---------------- Je kan ook meerdere for-loop constructies gecombineerd gebruiken. Probeer onderstaande code uit:: for i in [4, 5, 6]: for j in ['a', 'b']: print(i, j) Je zag dat er nu 6 waarden afgedrukt werden. De for-loop met variabele i wordt driemaal uitgevoerd, en voor elke keer dat deze uitgevoerd werd, wordt de for-loop met variabele j tweemaal uitgevoerd. Dus, de print() functie wordt 3x2 keren uitgevoerd. Opgave 11 --------- Pas de code uit opgave 10 aan zodat er 100x100 cirkels gemaakt worden. Maak gebruik van een dubbele for-loop. Laat de x-posities overeenkomen met de variabele in je buitenste for-loop en de y-posities overeenkomen met de j-variabele in je binnenste for-loop. Bestanden --------- In de vorige opgaven werd de uitvoer van jullie programma telkens met behulp van de print() functie op het scherm getoond. Via “copy & paste” konden jullie deze uitvoer dan naar een bestand overzetten. Dit werkt echter niet handig, en programmeertalen voorzien dan ook functionaliteit om die uitvoer rechtstreeks naar bestanden te schrijven. In Python werkt dit zo:: bestand = open("olifant.txt", "wt") bestand.write("Eerste regel tekst\n") bestand.write("Nog een regel tekst\n") bestand.close() Hoe werkt dit? -------------- Regel 1 Python voorziet de functie :func:`open()` om met bestanden te werken. De eerste parameter van de functie geeft de bestandsnaam aan. Dus, op de eerste regel wordt aangegeven dat we het bestand met naam "olifant.txt" willen gebruiken. De tweede parameter -in dit geval de letters "wt"- geven aan wat we willen doen met het bestand: - w staat voor “write”: we willen schrijven naar het bestand - t staat voor “text”: we willen tekst schrijven naar het bestand Regel 2 en 3 Schrijven regels tekst naar het bestand. De “\n” (backslash gevolgd door de letter “n”) staan voor “newline” (nieuwe regel): Dit zorgt ervoor dat de tekst nadien op een nieuwe regel getoond wordt. Regel 4 We zijn klaar met schrijven, sluit het bestand. Opgave 12 --------- Schrijf een programma dat vraagt naar een gebruikersnaam en een paswoord, en vervolgens een tekstbestand maakt waarin op de eerste regel die gebruikersnaam staat, en op de tweede regel je passwoord. Modules ------- Tot nu toe hebben we o.a. de volgende functies gezien: :func:`print()`, :func:`input()`, :func:`int()`, :func:`str()`, :func:`type()`, :func:`open()`. Dit noemt men “built-in” (ingebouwde) functies: Dit zijn functies die je altijd onmiddellijk ter beschikking hebt in Python. In het totaal zijn er zo ongeveer 70 functies standaard beschikbaar in Python. Hier vind je de lijst met ingebouwde functies: https://docs.python.org/3.8/library/functions.html Buiten deze ingebouwde functies bevat Python ook veel extra functionaliteit in wat men de “standard library” noemt. Deze “standard library” bestaat uit vele modules met hierin o.a. vele functies die je kan gebruiken. Om vanuit je programma die functies te kunnen gebruiken dien je de gewenste module eerste te importeren met het import statement:: import getpass gebruikersnaam = getpass.getuser() print(gebruikersnaam) Hoe werkt dit? -------------- Regel 1 De module met naam :mod:`getpass` wordt bruikbaar gemaakt vanuit je programma. Regel 2 De functie :func:`getuser()` in de module :mod:`getpass` wordt opgeroepen. Deze functie geeft de huidige gebruikersnaam terug. Deze wordt nadien opgeslagen via het assignment statement in de variabele met naam “gebruikersnaam”. Regel 3 De variabele met naam “gebruikersnaam” wordt op het scherm getoond. Opgave 13 --------- In opgave 10 vragen de gebruiker om zijn/haar paswoord in te geven, via de :func:`input()` functie. Maar dit werkt niet handig omdat :func:`input()` de invoer toont terwijl je typt. In de module :mod:`getpass` zit ook een functie :func:`getpass()` die hier een oplossing voor biedt. Pas je programma aan zodanig dat je paswoord niet meer zichtbaar is, gebruik makend van deze :func:`getpass()` functie. Opgave 14 --------- Een andere nuttige module in de standard library is de :mod:`random` module. In de random module zit o.a. de functie :func:`randint()`. Deze functie geeft je een willekeurig getal terug tussen twee opgegeven getallen. Dus, bij een oproep van ``randint(0, 1)``, krijg je ofwel 0 ofwel 1 terug. Als je ``randint(0, 100)`` gebruikt, krijg 1 getal in het interval [0, 100]. Dus, je getal kan 0, 1, ..., 99 of 100 zijn. Schrijf een programma dat een willekeurige PIN-code voor je GSM maakt. Opgave 15 --------- Pas je programma uit opgave 11 aan, zodanig dat de straal van je cirkels willekeurig gekozen wordt, gebruik makend van de functie :func:`randint()` uit de module :mod:`random`. Pas vervolgens je programma aan zodanig dat de uitvoer niet meer op het scherm getoond wordt, maar naar een bestand geschreven wordt met behulp van de :func:`open()` functie (alsook :func:`write()` en :func:`close()` zoals in het voorbeeld). Opgave 16 --------- In de module :mod:`random` zit verder ook een functie :func:`choice()` die een willekeurige keuze maakt uit een gegeven verzameling. Bijvoorbeeld:: a = random.choice([10, 20, 30, 40]) print(a) Uitvoer:: 30 Maar dit werkt ook voor strings:: a = random.choice("abcdefghij") print(a) Uitvoer:: j Maak een programma dat de gebruiker vraagt om een bestandsnaam, dit bestand opent, en er vervolgens een paswoord in schrijft bestaande uit 8 willekeurige letters. Opgave 17 --------- Pas je programma uit opgave 13 aan, zodanig dat de kleur van je cirkels willekeurig gekozen wordt, gebruik makend van de functie :func:`choice()` uit de module :mod:`random`. Tip:: kleur = random.choice(["red", "green", "blue", "purple", "black"]) print(kleur) Uitvoer:: green