Skip to content
Extraits de code Groupes Projets
Valider fdb147d7 rédigé par Sébastien Strebelle's avatar Sébastien Strebelle
Parcourir les fichiers

Added docs and tests

parent d2d1f454
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
#!/usr/bin/env python3.6
#!/usr/bin/env python3
"""Factorise la liste des diviseurs premiers de nombres entiers.
Ce script lit dans un fichier d'entrée une liste d'entiers (tous naturels plus grand ou égal à 2).
Pour chaque entier dans cette liste, il calcule la liste de ses diviseurs premiers.
Ensuite, il écrit dans un fichier de sortie une ligne pour chaque entier avec sa liste de diviseurs premiers.
Par exemple pour un fichier d'entrée :
20414363521583006011
13
100
Le fichier de sortie sera :
20414363521583006011 283 72135560146936417
13
100 2 5
Ce script s'utilise comme :
$ python3 prime_divs.py input_filename output_filename
Pour plus d'information, lancez :
$ python3 prime_divs.py -h
Pour tester le script, lancez :
$ python3 -m pytest
Si vous avez une erreur, installez d'abord pytest :
$ pip3 install -U pytest`
"""
import argparse
import logging
import os
import sys
logger = logging.getLogger()
def is_div(number, i):
"""Vérifie si i est un diviseur de number."""
return number % i == 0
def is_prime(number):
"""Vérifie si number est un nombre premier."""
for i in range(2, number):
if is_div(number, i):
return False
return True
def prime_divs(number):
"""Calcule la liste des diviseurs premiers de number."""
prime_dividers = []
for i in range(2, number):
if is_prime(i) and is_div(number, i):
prime_dividers.append(i)
return prime_dividers
def main(fileIn, fileOut):
try:
with open(fileIn) as input, open(fileOut, "w") as output:
for line in input:
try:
number = int(line)
except ValueError:
print(f"Not a valid number: {line}")
continue
prime_dividers = prime_divs(number)
res = str(number)
for prime_div in prime_dividers:
res += " " + str(prime_div)
res += "\n"
output.write(res)
print(res, end="")
except IOError:
print("IOError")
sys.exit(-1)
def main(input, output):
"""Lit chaque entier en entrée, trouve ses disviseurs premiers et écrit en sortie."""
logger.info("Début de la boucle principale")
for line in input:
try:
number = int(line)
except ValueError:
logger.warning("Entier mal formatté : %s", line[:-1])
continue
if number < 2:
logger.warning("Entier plus petit que 2 : %s", line[:-1])
continue
prime_dividers = prime_divs(number)
res = str(number) + " " + " ".join(str(div) for div in prime_dividers)
output.write(res + "\n")
logger.debug(res)
def parse_args(args=sys.argv[1:]):
"""Analyse les arguments."""
parser = argparse.ArgumentParser(description=sys.modules[__name__].__doc__,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument("input_file", type=argparse.FileType('r'), help="Nom du fichier d'entrée")
parser.add_argument("output_file", type=argparse.FileType('w'), help="Nom du fichier de sortie")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", default=False, action="store_true", help="Active les informations de débug")
group.add_argument("-q", "--quiet", default=False, action="store_true", help="Désactive toutes les informations")
arguments = parser.parse_args(args)
logging.basicConfig(level=logging.INFO, stream=sys.stderr, format="%(levelname)s: %(message)s")
if arguments.quiet:
logger.setLevel(logging.WARNING)
if arguments.verbose:
logger.setLevel(logging.DEBUG)
return arguments.input_file, arguments.output_file
if __name__ == '__main__':
if len(sys.argv) != 3:
print(f"Usage: {sys.argv[0]} fileIn fileOut")
sys.exit(-1)
if not os.path.isfile(sys.argv[1]):
print(f"{sys.argv[0]}: No such file {sys.argv[1]}")
sys.exit(-1)
main(sys.argv[1], sys.argv[2])
input_file, output_file = parse_args()
logger.info("Fichiers ouverts")
main(input_file, output_file)
logger.info("Fermeture des fichiers")
input_file.close()
output_file.close()
#!/usr/bin/env python3
"""Module de test de prime_divs.py
Lancez les tests avec :
$ python3 -m pytest
Si vous avez une erreur, installez d'abord pytest :
$ pip3 install -U pytest`
"""
from prime_divs import *
import pytest
@pytest.mark.parametrize("number, i, expected", [
(10, 2, True),
(5, 5, True),
(3, 2, False),
(15, 4, False),
])
def test_is_div(number, i, expected):
assert is_div(number, i) == expected
@pytest.mark.parametrize("number, expected", [
(2, True),
(4, False),
(13, True),
(97, True),
(100, False),
])
def test_is_prime(number, expected):
assert is_prime(number) == expected
@pytest.mark.parametrize("number, expected", [
(10, [2, 5]),
(100, [2, 5]),
(13, []),
(432, [2, 3]),
(291, [3, 97]),
])
def test_prime_divs(number, expected):
assert prime_divs(number) == expected
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter