Heim  >  Artikel  >  Backend-Entwicklung  >  Lernen Sie Python mit Jupyter Notebook

Lernen Sie Python mit Jupyter Notebook

coldplay.xixi
coldplay.xixinach vorne
2020-09-28 16:26:342909Durchsuche

Mit Jupyter, PyHamcrest und einem kleinen Testcode, der sie miteinander verbindet, können Sie jeden Python-Inhalt unterrichten, der für Unit-Tests geeignet ist. In der Spalte „Python-Video-Tutorial“ erhalten Sie eine detaillierte Einführung. ~

Einige Dinge an der Ruby-Community haben mich schon immer beeindruckt, zwei Beispiele dafür sind das Engagement für das Testen und die Betonung der Benutzerfreundlichkeit des Einstiegs. Das beste Beispiel für beides ist Ruby Koans, wo Sie Ruby lernen können, indem Sie Tests durchführen.

Wenn wir diese erstaunlichen Tools nur in Python integrieren könnten, sollten wir es besser machen können. Ja, mit Jupyter Notebook, PyHamcrest und einem kleinen Klebeband-ähnlichen Klebecode können wir ein Tutorial erstellen, das Anweisungen, Arbeitscode und Code enthält, der korrigiert werden muss. Zuerst benötigen Sie etwas „Klebeband“. Normalerweise verwenden Sie für Ihre Tests einen raffinierten Befehlszeilentester wie Pytest oder Virtue. Oft wird es nicht einmal direkt ausgeführt. Zum Ausführen verwenden Sie ein Tool wie tox oder nox. Bei Jupyter müssen Sie jedoch einen kleinen Klebercode schreiben, mit dem Sie den Test direkt ausführen können.

Glücklicherweise ist dieser Code kurz und einfach: Lernen Sie Python mit Jupyter Notebook

import unittest

def run_test(klass):
    suite = unittest.TestLoader().loadTestsFromTestCase(klass)
    unittest.TextTestRunner(verbosity=2).run(suite)
    return klass复制代码

Jetzt ist die Ausrüstung bereit für Ihre erste Übungseinheit.

Beim Unterrichten ist es immer eine gute Idee, mit einer einfachen Übung zu beginnen, um Selbstvertrauen aufzubauen.

Lassen Sie uns also einen sehr einfachen Test durchführen:

@run_test
class TestNumbers(unittest.TestCase):
   
    def test_equality(self):
        expected_value = 3 # 只改这一行
        self.assertEqual(1+1, expected_value)复制代码
    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)复制代码

„Ändere nur diese Zeile“ ist eine nützliche Notation für Schüler. Es zeigt genau an, was geändert werden muss. Andernfalls können die Schüler den Test korrigieren, indem sie die erste Zeile in return ändern.

In diesem Fall ist die Lösung einfach:

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

Bald werden sich jedoch die nativen Behauptungen der unittest-Bibliothek als unzureichend erweisen. In pytest wird dieses Problem gelöst, indem der Bytecode in assert umgeschrieben wird, um magische Eigenschaften und verschiedene Heuristiken zu haben. Dies ist jedoch im Jupyter-Notebook nicht einfach zu erreichen. Es ist Zeit, eine gute Assertionsbibliothek auszugraben: 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))复制代码
    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)复制代码

PyHamcrest ist nicht nur gut für flexible Behauptungen, sondern auch für klare Fehlermeldungen. Aus diesem Grund liegt das Problem auf der Hand. [1, 5, 3] enthält kein 2 und sieht hässlich aus:

@run_test
class TestList(unittest.TestCase):
   
    def test_equality(self):
        things = [1,
                  2, # 改完的行
                  3]
        assert_that(things, has_items(1, 2, 3))复制代码
    test_equality (__main__.TestList) ... ok
   
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
   
    OK复制代码

Mit Jupyter, PyHamcrest und ein wenig getestetem Glue-Code können Sie alles Python-Theme beibringen Unit-Tests.

return 来修复测试。

在这种情况下,修复很容易:

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")))复制代码
    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)复制代码

然而,很快,unittest 库的原生断言将被证明是不够的。在 pytest 中,通过重写 assert 中的字节码来解决这个问题,使其具有神奇的属性和各种启发式方法。但这在 Jupyter notebook 中就不容易实现了。是时候挖出一个好的断言库了:PyHamcrest。

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")))复制代码
    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)复制代码

PyHamcrest 不仅擅长灵活的断言,它还擅长清晰的错误信息。正因为如此,问题就显而易见了。[1, 5, 3] 不包含 2,而且看起来很丑:

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.lstrip() # Fixed this line
        assert_that(result,
                   all_of(starts_with("hello"), ends_with("world  ")))

    def test_end_strip(self):
        result = source_string.rstrip() # Fixed this line
        assert_that(result,
                   all_of(starts_with("  hello"), ends_with("world")))复制代码
    test_complete_strip (__main__.TestList) ... ok
    test_end_strip (__main__.TestList) ... ok
    test_start_strip (__main__.TestList) ... ok
   
    ----------------------------------------------------------------------
    Ran 3 tests in 0.005s
   
    OK复制代码

使用 Jupyter、PyHamcrest 和一点测试的粘合代码,你可以教授任何适用于单元测试的 Python 主题。

例如,下面可以帮助展示 Python 从字符串中去掉空白的不同方法之间的差异。

rrreeerrreee

理想情况下,学生们会意识到 .lstrip().rstrip() 这两个方法可以满足他们的需要。但如果他们不这样做,而是试图到处使用 .strip()Das Folgende zeigt beispielsweise die Unterschiede zwischen den verschiedenen Methoden von Python zum Entfernen von Leerzeichen aus Zeichenfolgen.

rrreeerrreee

Im Idealfall werden die Schüler erkennen, dass .lstrip() und .rstrip() ihren Bedürfnissen entsprechen. Aber wenn sie das nicht tun und stattdessen versuchen, .strip() überall zu verwenden:

rrreeerrreee

, erhalten sie eine andere Fehlermeldung, die anzeigt, dass zu viel Leerraum entfernt wurde:

rrreeerrreee

in einem In realistischere Tutorials, es wird mehr Beispiele und mehr Erklärungen geben. Diese Technik der Verwendung von Jupyter Notebook kann für einige Beispiele verwendet werden, und einige Beispiele müssen korrigiert werden. Sie kann für den Echtzeitunterricht, für Videounterricht und sogar für andere verstreute Zwecke verwendet werden, sodass Schüler ein Tutorial absolvieren können selbst.

Teilen Sie jetzt Ihr Wissen!

Weitere verwandte kostenlose Lernempfehlungen: Python-Video-Tutorial

🎜🎜

Das obige ist der detaillierte Inhalt vonLernen Sie Python mit Jupyter Notebook. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen