《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 = ‘[email protected]‘,
        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 = ‘[email protected]‘,
        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

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

时间: 2024-08-02 11:02:55

《HeadFirst Python》第二章学习笔记的相关文章

Python核心编程第三版第二章学习笔记

第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of a connection across a computer network,Sockets are often represented internally as simple integers, which identify which connection to use. 套接字是网络通信的

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

python第二天学习笔记

Python文件处理 文件内容替换 for line infileinput.input("filepath",inplace=1): line=line.replace("oldtest","newtest") print line, //包含oldtest的替换成newtest 例子: [email protected]:~/python$vim finput.py #!/usr/bin/env python import fileinput

Thinking in Java 第二章学习笔记

Java虽基于C++,但相比之下,Java是一种更加纯粹的面向对象程序设计语言. 在Java的世界里,几乎一切都是对象,而Java中的全部工作则是定义类,产生那些类的对象,以及发送消息给这些对象. 尽管一切皆称对象,但我们真正操纵的确是对象的引用,好比电视机为对象,遥控器则为引用,你若想在房间里边走边操控电视,只需带着遥控器这个引用,不必带着电视这个对象.另外,引用可以单独存在,并不需要有对象与之相关联.如创建String s,则创建了一个String引用,但此时如果向这个引用发送消息,就会返回

C++ primer plus 第二章学习笔记

1.#include <iostream>的作用是什么? 该编译指令导致预处理器将iostream文件的内容添加到程序中,这是一种典型的预处理操作,再源代码被编译之前,替换或添加文本. iostream中的io指的是输入和输出,C++中的输入/输出方案涉及iostream文件中的多个定义,为了使用cout来显示消息,第一个程序需要这些定义,#include 编译指令导致iostream文件的内容随源代码文件的内容一起被发送给编译器.

Scala第二章学习笔记

最基本的练习~: 使用伴生对象: object holder{ class Foo{ private var x = 5} object Foo{def im_in_yr_foo(f: Foo) = f.x} } import holder.Foo val x = new Foo Foo.im_in_yr_foo(x) 基本的会话: Scala的if块是个表达式.在Java中,达到类似的目的就是这种代码: String x = true ? "true string" : "

TextView的跑马灯效果(AS开发实战第二章学习笔记)

TextView的跑马灯效果跑马灯用到的属性与方法说明singleLine 指定文本是否单行显示ellipsize 指定文本超出范围后的省略方式focusable 指定是否获得焦点,跑马灯效果要求设置为truefocusableInTouchMode 指定在触摸时是否获得焦点,跑马灯效果要求设置为true省略方式的取值说明start 省略号在开头middle 省略号在中间end 省略号在末尾marquee 跑马灯显示另外,我还找到了一个marqueeRepeatLimit的属性,其中可以用mar

Android深度探索——第二章读书笔记及心得

Android开发环境搭建 ——第二章读书笔记及心得 通过本章的学习了解了如何对Ubuntu Linux下的Android进行搭建,包括搭建Android应用程序开发环境.Android NDK开发环境和交叉编译环境的搭建.了解了搭建Android环境所需要的各种东西,了解了配置ADT的必要性—以便ADT能够找到Android SDK.知道了底层开发所需要的各种工具.学会了如何在Ubuntu下安装JDK.以及编译交叉编译环境,当初在学习Linux交叉环境编译的时候就不是特别成功,中间出了很多的错

python网络爬虫学习笔记

python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章目录 1. 介绍: 2. 从简单语句中开始: 3. 传送数据给服务器 4. HTTP头-描述数据的数据 5. 异常 5.0.1. URLError 5.0.2. HTTPError 5.0.3. 处理异常 5.0.4. info和geturl 6. Opener和Handler 7. Basic Authentication 8. 代理 9. Timeout 设置 10. Cookie 11. Deb