页面载入中...
首页 » Tag ‘教程’

《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

 

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

《HeadFirst Python》第一章学习笔记

对于Python初学者来说,舍得强烈推荐从《HeadFirst Python》开始读起,这本书当真做到了深入浅出,HeadFirst系列,本身亦是品质的保证。这本书舍得已在《Python起步:写给零编程基础的童鞋》一文中提供了下载。为了方便大家的学习,舍得特意制作了Jupyter Notebook格式的笔记,文章末尾舍得提供了笔记的下载地址。

读《HeadFirst Python》的同时,最紧要的是及时做练习,你甚至可以在快速浏览过一章后,便拿起练习来做。

做练习的时候,切记,不要用书中建议的Python自带的IDLE。作为过来人,舍得的建议是使用Jupyter Notobook。具体的安装方法舍得已在Python起步:写给零编程基础的童鞋》中讲得很清楚了,每次你要练习的时候,运行jupyter-notebook.exe,便可以在程序打开的浏览器页面中进行代码输入了。Jupyter Notobook与Python自带的IDLE相比,有着巨大的优势:

  • 增强版的代码自动补全:输入代码过程中,可尝试按Tab键,程序会提示相应的代码;
  • 每次录入的代码程序会自动替你保存下来,这就相当于你自己的学习笔记,你可以在代码的前或后加入注释,注释前面用一个“#”+一个空格(空格可以不加,但舍得建议从一开始便养成良好的写代码习惯,#后带空格是Python代码规范-PEP8的要求)就可以了;
  • Notebook给你保存的笔记,你可以随时打开,点RUN按钮(或用Alt+Enter快捷键)便可以运行选择中的某一段代码,这是Python自带的IDLE根本无法做到的事情;
  • 在Notebook中你可以极为方便地输入多行代码,而Python自带的IDLE在这方面有极大的限制;
  • 对于颜控来说,Notebook的代码着色看起来更加舒服一些;
  • ……

舍得会将书中每一章中提到的大部分练习,收录到笔记中,你可以在看完一章后,拿舍得给你的笔记,在Jupyter Notebook中进行练习。当然你也可以在看到书出给出一段代码时,立刻在Jupyter Notobook中输入并运行。

舍得提供的笔记是ipynb格式(ipy是指ipython, Notebook是用ipython来实现的。而nb则是notebook的缩写),当你下载了笔记之后,请将其放到“你的python安装文件夹(默认是c:\python34)\Scripts”文件夹下,然后刷新一下浏览器中Jupyter Notebook的首页,便可以看到这个笔记,点击该笔记,就可以浏览了。

SNAG-0140

如果你在Jupyter Notebook首页中已经点击过“New->Python 3”, 那么你可以使用菜单”File->Open“回到首页选择舍得提供的笔记。

SNAG-0143

下面舍得开始讲解第一章的要点。

文中”[in]:“后面的内容,表示我们在Jupyter Notebook中输入的代码和注释,内容中以”# “开头的,是舍得的注释。

[out]:“后面的内容,则是代码执行后的输出结果。

舍得在注释中,标明了该段代码的页码,方便你对照书本进行练习。书中有些内容的讲解比舍得更详细。

舍得对部分代码进行了改写,但不影响代码的最终效果。

[in]:

    # 熟愁一下打印命令.
    # 第一章 p4
    # 内容前面加一个#号表示注释, python会自动忽略#号后面的内容
    if 43 > 42:
        print("Don’t panic!")

[out]:

    Don’t panic!
   

[in]:

    # 创建简单的Python列表
    # 第一章 p8
    # 标识符:movies, 你给这个列表起的名字
    # 操作符:=,把列表赋给标识符
    # 列表格式:两端用中括号;列表中每一项用逗号隔开;电影名称两边加引号;
    movies = ["The Holy Grail",
             "The Life of Brian",
             "The Meaning of Life"]
    print(movies)

[out]:

    [‘The Holy Grail’, ‘The Life of Brian’, ‘The Meaning of Life’]
   

[in]:

    # 用中括号记法访问列表
    # 第一章 p9
    # 打印列表中第2个数据(第1个为0)
    print(movies[1])

[out]:

    The Life of Brian
   

[in]:

    # 列表深入学习:len
    # 第一章 p10
    # len:获取列表长度,即列表有几个数据项
    cast = ["Cleese", ‘Plain’, ‘Jones’,"Idle"]
    print(cast)
    print(len(cast))
    print(cast[0])  # 0表示第一个数据项, 你可以自己换不同的数字尝试一下

[out]:

    [‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’]
    4
    Cleese
   

[in]:

    # 列表深入学习:append
    # 第一章 p10
    # append:在列表末尾增加一项数据
    cast.append("Gillianm")
    print(cast)

[out]:

    [‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’, ‘Gillianm’]
   

[in]:

    # 列表深入学习:pop
    # 第一章 p10
    # pop:从列表末尾删除数据
    cast.pop()

[out]:

    ‘Gillianm’

[in]:

    # 再打印一下,看看有何变化
    print(cast)

[out]:

    [‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’]
   

[in]:

    # 列表深入学习:extend
    # 第一章 p10
    # extend:在列表末尾增加一个列表(两个列表合并)
    cast.extend(["Gillianm", "Chapman"])
    print(cast)

[out]:

    [‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’, ‘Gillianm’, ‘Chapman’]
   

[in]:

    # 列表深入学习:remove
    # 第一章 p10
    # remove:在列表中找到并删除一个特定的数据项
    cast.remove("Chapman")
    print(cast)

[out]:

    [‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’, ‘Gillianm’]
   

[in]:

    # 列表深入学习:insert
    # 第一章 p10
    # insert:在列表中特定的位置前增加一个数据项
    cast.insert(0, "Chapman")  # 0表示插入在最前面,你可以试试其它的数字
    print(cast)

[out]:

    [‘Chapman’, ‘Cleese’, ‘Plain’, ‘Jones’, ‘Idle’, ‘Gillianm’]
   

[in]:

    # 习题
    # 第一章 p13
    # 把每部电影的出品年代加到列表中
    # 象下面这样: [‘The Holy Grail’, 1975, 1975, 1979,
    # ‘The Life of Brian’, 1979, ‘The Meaning of Life’, 1983, 1983]
    # 把数字放进列表的时候,数字不用加引号
    movies.insert(1, 1975)  # 第1个插入到第2个列表项前
    movies.insert(3, 1979)  # 第2个插入到第4个列表项前(好好想想为什么用3)
    movies.append(1983)  # 最后一个追加到末尾就行
    print(movies)

[out]:

    [‘The Holy Grail’, 1975, ‘The Life of Brian’, 1979, ‘The Meaning of Life’, 1983]
   

[in]:

    # 列表: 迭代
    # 第一章 p15
    # 迭代: 用一个for循环,把列表中所有的项逐个打印出来
    # for … in …表示取这个列表的每一个数据
    for i in movies:  # 这里的i随便用哪个(一个或多个)字母都行
        print(i)  # 只要两个i保持一致.你可以试试用不同的字母

[out]:

    The Holy Grail
    1975
    The Life of Brian
    1979
    The Meaning of Life
    1983
   

[in]:

    # 列表: 迭代
    # 第一章 p16
    # 迭代: 用一个while循环,把列表中所有的项逐个打印出来
    # 效果和for循环一样
    # while xx < xxx表示:只要xx < xxx,就一直执行下去, 直到这个条件不成立
    count = 0
    while count < len(movies):  # 前面刚学过的len用法
        print(movies[count])  # 前面刚学过的中括号记法
        count += 1  # 和书本上的count = count + 1相同, 表示让count自增1

[in]:

    # 列表:在列表中储存列表
    # 第一章 p18
    # 我们用movies这个列表来记录一部电影的数据. The Holy Grail这部电影全名叫
    # 《Monty Python and the Holy Grail》(巨蟒与圣杯),1975年出品,两个Terry是导演,
    # 同时也参加了演出。影片时长为91分钟,Chapman是编剧(同时也是主演)。Michael这
    # 一伙人既是编剧,亦是配角。这帮人真是玩嗨了,自编自导自演。
    movies = ["The Holy Grail", 1975, "Terry Jones & Terry Gilliam", 91,
              ["Graham Chapman", ["Michael Palin", "John Clseese",
                                "Terry Gilliam", "Eric Idle", "Terry Jones"]]]
    print(movies)

[out]:

    [‘The Holy Grail’, 1975, ‘Terry Jones & Terry Gilliam’, 91, [‘Graham Chapman’, [‘Michael Palin’, ‘John Clseese’, ‘Terry Gilliam’, ‘Eric Idle’, ‘Terry Jones’]]]
   

