zoukankan      html  css  js  c++  java
  • Python(Head First)学习笔记:二

    2 共享代码:连接共享社区、语法、函数、技巧

      通过Python模块共享代码,在Python社区分享这些模块,让更多的人受益,

      不得不说,Python真的做的不错~

      Python提供了一组技术,用于模块共享和发布;

      关于模块:将包含Python代码的文件保存为以.py为结尾的文件;

      第三方的Python模块都放在了PyPI(Python Package Index )上;

      通过“”“注释内容"""来完成多行注释,用#注释单行;

      在ubuntu上可以用vi nester.py,建立一个.py文件,然后输入之前的那个递归函数,做为一个python模块。

      查看Python模块存放位置:在IDLE中输入:  

                        >>>import sys

                        >>>sys.path

        关于构建发布

        建立一个文件夹nester,里面放两个文件,一个是前面那个函数,另一个是名为setup.py的文件。

        setup.py的内容如下:

        from distutils.core import setup

        setup(

            name    = 'nester',

            version      = '1.0.0',

            py_modules = ['nester'],

            author     = 'hfpython',

            url      = 'http://www.headfirstlabs.com',

            description   = 'A simple printer of nested lists',

    )

       然后,在nester文件夹下打开终端Terminal,输入:python3 setup.py sdist

          将发布安装到python本地副本中,输入:sudo python3 setup.py install

      导入模块并使用

        在python3下,输入:import nester

                   cast = ['a','b','c','d']

                   nester.print_lol(cast) 

                  注:导入模块是不需要加.py扩展名。

      Python的模块实现命名空间

        Python中所有代码都与一个命名空间关联;

        主Python程序中的代码与一个名为“__main__”的命名空间关联,而nester模块的代码与nester的命名空间关联;

        命名空间就像是姓氏一样,所以:

            调用模块时需要加命名空间,如:nester.print_lol(movies)

      注册PyPI网站

        访问网站:http://pypi.python.org/,然后注册一个PyPI ID,记住username和password。

      向PyPI上传代码  

        打开终端,然后进到nester文件夹下,然后输入:

          python3 setup.py register

          选1选项:use your existing login

          输入username和password

          save your login:y保存PyPI设置

          python3 setup.py sdist upload上传模块

      可以从PyPI社区查看上传的代码模块,确认上传成功。

      问答:

        1 将代码模块安装到本地副本中和其他文件夹下都是可以的,在其他文件夹下,需要使用import sys;sys.path导入,比较麻烦。

        2 nester.pyc文件是Python解释器第一次执行模块代码时,将代码转换成中间字节码格式的文件,类似于Java的JVM工作原理,

         这样做的好处是,如果模块没有更改,下次编译会快很多,不用再重新生成中间代码模块了。

      用额外的参数控制行为:可以通过给函数添加参数,做成选项参数,用于函数不同功能的实现等。

      写新代码之前,优先考虑使用BIF。

        比如:range(),用于生成一个从0到指定数之间的一个数字列表,还可以提供需要的控制来迭代指定的次数。

        实例:更改print_lol(the_list,level):

              for each_item in the list:

                  if isinstance(each_item,list):

                  print_lol(each_item)  #这里是有问题的,没有调用print_lol的第二个参数

              else:

                for tab_stop in range(level):

                  print(" ",end=")

                print(each_item)

      问答:

        1 使用BIF,不需要进行导入的操作。

         2 BIF的命名空间是__builtins__,使用时它们会自动导入到__main__的命名空间里。

         3 BIF已经经过了大量的测试,是很成熟的函数,善于使用可以事半功倍。

      Python 会尽力运行你的代码

        Python在运行之前不会全面检查代码的合法性,这样导致Python非常灵活,如:运行时动态地定义函数。

      跟踪代码  

        检查程序Bug,修改上面的递归调用:

                        if isinstance(each_item,list):

                             print_lol(each_item,level+1)

      用修改后的模块更新PyPI

        打开setup.py,更改里面的version为1.10,然后在终端输入:python3 setup.py sdist upload,完成更新。

         使用可选参数

        对于函数的参数,如果给参数赋值,那么这个参数就会变成一个可选参数;

                如果没有给参数赋值,那么这个参数就会变成一个必要值。

                如:def print_lol(the_list,level=0),其中the_list是必要值,level是可选值。

      最后一个修改函数,增加第三个参数

        增加一个新参数:indent,作用是:是否打开缩进功能;

          实例:

              def print_lol(the_list,indent=False,level=0):   #注意大小写

              for each_item in the_list:

                if isinstance(each_item,list):

                  print_lol(each_item,indent,level+1)

                else:

                  if indent:

                    for tab_stop in range(level):

                      print(" ",end=' ')

                    print(each_item)

             然后,更改setup.py的version为1.0.3,

                终端输入:python3 setup.py sdisk upload更新模块。

          注:1 使用BIF的print()时,包含end=' '时,会对输入自动换行;

            2 如果函数的参数被赋值,说明这个参数是可选的。

    --------------------------------------------The End of Second Chapter--------------------------------

  • 相关阅读:
    关于栈部分知识点
    面向对象--四则运算
    转型第一步
    输入输出文件版本——计算题
    作业二
    2017《面向对象程序设计》课程作业一
    第四次作业
    light oj 1079
    Light oj 1080
    Codeforces 486B OR in Matrix【水题】
  • 原文地址:https://www.cnblogs.com/heart2futrue/p/7543703.html
Copyright © 2011-2022 走看看