《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:\python34\site-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("\t", 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("\t", 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("\t", 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("\t", 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("\t", 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

 

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

posted on 2016-12-15 13:38  舍得学苑  阅读(261)  评论(0编辑  收藏  举报

导航