《HeadFirst Python》第二章學習筆記

如今,請跟着捨得的腳步,打開《HeadFirst Python》第二章。python

一章的內容其實沒有多少,多練習幾回就能掌握一個大概了!算法

《HeadFirst Python》的第二章設計得頗有意思。它直接從製做一個模塊入手,順帶講了模塊的導入,傳統的書可不會這麼搞。編輯器

不過書中關於編輯器的觀點略顯陳舊。ide

最好的編輯器是什麼? 別用書中推薦的Python自帶IDLE,在現階段,請使用Jupyter Notebook來進行各項練習。函數

等學完這本書後,你能夠選擇PyCharm/Eric6/WingIDE進行Python的開發,捨得將會帶你開啓那個新的篇章。工具

Jupyter Notebook是個堪稱神器級別的工具,捨得如今開發的過程當中,還常常用它來驗證一些構思中的代碼,尤爲在學習一些新模塊的時候更是如此。學習

上課。
[in]:
測試

    # 註釋代碼
    # 第2章 p37
    # 單行註釋推薦使用註釋內容前面加"# "號的方式;
    # 多行註釋請使用一組三重引號,如:
    """
    你要對當前代碼進行註釋/說明的內容
    """
ui

[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)  # 不帶第二、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

 

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!
做者:捨得
首發:捨得新浪博客

相關文章
相關標籤/搜索