Skip to content

Εργαστήριο 2 στην Python

Θέματα που εξετάζονται στο εργαστήριο: συγγραφή συναρτήσεων1, unit tests με τη στάνταρντ βιβλιοθήκη unittest2, comprehensions34, virtual environments (venv), εξωτερικές βιβλιοθήκες και εγκατάσταση με το pip, unit tests με το pytest5.

Εξάσκηση (εκφωνήσεις και λύσεις ασκήσεων)

Άσκηση E2A1 - Γράψτε μια συνάρτηση που να δέχεται δύο λεκτικά και να επιστρέφει την απόσταση Hamming (δηλαδή το πλήθος των αντίστοιχων χαρακτήρων που διαφέρουν στα δύο λεκτικά). Αν τα λεκτικά είναι διαφορετικού μήκους η συνάρτηση να επιστρέφει την τιμή -1. Τροποποιήστε το ακόλουθο template κώδικα έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.

template2_1.py
import unittest


def hamming_distance(s, t):
    pass


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestHammingDistance(unittest.TestCase):
    def test_HD(self):
        self.assertEqual(hamming_distance("G", ""), -1)
        self.assertEqual(hamming_distance("", "G"), -1)
        self.assertEqual(hamming_distance("G", "A"), 1)
        self.assertEqual(hamming_distance("G", "G"), 0)
        self.assertEqual(hamming_distance("GA", "GA"), 0)
        self.assertEqual(hamming_distance("GA", "AG"), 2)
        self.assertEqual(hamming_distance("AGCT", "AGCT"), 0)
        self.assertEqual(hamming_distance("AGCT", "TCGA"), 4)
        self.assertEqual(hamming_distance("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT"), 7)


if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 1

template2_1_sol.py
import unittest


def hamming_distance(s, t):
    if len(s) != len(t):
        return -1
    c = 0
    for i in range(len(s)):
        if s[i] != t[i]:
            c += 1
    return c


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestHammingDistance(unittest.TestCase):
    def test_HD(self):
        self.assertEqual(hamming_distance("G", ""), -1)
        self.assertEqual(hamming_distance("", "G"), -1)
        self.assertEqual(hamming_distance("G", "A"), 1)
        self.assertEqual(hamming_distance("G", "G"), 0)
        self.assertEqual(hamming_distance("GA", "GA"), 0)
        self.assertEqual(hamming_distance("GA", "AG"), 2)
        self.assertEqual(hamming_distance("AGCT", "AGCT"), 0)
        self.assertEqual(hamming_distance("AGCT", "TCGA"), 4)
        self.assertEqual(hamming_distance("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT"), 7)


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template2_1_sol.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Άσκηση E2A2 - Γράψτε μια συνάρτηση που να ελέγχει αν μια φράση είναι παντόγραμμα, δηλαδή περιλαμβάνει και τα 24 γράμματα του Ελληνικού αλφαβήτου. Τροποποιήστε το ακόλουθο template κώδικα έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.

template2_2.py
import unittest


def is_pangram(s):
    greekletters = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
    ...


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestPantogram(unittest.TestCase):
    def test(self):
        self.assertEqual(is_pangram("ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"), True)
        self.assertEqual(is_pangram("ΩΨΧΦΥΤΣΡΠΟΞΝΜΛΚΙΘΗΖΕΔΓΒΑ"), True)
        self.assertEqual(is_pangram("ΞΕΣΚΕΠΑΖΩ ΤΗΝ ΨΥΧΟΦΘΟΡΟ ΒΔΕΛΥΓΜΙΑ"), True)
        self.assertEqual(
            is_pangram(
                "Ο ΚΑΛΥΜΝΙΟΣ ΣΦΟΥΓΓΑΡΑΣ ΨΙΘΥΡΙΣΕ ΠΩΣ ΘΑ ΒΟΥΤΗΞΕΙ ΧΩΡΙΣ ΝΑ ΔΙΣΤΑΖΕΙ"
            ),
            True,
        )
        self.assertEqual(is_pangram(""), False)
        self.assertEqual(is_pangram("A" * 24), False)
        self.assertEqual(is_pangram("ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨA"), False)