[in]:

    # 用for循环处理这个列表
    for i in movies:
        print(i)

[out]:

    The Holy Grail
    1975
    Terry Jones & Terry Gilliam
    91
    [‘Graham Chapman’, [‘Michail Palin’, ‘John Clseese’, ‘Terry Gilliam’, ‘Eric Idle’, ‘Terry Jones’]]
   

[in]:

    # 列表:在列表中查找列表
    # 第一章 p20
    # isinstance: 判断标识符的类型
    names = [‘Michael’, ‘Terry’]
    isinstance(names, list)  # 判断它是不是列表(list)类型
   

[out]:

    True

[in]:

    # 列表:在列表中查找列表
    # 第一章 p20
    # isinstance: 判断标识符的类型
    # 换个方式
    num_names = len(names)
    isinstance(num_names, list)

[out]:

    False

[in]:

    # 列表:在列表中查找列表
    # 第一章 p21
    # 习题: 把上面那个movies列表中的每一个数据项都打印出来
    # 用if … else …模式
    # 结合isinstance
    for i in movies:
        if isinstance(i, list):  # 先判断i是不是列表
            for j in i:  # 是的话用for循环
                if isinstance(j, list):  # 还要再往下挖一层, 因为还有一个嵌套的列表
                    for k in j:
                        print(k)
                else:  # 每一对if…else…要对齐
                    print(j)
        else:  # 不是列表就直接打印
            print(i)
    # 如果再来一层嵌套的列表, 怎么办?

[out]:

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

[in]:

    # 函数
    # 第一章 p30
    # 使用函数可以简化刚才写的那段代码, 再多来几层列表咱也不怕啦!
    # def关键字是define的缩写,python看到def就知道这个是函数
    def print_lol(the_list):  # print_lol就是我们定义的函数名,尽可能把名字起得有意义一点
        for i in the_list:
            if isinstance(i, list):
                print_lol(i)  # 如果是列表, 那么调用"自己"再次处理这个列表
            else:
                print(i)

[in]:

    # 函数
    # 第一章 p30
    # 我们来用print_lol这个函数来打印我们的列表movies
    print_lol(movies)  # 看看,代码是不是精简了很多?

[out]:

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

   

第一章完。

本文笔记下载地址:

链接:http://pan.baidu.com/s/1eR4iJoI 密码:t72j

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

新转换精灵运作机理浅析

转换精灵自0.6版起,采用了全新的设置界面,今天舍得着重讲讲新界面给转换精灵带来的种种变化,并借此阐述一下转换精灵的运作机理。
先讲老版本的。老版本最大的限制是源文本只能有两到三个栏位(科普一下栏位的概念,其学名叫“列”,跟excel的列是一样的概念,转换精灵用不同的列来储存不同类型的文本,如单词,释义,例句等),而且对这些栏位有严格的限制,譬如,三个栏位中,头和尾只能是问题和答案,中间栏位只能放音标、媒体文件名等内容。这样的设定明显局限了转换精灵的发展。
新界面的设计是受了adappp的启发,采用了自由选择栏位的方案,同时将问题区和答案区分开,分别赋予它们三个自由栏位。这样设计的好处太多了:栏位数和栏位位置都不再受限制了,而且同一栏位可以重复使用,例如,单词栏位可以用作音频或图片的文件名。由于栏位数几乎可以无限增加,这就使得制作像选择题、匹配题、提示题之类题型成为了可能。
以舍得制作的《BBC单词大师》课程为例,所有的题型可以只用一份源文本。倘若某个题型需要加素材的话,增加几个栏位就可以了。
比如,舍得想做一种提示题型,提示文本是“将鼠标移到此处以查看提示”,然后再在设置中调用中文释义,做出来的效果就是,你先看到提示文本,当你将鼠标移到提示文本上面时,再显示中文释义。这就起到了隐藏释义的作用。
中文释义的栏位是现成的,因此,舍得只要在源文本中加一个提示文本的栏位,就可以完成这个题型的设计了。

SuperMemo2006之日清原则和量化控制

所谓的日清原则,就是当日事当日毕。放在SuperMemo中,就意味着你当天得把单词掌握到一定的程度。什么程度呢?舍得认为,要做到每一个新词出现在你面前时,你至少能回忆起它的意思。

很难吗?

只要量控制好了,一点都不难。

在以前的工作中,舍得曾经有过一天之内,背诵大量的话术的经历。一段话术给你,10-15分钟就得背下来,一天下来,要背几大张的话术,靠的是什么?就是你的短期记忆能力。

相比之下,舍得觉得,背单词要比大段的话术要简单一些,因为每一个单词本身就是一个提示,从记忆法的角度看,你只要“定好桩”或者说,制作好“记忆的钩子”就可以了。

你不需要去管自己明天是否还能记起,你只要去关注在当天复习的时候能否回忆起来就行。

其实做起来很轻松的。SuperMemo的操练很象拿筛子去筛选沙石,每过一遍单词,就把你掌握得不好的单词给筛选出来,换个角度讲,就是把相对已经掌握的单词Pass掉。所以说,一天中背单词的重点就是那些你不大容易掌握的单词,你的任务就是在一天之内,将这些单词的评分从0-3提高到4-5,这样做的好处是,你在今天将这些单词在脑中刻下了一道浅浅的痕,在下次复习的时候回忆起来会轻松很多。

比如说你今天要记100个新的单词,那就这样子来背:第一遍先快速过一遍,注意评分尽可能准确就行,这样第一遍过后,评分在0-3的单词自动纳入当天的总复习里,换句话说,总复习里的单词就是你今天要重点突破的单词。第二遍就是开始总复习,这时你应该使用一些记忆技巧,具体的记忆技巧舍得会另行撰文介绍。建议大家使用各种奇特的联想,将新词和以前学过的形态相近的旧词挂起钩来(手头有《风暴谜式英语单词记忆法》和《三三英语考研词汇速记》这两本书的可以参考其中的记忆法),使用这些记忆技巧会让你大幅缩短总复习的时间。这样一遍遍做下去,需要攻克的单词会越来越少,最后剩下的那些单词往往是你的记忆技巧用得不好的地方——这不正是一个检验自己记忆技能的过程吗!一直这样操练下去,直到总复习中所有的单词你都能一见到就回忆起它的意思为止,这就是舍得在本文中讲的“日清原则”。

那当天背单词的量应该怎么把控呢?舍得认为,不要给自己规定一天背XX个单词,这样子不够科学,尤其在使用SuperMemo时,随着单词难易程度的不同,今后的复习中每天的训练量是不一样的。那用什么来衡量当天的训练量呢?舍得建议大家用当日使用SuperMemo的总时间来控制自己的学习量。一般一天之内使用SuperMemo的时间控制在45分钟比较合适——至于45分钟内你能记多少个单词,就要靠自己在实践中去摸索了。这个跟自己的记忆技能、所选材料的难度是息息相关的,1000个人就有1000个不同的结果。在你熟练掌握了记忆技巧之后,背诵一个单词的速度相对是比较稳定的,你可以在今后的练习中观察和分析自己的记忆速度。掌握这一点对你合理控制每天的训练量是很重要的。

在学习的过程中,你应该养成查看“工作量”的习惯(打开SuperMemo的“工具->工作量”菜单,或按快捷键Ctrl+W),在这个窗口里,你可以看到SuperMemo根据你反馈给它的数据给你制订的复习计划。假设你45分钟内平均可以背诵200个单词,那你今天可以背诵的新词数量就等于200减去当天的复习数量(“工作量”窗口中显示的复习数量)。这样的量化控制比较合理。

这个问题还可以讨论得再深入一些,倘若你要将量化控制做得更加精细的话,你可以将第一遍新词记忆后筛选出来的0-3级单词作为一个参考数据,它加上当天工作量中的复习数就是你这一天内真正需要掌握的单词数。那些被过滤掉的4-5级单词并不是你要掌握的重点——你基本上不需要在它们身上花太多的时间,只要老老实实按照SuperMemo给你安排的计划去操练,这些单词就能轻轻松松记住。

SuperMemo之介绍篇

 

SuperMemo是一个非常古老的软件,开发历史有20多年了,不过它的最后一个PC版本并不是战隼说的SuperMemo
2006,而是2008年11月更新的SuperMemo UX.SuperMemo是Palm
OS平台最早的记忆软件,很多人都用它来背单词,但确切的说SuperMemo是一个辅助记忆软件,可以帮助你记忆任何东西.最早的时候被持有PDA的同学所用来记忆英语单词甚至背考题等。由于其算法符合人脑记忆和遗忘的特点,因此记忆效果很好。

 

这是SuperMemo UX版的界面:

 

 

三个关于SuperMemo的重点

1、SuperMemo是个学习方法,可以让人学得更快并且记得更牢。
2、SuperMemo现在作为软件,支持 Windows, Windows CE和Palm
Pilot系统。另外还存在网络版,DOS版,Linux,Mac,Amiga版,甚至提供不需要电脑的打印版本如下。
http://www.supermemo.com/articles/paper.htm

3、SuperMemo建立在长期记忆的科学研究之上。

 

SuperMemo如何工作?

一、整理学习资料
SuperMemo帮助你创造你愿意记住的学习资料的汇集。你可以使用别人已经做好的学习资料。你也能把网页上的文章装换成学习资料。

二、测试你的记忆力
SuperMemo测试你的知识,并且作出测试报告。
三、聪明的复习算法
因为理解你的记忆力,SuperMemo可以计算出对你的学习资料的最优化的复习时间差。在学习资料中每一个

条文都建立有自己的复习和重复模型。

 

  

 

我自己用的SuperMemo 2006版,使用的是修改过的柯林斯分级词汇,界面如下:

 

 

网上关于SuperMemo
的介绍:

 

SuperMemo的官方网站:

http://www.supermemo.eu/

http://www.supermemo.com/:不过这个网站已经很久没更新了。

 

SuperMemo的合作网站:

http://www.learn-chinese-fast.com/:这是一个叫Jeppe
Marc
Mortensen的丹麦人建立的一个网站,得到了SuperMemo团队的技术支持!从这个网站里可以欣赏一下SuperMemo这个软件的发展历史,链接如下:

http://www.learn-chinese-fast.com/supermemo-history.html

 

著名的外语学习网站Antimoon上讲到Supermemo对他们的帮助,他们是这么说的:

SuperMemo is a computer program that you can use to
learn English. We used it for 8 years and it helped us a
lot.

原文链接如下:

http://www.antimoon.com/how/howtolearn.htm

 

战隼学习探索中关于SuperMemo的两篇介绍文章,不过他重点的是讨论如何用SuperMemo的“纸质版”:

http://www.read.org.cn/?s=supermemo

 

毒龙的博客中介绍了SuperMemo的一些使用方法,包括他个人的亲身经历:

http://www.cnblogs.com/speeding/tag/supermemo/

 

邦比快跑是继毒龙之后沉迷在SuperMemo中的又一人,他在博客中介绍了一些基本的操作和相关的下载链接:

http://www.binbinmath.com/archives/638746

 

其实你在google或百度里搜索Supermemo,它会将你更多地引向supermemo for
pda的版本。Supermemo在PDA用户中也有相当多的一群Fans,具体的就不一一列举了。

 

SuperMemo及相关资源的下载地址:

 

SuperMemo2006

纳米盘下载

| Brsbox下载

| Brsbox下载2

| BiBiDu下载

SuperMemo
Collins分级词汇词库

纳米盘下载

| Brsbox下载

| Brsbox下载2

SuperMemoGRE词库 : 纳米盘下载

| Brsbox下载

SuperMemo.Extreme.English(Emule下载):这个比较大,大约有1.3G,包含了basic,adanvce等级别的训练资料,其中advance是全语音的。Emule的链接源不能十分保证。
SuperMemo First Certificate In
English(Emule下载

 

下面是SuperMemo
UX版的下载地址,经舍得测试,这个版本似乎是不需要注册,但是课程就得收费购买了。而且目前还没有发现有自制课程的可能。界面倒是蛮漂亮的,具体的功能大多数在SuperMemo
2006里都能实现。从官方提供的三个测试课程Mit Erfolg zum ZD、FCE和Fast Track to
CAE来看,UX版有点类似Tell Me
More那个软件,更加侧重于全面的英语学习,但象2006版那样的方便和自由可谓是丧失殆尽,因此UX版舍得暂时还不推荐大家使用。只是将链接放在这里,仅供大家尝尝鲜吧!

四、节省时间
用SuperMemo为你安排的最小的重复次数,你不会浪费时间去记那些已经记得很熟的东西(背单词的肯定很烦那个abandon吧^^)你发现你能达到一个让你自己惊讶的速度和学习的数量并且回想起来不会很难。