温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用Jupyter Notebook教Python

发布时间:2021-10-27 10:40:58 来源:亿速云 阅读:134 作者:iii 栏目:编程语言

本篇内容主要讲解“怎么用Jupyter Notebook教Python”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Jupyter Notebook教Python”吧!

首先,需要一些“胶布”。通常,你会使用一些漂亮的命令行测试器来做测试,比如 pytest 或 virtue。通常,你甚至不会直接运行它。你使用像 tox 或 nox 这样的工具来运行它。然而,对于 Jupyter 来说,你需要写一小段粘合代码,可以直接在其中运行测试。

幸运的是,这个代码又短又简单:

import unittest def run_test(klass):    suite = unittest.TestLoader().loadTestsFromTestCase(klass)    unittest.TextTestRunner(verbosity=2).run(suite)    return klass

现在,装备已经就绪,可以进行第一次练习了。

在教学中,从一个简单的练习开始,建立信心总是一个好主意。

那么,让我们来修复一个非常简单的测试:

@run_testclass 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)

“只改这一行” 对学生来说是一个有用的标记。它准确地表明了需要修改的内容。否则,学生可以通过将第一行改为 return 来修复测试。

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

@run_testclass 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

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

from hamcrest import *@run_testclass 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 不仅擅长灵活的断言,它还擅长清晰的错误信息。正因为如此,问题就显而易见了。[1, 5, 3] 不包含 2,而且看起来很丑:

@run_testclass 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

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

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

source_string = "  hello world  " @run_testclass 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 '  hello' and a string ending with 'world')         but: a string ending with 'world' was '  hello world  '          ======================================================================    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 'hello' and a string ending with 'world  ')         but: a string starting with 'hello' was '  hello world  '          ----------------------------------------------------------------------    Ran 3 tests in 0.006s       FAILED (failures=2)

理想情况下,学生们会意识到 .lstrip() 和 .rstrip() 这两个方法可以满足他们的需要。但如果他们不这样做,而是试图到处使用 .strip() 的话:

source_string = "  hello world  " @run_testclass 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 '  hello' and a string ending with 'world')         but: a string starting with '  hello' was 'hello world'          ======================================================================    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 'hello' and a string ending with 'world  ')         but: a string ending with 'world  ' was 'hello world'          ----------------------------------------------------------------------    Ran 3 tests in 0.007s       FAILED (failures=2)

他们会得到一个不同的错误信息,显示去除了过多的空白:

source_string = "  hello world  " @run_testclass 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 Notebook教Python”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI