Maison développement back-end Tutoriel Python Apprenez Python à l'aide de Jupyter Notebook

Apprenez Python à l'aide de Jupyter Notebook

Sep 28, 2020 pm 04:26 PM
apprendre Python

Avec Jupyter, PyHamcrest et un petit code de test qui les relie ensemble, vous pouvez enseigner n'importe quel élément Python qui fonctionne pour les tests unitaires.

Tutoriel vidéo Python la colonne vous donnera une introduction détaillée~

Apprenez Python à laide de Jupyter Notebook

Certaines choses à propos de la communauté Ruby m'ont toujours impressionné, deux exemples étant l'engagement envers les tests et l'accent mis sur la facilité de démarrage. Le meilleur exemple des deux est Ruby Koans, où vous pouvez apprendre Ruby en corrigeant des tests.

Nous pourrions faire mieux si nous pouvions également intégrer ces outils incroyables à Python. Oui, en utilisant Jupyter Notebook, PyHamcrest et un petit code de colle semblable à du ruban adhésif, nous pouvons créer un didacticiel comprenant des instructions, du code de travail et du code à corriger.

Tout d'abord, vous avez besoin d'une "bande". En règle générale, vous utiliserez un astucieux testeur de ligne de commande comme pytest ou vertu pour effectuer vos tests. Souvent, vous ne l’exécuterez même pas directement. Vous utilisez un outil comme tox ou nox pour l'exécuter. Cependant, avec Jupyter, vous devez écrire un petit morceau de code Glue dans lequel vous pouvez exécuter le test directement.

Heureusement, ce code est court et simple :

import unittest

def run_test(klass):
    suite = unittest.TestLoader().loadTestsFromTestCase(klass)
    unittest.TextTestRunner(verbosity=2).run(suite)
    return klass复制代码
Copier après la connexion

Maintenant, l'équipement est prêt pour votre première séance d'entraînement.

Quand on enseigne, c'est toujours une bonne idée de commencer par un exercice simple pour renforcer la confiance.

Alors, corrigeons un test très simple :

@run_test
class TestNumbers(unittest.TestCase):
   
    def test_equality(self):
        expected_value = 3 # 只改这一行
        self.assertEqual(1+1, expected_value)复制代码
Copier après la connexion
    test_equality (__main__.TestNumbers) ... FAIL
   
    ======================================================================
    FAIL: test_equality (__main__.TestNumbers)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-7-5ebe25bc00f3>", line 6, in test_equality
        self.assertEqual(1+1, expected_value)
    AssertionError: 2 != 3
   
    ----------------------------------------------------------------------
    Ran 1 test in 0.002s
   
    FAILED (failures=1)复制代码
Copier après la connexion

« Changez uniquement cette ligne » est une balise utile pour les étudiants. Il indique exactement ce qui doit être modifié. Sinon, les étudiants peuvent corriger le test en remplaçant la première ligne par return.

Dans ce cas, la solution est simple :

@run_test
class TestNumbers(unittest.TestCase):
   
    def test_equality(self):
        expected_value = 2 # 修复后的代码行
        self.assertEqual(1+1, expected_value)复制代码
Copier après la connexion
    test_equality (__main__.TestNumbers) ... ok
   
    ----------------------------------------------------------------------
    Ran 1 test in 0.002s
   
    OK复制代码
Copier après la connexion

Bientôt, cependant, les assertions natives de la unittest bibliothèque se révéleront insuffisantes. Dans pytest, ce problème est résolu en réécrivant le bytecode dans assert pour avoir des propriétés magiques et diverses heuristiques. Mais ce n’est pas facile à réaliser dans le notebook Jupyter. Il est temps de trouver une bonne bibliothèque d'assertions : PyHamcrest.

from hamcrest import *
@run_test
class TestList(unittest.TestCase):
   
    def test_equality(self):
        things = [1,
                  5, # 只改这一行
                  3]
        assert_that(things, has_items(1, 2, 3))复制代码
Copier après la connexion
rrree

PyHamcrest n'est pas seulement bon pour les assertions flexibles, il est également bon pour les messages d'erreur clairs. Pour cette raison, le problème est évident. [1, 5, 3] ne contient pas 2 et a l'air moche :

    test_equality (__main__.TestList) ... FAIL
   
    ======================================================================
    FAIL: test_equality (__main__.TestList)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-11-96c91225ee7d>", line 8, in test_equality
        assert_that(things, has_items(1, 2, 3))
    AssertionError:
    Expected: (a sequence containing <1> and a sequence containing <2> and a sequence containing <3>)
         but: a sequence containing <2> was <[1, 5, 3]>
   
   
    ----------------------------------------------------------------------
    Ran 1 test in 0.004s
   
    FAILED (failures=1)复制代码
Copier après la connexion
@run_test
class TestList(unittest.TestCase):
   
    def test_equality(self):
        things = [1,
                  2, # 改完的行
                  3]
        assert_that(things, has_items(1, 2, 3))复制代码
Copier après la connexion

En utilisant Jupyter, PyHamcrest et un petit code de colle de test, vous pouvez enseigner n'importe quel sujet Python adapté aux tests unitaires.

Par exemple, ce qui suit permet de démontrer les différences entre les différentes manières dont Python supprime les espaces des chaînes.

    test_equality (__main__.TestList) ... ok
   
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
   
    OK复制代码
Copier après la connexion
rrree

Idéalement, les étudiants se rendront compte que .lstrip() et .rstrip() répondront à leurs besoins. Mais s'ils ne le font pas et essaient plutôt d'utiliser .strip() partout :

source_string = "  hello world  "

@run_test
class TestList(unittest.TestCase):
   
    # 这是个赠品:它可以工作!
    def test_complete_strip(self):
        result = source_string.strip()
        assert_that(result,
                   all_of(starts_with("hello"), ends_with("world")))

    def test_start_strip(self):
        result = source_string # 只改这一行
        assert_that(result,
                   all_of(starts_with("hello"), ends_with("world  ")))

    def test_end_strip(self):
        result = source_string # 只改这一行
        assert_that(result,
                   all_of(starts_with("  hello"), ends_with("world")))复制代码
Copier après la connexion
    test_complete_strip (__main__.TestList) ... ok
    test_end_strip (__main__.TestList) ... FAIL
    test_start_strip (__main__.TestList) ... FAIL
   
    ======================================================================
    FAIL: test_end_strip (__main__.TestList)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-16-3db7465bd5bf>", line 19, in test_end_strip
        assert_that(result,
    AssertionError:
    Expected: (a string starting with &#39;  hello&#39; and a string ending with &#39;world&#39;)
         but: a string ending with &#39;world&#39; was &#39;  hello world  &#39;
   
   
    ======================================================================
    FAIL: test_start_strip (__main__.TestList)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-16-3db7465bd5bf>", line 14, in test_start_strip
        assert_that(result,
    AssertionError:
    Expected: (a string starting with &#39;hello&#39; and a string ending with &#39;world  &#39;)
         but: a string starting with &#39;hello&#39; was &#39;  hello world  &#39;
   
   
    ----------------------------------------------------------------------
    Ran 3 tests in 0.006s
   
    FAILED (failures=2)复制代码
Copier après la connexion

, ils recevront un message d'erreur différent qui montre trop d'espaces supprimés :

source_string = "  hello world  "

@run_test
class TestList(unittest.TestCase):
   
    # 这是个赠品:它可以工作!
    def test_complete_strip(self):
        result = source_string.strip()
        assert_that(result,
                   all_of(starts_with("hello"), ends_with("world")))

    def test_start_strip(self):
        result = source_string.strip() # 改完的行
        assert_that(result,
                   all_of(starts_with("hello"), ends_with("world  ")))

    def test_end_strip(self):
        result = source_string.strip() # 改完的行
        assert_that(result,
                   all_of(starts_with("  hello"), ends_with("world")))复制代码
Copier après la connexion
    test_complete_strip (__main__.TestList) ... ok
    test_end_strip (__main__.TestList) ... FAIL
    test_start_strip (__main__.TestList) ... FAIL
   
    ======================================================================
    FAIL: test_end_strip (__main__.TestList)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-17-6f9cfa1a997f>", line 19, in test_end_strip
        assert_that(result,
    AssertionError:
    Expected: (a string starting with &#39;  hello&#39; and a string ending with &#39;world&#39;)
         but: a string starting with &#39;  hello&#39; was &#39;hello world&#39;
   
   
    ======================================================================
    FAIL: test_start_strip (__main__.TestList)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "<ipython-input-17-6f9cfa1a997f>", line 14, in test_start_strip
        assert_that(result,
    AssertionError:
    Expected: (a string starting with &#39;hello&#39; and a string ending with &#39;world  &#39;)
         but: a string ending with &#39;world  &#39; was &#39;hello world&#39;
   
   
    ----------------------------------------------------------------------
    Ran 3 tests in 0.007s
   
    FAILED (failures=2)复制代码
Copier après la connexion

dans un In des tutoriels plus réalistes, il y aura plus d'exemples et plus d'explications. Cette technique d'utilisation de Jupyter Notebook peut être utilisée pour certains exemples, et certains exemples doivent être corrigés. Elle peut être utilisée pour l'enseignement en temps réel, pour des cours vidéo et même à d'autres fins dispersées, permettant aux étudiants de terminer un didacticiel en. eux-mêmes.

Partagez vos connaissances maintenant !

Plus de recommandations d'apprentissage gratuites connexes : Tutoriel vidéo Python

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Comment résoudre le problème des autorisations rencontré lors de la visualisation de la version Python dans le terminal Linux? Apr 01, 2025 pm 05:09 PM

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Comment enseigner les bases de la programmation novice en informatique dans le projet et les méthodes axées sur les problèmes dans les 10 heures? Apr 02, 2025 am 07:18 AM

Comment enseigner les bases de la programmation novice en informatique dans les 10 heures? Si vous n'avez que 10 heures pour enseigner à l'informatique novice des connaissances en programmation, que choisissez-vous d'enseigner ...

Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Comment copier efficacement la colonne entière d'une dataframe dans une autre dataframe avec différentes structures dans Python? Apr 01, 2025 pm 11:15 PM

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Comment éviter d'être détecté par le navigateur lors de l'utilisation de Fiddler partout pour la lecture de l'homme au milieu? Apr 02, 2025 am 07:15 AM

Comment éviter d'être détecté lors de l'utilisation de FiddlereVerywhere pour les lectures d'homme dans le milieu lorsque vous utilisez FiddlereVerywhere ...

Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Comment Uvicorn écoute-t-il en permanence les demandes HTTP sans servir_forever ()? Apr 01, 2025 pm 10:51 PM

Comment Uvicorn écoute-t-il en permanence les demandes HTTP? Uvicorn est un serveur Web léger basé sur ASGI. L'une de ses fonctions principales est d'écouter les demandes HTTP et de procéder ...

Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Comment créer dynamiquement un objet via une chaîne et appeler ses méthodes dans Python? Apr 01, 2025 pm 11:18 PM

Dans Python, comment créer dynamiquement un objet via une chaîne et appeler ses méthodes? Il s'agit d'une exigence de programmation courante, surtout si elle doit être configurée ou exécutée ...

See all articles