if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 2

template2_2_sol.py
import unittest


def is_pangram(s):
    greekletters = "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
    a_set = set()
    for c in greekletters:
        a_set.add(c)

    for c in s.upper():
        if c in a_set:
            a_set.remove(c)

    return len(a_set) == 0


# συντομότερη λύση
# def is_pangram(s):
#     return len({c for c in "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"} - {c for c in s}) == 0


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestPantogram(unittest.TestCase):
    def test(self):
        self.assertEqual(is_pangram("ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"), True)
        self.assertEqual(is_pangram("ΩΨΧΦΥΤΣΡΠΟΞΝΜΛΚΙΘΗΖΕΔΓΒΑ"), True)
        self.assertEqual(is_pangram("ΞΕΣΚΕΠΑΖΩ ΤΗΝ ΨΥΧΟΦΘΟΡΟ ΒΔΕΛΥΓΜΙΑ"), True)
        self.assertEqual(
            is_pangram(
                "Ο ΚΑΛΥΜΝΙΟΣ ΣΦΟΥΓΓΑΡΑΣ ΨΙΘΥΡΙΣΕ ΠΩΣ ΘΑ ΒΟΥΤΗΞΕΙ ΧΩΡΙΣ ΝΑ ΔΙΣΤΑΖΕΙ"
            ),
            True,
        )
        self.assertEqual(is_pangram(""), False)
        self.assertEqual(is_pangram("A" * 24), False)
        self.assertEqual(is_pangram("ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨA"), False)


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template2_2_sol.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Άσκηση E2A3 - Γράψτε μια συνάρτηση που να δέχεται ένα κείμενο, να αφαιρεί τα σύμβολα τελεία και κόμμα, να εντοπίζει το μεγαλύτερο μήκος λέξης που περιέχει και να επιστρέφει μια λίστα με όλες τις λέξεις του κειμένου με μήκος ίσο με το μεγαλύτερο μήκος, ταξινομημένες σε αύξουσα σειρά. Τροποποιήστε το ακόλουθο template κώδικα έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.

template2_3.py
import unittest


def longest_words(s):
    pass


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestLongestWords(unittest.TestCase):
    def test(self):
        s1 = ""
        self.assertEqual(longest_words(s1), [])
        s2 = "arta"
        self.assertEqual(longest_words(s2), ["arta"])
        s3 = "arta Άρτα"
        self.assertEqual(longest_words(s3), ["arta", "Άρτα"])
        s4 = "....arta,,, Άρτα....."
        self.assertEqual(longest_words(s4), ["arta", "Άρτα"])
        s5 = "ab,,cd..ef gh.."
        self.assertEqual(longest_words(s5), ["ab", "cd", "ef", "gh"])
        s6 = """Το Lorem Ipsum είναι απλά ένα κείμενο χωρίς νόημα για τους επαγγελματίες της τυπογραφίας και στοιχειοθεσίας Το Lorem Ipsum είναι το επαγγελματικό πρότυπο όσον αφορά το κείμενο χωρίς νόημα, από τον 15ο αιώνα, όταν ένας ανώνυμος τυπογράφος πήρε ένα δοκίμιο και ανακάτεψε τις λέξεις για να δημιουργήσει ένα δείγμα βιβλίου Όχι μόνο επιβίωσε πέντε αιώνες αλλά κυριάρχησε στην ηλεκτρονική στοιχειοθεσία παραμένοντας με κάθε τρόπο αναλλοίωτο Έγινε δημοφιλές τη δεκαετία του '60 με την έκδοση των δειγμάτων της Letraset όπου περιελάμβαναν αποσπάσματα του Lorem Ipsum και πιο πρόσφατα με το λογισμικό ηλεκτρονικής σελιδοποίησης όπως το Aldus PageMaker που περιείχαν εκδοχές του Lorem Ipsum"""
        self.assertEqual(longest_words(s6), ["στοιχειοθεσίας"])
        s7 = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."""
        self.assertEqual(longest_words(s7), ["reprehenderit"])


if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 3

template2_3_sol.py
import unittest


def longest_words(s):
    s = s.replace(".", " ")
    s = s.replace(",", " ")
    words = [w.strip() for w in s.split()]
    if words == []:
        return []
    max_length = max([len(w) for w in words])
    return sorted([w for w in words if len(w) == max_length])


# Mην αλλάξετε κάτι από εδώ και κάτω
class TestLongestWords(unittest.TestCase):
    def test(self):
        s1 = ""
        self.assertEqual(longest_words(s1), [])
        s2 = "arta"
        self.assertEqual(longest_words(s2), ["arta"])
        s3 = "arta Άρτα"
        self.assertEqual(longest_words(s3), ["arta", "Άρτα"])
        s4 = "....arta,,, Άρτα....."
        self.assertEqual(longest_words(s4), ["arta", "Άρτα"])
        s5 = "ab,,cd..ef gh.."
        self.assertEqual(longest_words(s5), ["ab", "cd", "ef", "gh"])
        s6 = """Το Lorem Ipsum είναι απλά ένα κείμενο χωρίς νόημα για τους επαγγελματίες της τυπογραφίας και στοιχειοθεσίας Το Lorem Ipsum είναι το επαγγελματικό πρότυπο όσον αφορά το κείμενο χωρίς νόημα, από τον 15ο αιώνα, όταν ένας ανώνυμος τυπογράφος πήρε ένα δοκίμιο και ανακάτεψε τις λέξεις για να δημιουργήσει ένα δείγμα βιβλίου Όχι μόνο επιβίωσε πέντε αιώνες αλλά κυριάρχησε στην ηλεκτρονική στοιχειοθεσία παραμένοντας με κάθε τρόπο αναλλοίωτο Έγινε δημοφιλές τη δεκαετία του '60 με την έκδοση των δειγμάτων της Letraset όπου περιελάμβαναν αποσπάσματα του Lorem Ipsum και πιο πρόσφατα με το λογισμικό ηλεκτρονικής σελιδοποίησης όπως το Aldus PageMaker που περιείχαν εκδοχές του Lorem Ipsum"""
        self.assertEqual(longest_words(s6), ["στοιχειοθεσίας"])
        s7 = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."""
        self.assertEqual(longest_words(s7), ["reprehenderit"])


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template2_3_sol.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Άσκηση E2A4 - Για την ακόλουθη λίστα τιμών 56, 37, 771, 90, 16, 11 γράψτε comprehensions που να κάνουν τα ακόλουθα:

  1. Να δημιουργεί νέα λίστα με το πλήθος των ψηφίων κάθε τιμής.
  2. Να δημιουργεί νέα λίστα με τα ψηφία κάθε τιμής σε αντίστροφη σειρά.
  3. Να δημιουργεί νέα λίστα μόνο με τις τιμές που είναι μεγαλύτερες από το μέσο όρο των τιμών.
  4. Να δημιουργεί νέα λίστα με ζεύγη τιμών που το πρώτο στοιχείο κάθε ζεύγους να είναι η ίδια τιμή και δεύτερο στοιχείο μια λογική τιμή με τιμή True αν η τιμή είναι άρτια αλλιώς η τιμή False.

Τροποποιήστε το ακόλουθο template κώδικα έτσι ώστε η λύση σας να επιτυγχάνει σε όλα τα unit tests.

template2_4.py
import unittest


class TestComprehensions(unittest.TestCase):
    def test1(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = None # αλλάξτε αυτή την εντολή για να απαντήσετε το ερώτημα 1
        self.assertEqual(b_list, [2,2,3,2,2,2])         

    def test2(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = None # αλλάξτε αυτή την εντολή για να απαντήσετε το ερώτημα 2
        self.assertEqual(b_list, [65,73,177,9,61,11])         

    def test3(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = None # αλλάξτε αυτή την εντολή για να απαντήσετε το ερώτημα 3
        self.assertEqual(b_list, [771])         

    def test4(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = None # αλλάξτε αυτή την εντολή για να απαντήσετε το ερώτημα 4
        self.assertEqual(b_list, [(56,True), (37,False), (771,False), (90, True), (16, True), (11, False)]) 

if __name__ == "__main__":
    unittest.main()
Λύση άσκησης 4

template2_4_sol.py
import unittest


class TestComprehensions(unittest.TestCase):
    def test1(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = [len(str(x)) for x in a_list]
        self.assertEqual(b_list, [2,2,3,2,2,2])         

    def test2(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = [int(str(x)[::-1]) for x in a_list]
        self.assertEqual(b_list, [65,73,177,9,61,11])         

    def test3(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = [x for x in a_list if x > sum(a_list)/len(a_list)]
        self.assertEqual(b_list, [771])         

    def test4(self):
        a_list = [56, 37, 771, 90, 16, 11]
        b_list = [(x, x%2==0) for x in a_list]
        self.assertEqual(b_list, [(56,True), (37,False), (771,False), (90, True), (16, True), (11, False)])         


if __name__ == "__main__":
    unittest.main()
Παράδειγμα εκτέλεσης:
$ python template2_4_sol.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.000s

OK

Επιπλέον εξάσκηση

Άσκηση E2A5 Σε έναν φάκελο στην επιφάνεια εργασίας με όνομα e2a5, από τη γραμμή εντολών δημιουργήστε ένα virtual environment με όνομα myenv και ενεργοποιήστε το με τις ακόλουθες εντολές σε Windows:

> python -m venv myenv
> myenv\Scripts\activate.bat

ή με τις ακόλουθες εντολές σε Linux ή MacOS:

$ python -m venv myenv
$ source myenv/bin/activate

Εγκαταστήστε στο myenv με το pip τη βιβλιοθήκη Faker.

(myenv) > pip install faker

Δημιουργήστε στοιχεία (όνομα, διεύθυνση, ημερομηνία γέννησης) για 100 υποθετικά άτομα ηλικιών από 18 έως 90 ετών και αποθηκεύστε τα σε ένα αρχείο με όνομα fake100.txt με ελληνικά ερωτηματικά (;) ως διαχωριστικά των στοιχείων κάθε ατόμου. Συμβουλευτείτε την τεκμηρίωση της βιβλιοθήκης για τις συναρτήσεις που πρέπει να καλέσετε. Φροντίστε έτσι ώστε η εκτέλεση του κώδικα να δίνει κάθε φορά τις ίδιες τιμές.

Ακολουθεί ένα απόσπασμα τυχαίων τιμών που μπορεί να δημιουργούνται:

Allison Hill;819 Johnson Course, East William, AK 74064;1947-09-15
Kimberly Robinson;65423 Garcia Light, West Melanieview, AS 06196;1986-06-17
Valerie Gray;310 Kendra Common Apt. 164, Reidstad, GA 49021;1959-02-15
Mia Sutton;327 Nelson Route, Lake Mark, WI 07832;1949-11-29
Λύση άσκησης 5

e2a5.py
from faker import Faker

fake = Faker()
Faker.seed(42)


def generate_fake_person():
    name = fake.name()
    address = fake.address().replace("\n", ", ")
    birthdate = fake.date_of_birth(minimum_age=18, maximum_age=90)
    return f"{name};{address};{birthdate}"


def generate_fake_persons(num_persons=100):
    persons = []
    for _ in range(num_persons):
        person = generate_fake_person()
        persons.append(person)
    return persons


def write_to_file(data, filename):
    with open(filename, "w", encoding="utf-8") as file:
        for person in data:
            file.write(person + "\n")


if __name__ == "__main__":
    num_persons = 100
    fake_persons = generate_fake_persons(num_persons)
    filename = "fake100.txt"
    write_to_file(fake_persons, filename)
    print(
        f"Δημιουργία στοιχείων {num_persons} υποθετικών ατόμων και αποθήκευση στο αρχείο {filename}."
    )
Παράδειγμα εκτέλεσης:
$ python e2a5.py
Δημιουργία στοιχείων 100 υποθετικών ατόμων και αποθήκευση στο αρχείο fake100.txt.
fake100.txt
Allison Hill;819 Johnson Course, East William, AK 74064;1947-09-15
Kimberly Robinson;65423 Garcia Light, West Melanieview, AS 06196;1986-06-17
Valerie Gray;310 Kendra Common Apt. 164, Reidstad, GA 49021;1959-02-15
Mia Sutton;327 Nelson Route, Lake Mark, WI 07832;1949-11-29
Ethan Adams;76724 John Points Suite 969, Coxberg, NY 65187;1939-10-29
Brian Burton;166 Rice Plaza Apt. 184, Danielchester, GA 59971;1933-06-05
Michelle Stanton;489 Eric Track, New Stephanie, NC 00575;1976-11-29
Brian Cox DVM;39117 Tiffany Place, East Donna, OH 22144;1952-07-16
Jenny Lewis;465 Lam Mission, East Jeffreymouth, AK 77611;1973-08-17
Adrienne Zimmerman;51834 Lewis Curve, Sanchezfort, AS 53855;1947-02-02
Jeffrey Henderson;106 Mcbride Coves, East James, NV 18874;1963-12-27
David Leblanc;80132 Tucker Forest, Barreraburgh, MS 00783;2005-02-12
Richard Gibson;34309 Julie Centers Apt. 978, North Susan, CO 24857;1938-03-11
Scott Powell;USNS Riley, FPO AE 81684;1939-03-05
Krystal Stewart;46247 Hickman Cliffs Apt. 799, North Amandahaven, KS 17862;2001-04-26
Sherry Wood;808 Huynh Cove Apt. 411, West Juan, IL 94559;1958-03-22
Sarah Wagner;64005 Dana Greens, Lake Scott, VT 56558;1974-02-19
Tony Vazquez;9826 Bobby Lakes, West Jasonbury, TN 13974;1959-01-04
Shelly Dickson;26025 Pham Way, West Erik, UT 14669;1961-02-11
John Gonzalez;PSC 5433, Box 0365, APO AA 09600;2003-10-10
Martin Ross;Unit 8501 Box 4294, DPO AE 14709;1976-09-27
Richard Graham;Unit 1693 Box 4060, DPO AP 71076;1983-05-01
Nancy Gonzalez;514 Estrada Islands Suite 482, South Elizabeth, MS 89278;1987-10-21
Keith Sullivan;3699 Marshall Mills Apt. 872, West Zacharymouth, CO 98954;1950-05-03
Robert Hernandez;176 Jennifer Lights Suite 632, Port Michelleville, WI 56225;1949-03-01
Melissa Marshall;2788 Dodson Mills, Rivasside, NV 21362;1987-06-24
David Wright;347 Jennifer Freeway Suite 558, East Edwardfurt, UT 20529;1984-10-04
Jason Daniels;6909 Woods Knoll, Karenchester, ND 98479;1986-10-26
Stephanie Freeman;65627 Tina Place Apt. 699, North Dawnberg, VI 61016;1946-06-16
Garrett Gibson;6417 Kaitlyn Center Suite 310, East Jamestown, RI 20474;1950-08-09
Brian Gould;2991 Tami Coves Apt. 496, Davidborough, CA 78108;1983-08-09
Ashley Barton;058 Stanley Cliff, Alexanderchester, GU 64752;1940-11-22
Madison Poole;84987 Graham Street Suite 531, Nicolebury, WV 61411;1974-10-15
Gabrielle Snyder;54549 Peters Path Apt. 136, Petersbury, UT 62903;1980-05-04
Ricky Davis II;957 Coleman Summit Suite 574, Johnville, VA 25743;1956-03-23
Tiffany Vaughn;9894 Marissa Hill Apt. 524, Lake Amandaview, AZ 07647;1973-08-02
Beth Oneill;477 Peterson Center, Shelleyfort, DE 09065;1962-06-11
Mark Brown;31869 Kimberly Light Suite 749, Torreston, RI 97505;1940-06-07
Lori Baker;81206 Norris Mountains, Antonioport, VT 37557;1984-07-04
Michael Bradshaw;1832 Serrano Cliffs, East Laurashire, PW 38329;1965-04-01
Eric Powell;1906 Munoz Burg Apt. 399, Port Emilyview, OK 05774;1988-11-23
Joseph Ramos;717 Ortiz Islands Apt. 256, Robertsfurt, GU 72603;1935-11-14
David Wilson;876 Jacob Lake, Garrettton, IL 35504;1973-04-13
Jessica Wolfe;248 Andrea Course, Port Robin, NH 15897;1980-06-21
Timothy Carter;7378 Patrick Rapid Apt. 146, Sarahhaven, KY 00837;1953-11-02
Kevin Duarte;8755 Gibson Islands, Lake John, MS 31114;1995-09-05
Evan Kennedy;PSC 6627, Box 0289, APO AA 13655;1997-01-02
Joseph Bryant;217 Morgan Square Suite 158, Finleyfort, VI 71413;1935-10-24
Mark Mccall;Unit 1611 Box 7240, DPO AE 43017;1991-04-23
James Thomas;21969 Tyler Prairie, East Steven, KS 60737;1951-10-30
Robert Santana;75946 Bryant Hollow, South Melissa, CT 31592;1961-01-11
Edward Lyons;0909 Wall Heights Apt. 953, New John, WV 94994;1989-03-20
Breanna Davis;7095 Christopher Hill, Julieburgh, ID 17823;1990-08-09
Holly Shaw;7451 Mccarty Divide, Port Erica, TX 52590;2003-10-20
Holly Gibbs;5496 Rodriguez Fort, Johnsonside, MD 80465;1949-05-08
Rodney Blankenship;20047 Colton Plain Apt. 675, Matthewsberg, FM 54880;1980-12-31
Lisa Crosby;77351 Stephens Rue Suite 064, North Stacy, GU 60101;1939-11-19
Mark Maddox;29318 Brenda Via Apt. 529, West Micheleberg, DC 71308;1951-06-28
Matthew Johnson;502 Williams Streets, Foxland, NJ 59257;1989-12-26
Ashley Gordon;USS Acosta, FPO AP 68848;1955-03-18
Amanda Lutz;177 Rachel Islands Apt. 124, Oscarhaven, LA 59970;1970-02-04
Ricky Wilson;7365 Ross Stream, West Ronaldview, MN 20507;1983-04-30
Brandon Miller;80988 Santiago Loop Suite 604, Michaelshire, NY 28385;1944-06-26
Dr. Gregory Hawkins;368 Chelsea Shoals Suite 024, Sandrastad, AL 24278;1996-09-09
Jennifer Thomas;83667 Moore Inlet, Kimberlyshire, PA 11636;1997-09-03
Paul Williams;679 Perry Forge Apt. 561, Erikashire, NM 69567;1981-11-21
James Greene;24451 Tyler Meadows Apt. 268, New Angelica, TN 46922;1938-06-14
Amanda Smith;PSC 5969, Box 6641, APO AA 03234;2003-09-21
Travis Stevens;61369 Warren Locks Suite 535, North William, DE 70048;1970-06-01
Hannah Luna;12432 Kathleen Shoal, East Stephaniefort, NH 99387;1974-05-05
Melanie Macias;527 Taylor Roads Suite 490, Williamport, NH 59734;1935-12-08
Dustin Newman;Unit 1998 Box 6798, DPO AP 05877;1966-01-08
Marissa Morris;71518 Benjamin Station, Ritterhaven, NC 80429;1944-10-11
Douglas Ortiz;515 Angela Lights, Johnathanberg, MA 11183;1975-09-24
Gregory Ponce;91486 Li Skyway Apt. 685, West Kyleborough, MA 64237;1947-03-17
Mrs. Elizabeth French DDS;592 Moore Falls, Lake Samuel, MT 48250;1982-07-25
Jeremy Mitchell;83473 Gregory Ports Suite 746, Burchborough, AS 79755;1943-04-18
Martin Sawyer;814 Kathryn Groves, Whiteheadberg, MP 57841;1939-11-20
Ruth Wilkerson;USCGC Brown, FPO AP 49516;1950-05-27
Jade Johnson DVM;20472 West Avenue Apt. 043, New Shelby, PA 69677;1964-02-02
Cynthia Martinez;17980 Jennifer Highway Suite 095, New Robert, TN 88085;1939-06-10
Andrea Fox;7065 Burgess Knolls, West Johnville, WI 76772;1986-11-10
Andrew Payne;772 Bryan Trail, Johnsonborough, AZ 26645;1997-11-07
Eric Sanders;0345 Michelle Isle Suite 156, Paulfurt, MA 24987;1969-05-31
Tim Stone PhD;9284 Garcia Islands, Kirkchester, GA 90909;1965-08-05
Nicholas Buck;0165 Stephanie Divide Suite 021, Port Deanna, MN 50682;2002-07-02
Christian Cole;92856 Banks Gateway Apt. 027, Mcintyreville, KS 34617;1984-08-01
Logan Benson;Unit 3121 Box 7271, DPO AP 42390;1981-12-10
Krista Roberts;258 David Flats, East Kristy, AK 47804;1973-08-19
Robert Arnold;46786 Morrow Cliffs, West Dawn, NV 61558;1982-11-02
Shawn Deleon;68018 Kevin Estates, Sarahbury, MI 68513;1998-07-09
Danielle Reid;498 Wayne Extension, East Donna, VA 79817;1957-11-01
Amanda Shields;396 Tyler Road Suite 473, Evansland, UT 08353;1944-09-23
John Peterson;562 Robertson Coves Suite 371, Shannonberg, CT 07133;1954-05-17
Luis Wright;9532 Ferrell Mountain, Kochfort, AK 12303;2002-03-11
Tracy Lewis;7974 Melanie Meadows, West Jessica, WV 53356;1959-11-26
Kelly Lee;8784 David Court, Brooksmouth, OH 48421;1988-04-20
Jordan Porter;578 Hernandez Passage, West Sarah, MD 21800;1961-11-16
Sarah Wheeler;947 Micheal Spring Apt. 694, New Thomasshire, OK 30325;1985-11-07
Carolyn Fuller;30913 Scott Manor Apt. 636, Salaston, VT 18599;1971-01-20

Άσκηση E2A6 Μια άλλη βιβλιοθήκη για unit tests είναι η εξωτερική βιβλιοθήκη pytest. Επιλύστε ξανά την άσκηση Ε2Α1 χρησιμοποιώντας αυτή τη φορά την pytest για τους ελέγχους.

Λύση άσκησης 6

Πρώτα θα πρέπει να εγκατασταθεί η βιβλιοθήκη pytest.

(myenv) > pip install pytest

Ο κώδικας που πραγματοποιεί τους ελέγχους με το pytest ακολουθεί:

e2a6_test.py
import pytest


def hamming_distance(s, t):
    if len(s) != len(t):
        return -1
    c = 0
    for i in range(len(s)):
        if s[i] != t[i]:
            c += 1
    return c


# Mην αλλάξετε κάτι από εδώ και κάτω
def test_HD():
    assert hamming_distance("G", "") == -1
    assert hamming_distance("", "G") == -1
    assert hamming_distance("G", "A") == 1
    assert hamming_distance("G", "G") == 0
    assert hamming_distance("GA", "GA") == 0
    assert hamming_distance("GA", "AG") == 2
    assert hamming_distance("AGCT", "AGCT") == 0
    assert hamming_distance("AGCT", "TCGA") == 4
    assert hamming_distance("GAGCCTACTAACGGGAT", "CATCGTAATGACGGCCT") == 7


if __name__ == "__main__":
    pytest.main()
Παράδειγμα εκτέλεσης:
$ python e2a6_test.py
============================ test session starts =============================
platform darwin -- Python 3.10.12, pytest-8.1.1, pluggy-1.4.0
rootdir: XXX/src/python/lab2
plugins: Faker-24.1.0
collected 1 item

e2a6_test.py .                                                         [100%]

============================= 1 passed in 0.02s ==============================
Στο pytest το όνομα του αρχείου που περιέχει τα tests πρέπει να ξεκινά με test_ ή να τελειώνει με _test.py. Επίσης, τα ονόματα των συναρτήσεων με τους ελέγχους πρέπει να ξεκινούν με test_ ή η κλάση που περιέχει ως μεθόδους τους ελέγχους να έχει όνομα που να ξεκινά με Test.