zoukankan      html  css  js  c++  java
  • 《HeadFirst Python》第二章学习笔记

    现在,请跟着舍得的脚步,打开《HeadFirst Python》第二章。

    一章的内容其实没有多少,多练习几次就能掌握一个大概了!

    《HeadFirst Python》的第二章设计得很有意思。它直接从制作一个模块入手,顺带讲了模块的导入,传统的书可不会这么搞。

    不过书中关于编辑器的观点略显陈旧。

    最好的编辑器是什么? 别用书中推荐的Python自带IDLE,在现阶段,请使用Jupyter Notebook来进行各项练习。

    等学完这本书后,你可以选择PyCharm/Eric6/WingIDE进行Python的开发,舍得将会带你开启那个新的篇章。

    Jupyter Notebook是个堪称神器级别的工具,舍得现在开发的过程中,还经常用它来验证一些构思中的代码,尤其在学习一些新模块的时候更是如此。

    上课。
    [in]:

        # 注释代码
        # 第2章 p37
        # 单行注释推荐使用注释内容前面加"# "号的方式;
        # 多行注释请使用一组三重引号,如:
        """
        你要对当前代码进行注释/说明的内容
        """

    [in]:

        # 打开记事本类程序(推荐使用emeditor), 将下面的内容复制进去;
        # 然后另存为nester.py, 文件编码请使用utf-8;
        # 新建一个nester文件夹,将nester.py放进该文件夹;
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i)  # 如果是列表, 那么调用"自己"再次处理这个列表
                else:
                    print(i)

    [in]:

        # 准备发布
        # 第2章 p40
        # 将下面的代码复制到emeditor中;
        # 文件另存为setup.py, 文件编码请使用utf-8;
        # 将该文件存放到nester文件夹下
        # 单引号内的内容可以随意发挥, 注意观察文件的格式,尤其是=/,/()/[]和单引号的使用
        # 注意下面的代码不要在Jupyter中运行
        from distutils.core import setup
       
        setup(
            name = 'nester',
            version = '1.0.0',
            py_modules = ['nester'],
            author = 'hfpython',
            author_email = 'xxx@xxx.com',
            url = '
    http://www.emagic.org.cn',
            description = 'A simple printer of nested lists',  
        )

    [in]:

        # 构建发布/导入模块
        # 第2章 p41
        # 在nester文件夹下打开Dos命令提示符
        # 不知道如何操作的童鞋, 可以参考我写的《Python起步》,或自行百度
        # 在Dos命令提示符下输入: python setup.py sdist
        # 生成dist文件夹后, 继续在Dos命令提示符下输入: python setup.py install
        # 如果你电脑中装有everything的话,可以快速搜索一下nester.py,
        # 便可以发现c:python34site-packages有了这个文件,这表示模块已经安装成功了
        # 用import命令来导入它:
        import nester

    [in]:

        # 使用模块/命名空间
        # 第2章 p45
        # 导入后,要在print_lol前加上"nester.",才能使用模块中的这一函数
        # 所谓命名空间就是用来告诉程序,你所使用的这个函数是从哪来的
        cast = ['Palin', 'Cleese', 'Idle', 'Jones', 'Gilliam', 'Chapman']
        nester.print_lol(cast)  # 如果导入时用"from nester import print_lol",
        # 前面就不用(也不能)加"nester."


    [out]:

        Palin
        Cleese
        Idle
        Jones
        Gilliam
        Chapman
       

    [in]:

        # 内置函数
        # 第2章 p54
        # range: 生成从0直到(但不包含某个数)的数字列表.开发过程中会经常用到.看实例来体会吧
        # 你可以自己脑洞一下range的用法, 比如,把4换成"len(cast)"
        for num in range(4):
            print(num)


    [out]:

        0
        1
        2
        3
       

    [in]:

        # 改进nester模块
        # 第2章 p56
        # 修改print_lol函数,记得按Alt+Enter运行
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list, level): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            第2个参数用来在遇到嵌套列表时插入制表符.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i)  # 如果是列表, 那么调用"自己"再次处理这个列表
                else:
                    for tab_stop in range(level):
                        print(" ", end='')
                    print(i)

    [in]:

        # 用新的print_lol来打开movies列表
        # 要传入一个新的参数,我们用0试试
        movies = ["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91,
                  ["Graham Chapman", ["Michael Palin", "John Clseese",
                                    "Terry Gilliam", "Eric Idle", "Terry Jones"]]]
        print_lol(movies, 0)


    [out]:

        The Holy Grail
        1975
        Terry Jones & Terry Gilliam
        91
       

    ::


        ---------------------------------------------------------------------------

        TypeError                                 Traceback (most recent call last)

        <ipython-input-22-c989b21ce795> in <module>()
              3           ["Graham Chapman", ["Michael Palin", "John Clseese",
              4                             "Terry Gilliam", "Eric Idle", "Terry Jones"]]]
        ----> 5 print_lol(movies, 0)
       

        <ipython-input-21-e6f44022d658> in print_lol(the_list, level)
             14     for i in the_list:
             15         if isinstance(i, list):
        ---> 16             print_lol(i)  # 如果是列表, 那么调用"自己"再次处理这个列表
             17         else:
             18             for tab_stop in range(level):
       

        TypeError: print_lol() missing 1 required positional argument: 'level'


    [in]:

        # 跟踪代码
        # 第2章 p58
        # 看到上面的出错信息,不要紧张,一行行看反馈的信息
        # 注意这句:"print_lol() missing 1 required positional argument: 'level'"
        # 注意它标出的第16行,问题应该出在这一句.
        # 在函数内部调用自己的时候, 少传了一个level参数
        # 继续来修改
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list, level): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            第2个参数用来在遇到嵌套列表时插入制表符.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i, level)  # 加上level参数
                else:
                    for tab_stop in range(level):
                        print(" ", end='')
                    print(i)

    [in]:

        # 再来运行一次, 这回能打印了
        print_lol(movies, 0)


    [out]:

        The Holy Grail
        1975
        Terry Jones & Terry Gilliam
        91
        Graham Chapman
        Michael Palin
        John Clseese
        Terry Gilliam
        Eric Idle
        Terry Jones
       

    [in]:

        # 但问题来了, 看起来level传进去没啥卵用!
        # 我们加这个level参数是希望它每次处理嵌套列表时,打印时行前能多缩进一个制表符的位置
        # 所以需要将level值加1
        # 再来修改
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list, level): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            第2个参数用来在遇到嵌套列表时插入制表符.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i, level + 1)  # 每次让level值加1
                else:
                    for tab_stop in range(level):
                        print(" ", end='')
                    print(i)

    [in]:

        # 再运行一次,看下效果
        print_lol(movies, 0)


    [out]:

        The Holy Grail
        1975
        Terry Jones & Terry Gilliam
        91
            Graham Chapman
                Michael Palin
                John Clseese
                Terry Gilliam
                Eric Idle
                Terry Jones
       

    [in]:

        # 更新模块
        # 第2章 p60
        # pypi的部分,看看就可以了.兴趣极其强烈的可以按照书上提示去玩一玩
        # 用新版本的print_lol函数替换掉原来nesster.py中的内容;
        # 然后修改setup.py, 将version(版本)这一行改为1.1.0
        # 你也可以重新构建并安装该模块(参看前面的内容), 但别忙着做,先看下面的内容
        from distutils.core import setup
       
        setup(
            name = 'nester',
            version = '1.1.0',
            py_modules = ['nester'],
            author = 'hfpython',
            author_email = 'xxx@xxx.com',
            url = '
    http://www.emagic.org.cn',
            description = 'A simple printer of nested lists',  
        )

    [in]:

        # 使用可选参数
        # 第2章 p63
        # 给第2个参数加一个缺省值, 这样可以兼容1.0.0版本的调用方式
        # 我们来继续修改nester.py文件
        # 给def print_lol后的level加了个缺省值0
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list, level=0): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            第2个参数用来在遇到嵌套列表时插入制表符.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i, level + 1)  # 每次让level值加1
                else:
                    for tab_stop in range(level):
                        print(" ", end='')
                    print(i)
       

    [in]:

        # 现在再去构建/安装这个新的nester模块
        # 然后导入,测试一下不同的调用方式
        # 先点击Jupyter中的"Kernel"菜单, 从中选择"Restart"命令
        # 这样前面导入的和执行过的命令全清空了,我们来导入nester
        import nester
        # 重新定义movies列表
        movies = ["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91,
                  ["Graham Chapman", ["Michael Palin", "John Clseese",
                                    "Terry Gilliam", "Eric Idle", "Terry Jones"]]]
        # 分别以不同的方式调用print_lol函数
        nester.print_lol(movies, 0)
        print('------我是一条美丽的分割线------')  # 加个分割线来区分这三个调用方式
        nester.print_lol(movies)  # 不加level参数
        print('------我是一条美丽的分割线------')
        nester.print_lol(movies, 2)  # level指定为2, 你也可以自己指定一个负数试试!


    [out]:

        The Holy Grail
        1975
        Terry Jones & Terry Gilliam
        91
            Graham Chapman
                Michael Palin
                John Clseese
                Terry Gilliam
                Eric Idle
                Terry Jones
        ------我是一条美丽的分割线------
        The Holy Grail
        1975
        Terry Jones & Terry Gilliam
        91
            Graham Chapman
                Michael Palin
                John Clseese
                Terry Gilliam
                Eric Idle
                Terry Jones
        ------我是一条美丽的分割线------
                The Holy Grail
                1975
                Terry Jones & Terry Gilliam
                91
                    Graham Chapman
                        Michael Palin
                        John Clseese
                        Terry Gilliam
                        Eric Idle
                        Terry Jones
       

    [in]:

        # 增加第三个参数
        # 第2章 p68
        # 用一个indent=True或False来控制是否启用缩进(level参数则用来控制缩进多少)
        """
        这是"nester.py"模块,提供了一个名为print_lol()的函数.
        此函数的作用是打印列表.
        """
        def print_lol(the_list, indent=False, level=0): 
            """
            此函数取一个位置参数,名为the_list,它可以是任何形式的列表.
            所指定的列表中的每个数据项会(递归地)输出到屏幕上,每个数据项各占一行.
            第2个参数用来控制是否输出制表符.
            第3个参数用来在遇到嵌套列表时插入几个制表符.
            """
            for i in the_list:
                if isinstance(i, list):
                    print_lol(i, indent, level + 1)  # 此处要加上indent参数
                else:
                    if indent:  # 如果传入的indent参数为True,则做以下的操作
                        for tab_stop in range(level):
                            print(" ", end='')
                    print(i)
        # 将这段代码运行一下(用Alt+Enter快捷键)

    [in]:

        # 现在我们换一个新的列表来测试
        names = ['John', 'Eric', ['Cleese', 'Idle'], 'Michael', ['Palin']]
        print_lol(names)  # 不带第2、3个参数


    [out]:

        John
        Eric
        Cleese
        Idle
        Michael
        Palin
       

    [in]:

        # 将第2个参数指定为True
        print_lol(names, True)


    [out]:

        John
        Eric
            Cleese
            Idle
        Michael
            Palin
       

    [in]:

        # 传入第3个参数,比如4:
        print_lol(names, True, 4)


    [out]:

                        John
                        Eric
                            Cleese
                            Idle
                        Michael
                            Palin
       

    以上就是《HeadFirst Python》第二章的内容,舍得建议在练习的同时,把书中的细节好好阅读一下。一些需要储存到脑子里的内容,你可以把它们整理好,加到SuperMemo中,用SuperMemo那超绝的复习算法来帮助你快速掌握所学的内容。

    本章笔记下载地址:

    链接:http://pan.baidu.com/s/1eRAo3n0 密码:ole9

    本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
    作者:舍得
    首发:舍得新浪博客

  • 相关阅读:
    玩转html2canvas以及常见问题解决
    docker磁盘空间清理办法
    统计行数、文件夹个数、文件个数的相关shell命令
    golang将字符串进行md5加密
    思考如何将自动化测试加入持续集成中
    锋利的NodeJS之NodeJS多线程
    成年人的必修课:抗压和自驱力
    MacOS下PHP7.1升级到PHP7.4.15
    php性能分析利器:xhprof
    后Low Code时代:聚焦和突破
  • 原文地址:https://www.cnblogs.com/emagic/p/6182899.html
Copyright © 2011-2022 走看看