zoukankan      html  css  js  c++  java
  • Head First Python之2函数模块

    模块就是一个包含Python代码的文本文件,以.py结尾。

    第三方模块都在PyPI(python package index)上,可使用PyPI发布你的模块,供他人使用。

    注释代码

    # coding=utf-8
    
    """
    nester.py模块
    模块描述放在这里
    """
    
    
    def print_lol(li):
        """
        描述函数放在这里
        :param li: list
        :return: None
        """
        for each in li:
            if isinstance(each, list):
                print_lol(each)
            else:
                print(each)
    

    发布到PyPI

    1、为模块创建各一个文件夹nester_zlm

      文件夹下面包含nester.py和setup.py  

      setup.py包含发布的元数据,代码如下:

    from distutils.core import setup
    
    setup(
        name='nester',
        version='1.0.0',
        py_modules=['nester'],
        author='hfpython',
        author_email='zlm_dj68@163.com',
        url='http://www.findeen.co.uk/headfirstlabs.com.html',
        description='a Simple printer of nested lists',
    )
    

    2、构建一个发布文件

    nester_zlm文件夹中打开一个终端窗口,键入命令:python3 setup.py sdist

    3、将发布安装到你的Python本地副本中

    python3 setup.py install

    安装成功后发布已经准备就绪

     4、发布速览

    build和dist的是发布工具生成的。

     5、导入模块并使用

    导入新创建的模块nester,定义一个列表,调用print_lol函数,没有加命名空间时,会导致NameError;

    用命名空间限定函数名后,pass。

    若使用 from nester import print_lol,则可以不用命名空间,但要注意,如果当现有空间存在print_lol,那么导入的函数会覆盖现有的函数。

    6、注册Pypi网站

    https://pypi.python.org/pypi?%3Aaction=register_form

    PGP Key一般都不用填

    7、向pypi上传代码

    (1)通过命令行窗口注册Pypi

    pyton3 setup.py register

    (2)通过命令行窗口上传

     python3 setup.py sdist upload

    (当然,如果试图上传一个名字为nester的模块,会得到一个错误,指出这个模块名字已经被占用)

     添加参数

    新的需求

    现在有新的需求,nester.py模块的print_lol函数,当碰到一个嵌套列表时,需要有缩进,以让层次跟清晰。

    这时需要添加额外的参数控制行为

    # coding=utf-8
    
    
    def print_lol(the_list, level):
        """
        所提供列表中的各个数据项会(递归地)打印到屏幕上,而且各占用一行
        :param the_list: 包含或者不包含嵌套列表的列表
        :param level:用来在遇到嵌套列表时插入制表符
        :return: None
        """
        for each in the_list:
            if isinstance(each, list):
                print_lol(each, level+1)
            else:
                for tab_stop in range(level):
                    print("	", end="")
                print(each)
    
    if __name__ == '__main__':
        li = [1, [2, 3], 4]
        print_lol(li, 0)
    

    运行结果:

    将上述代码更新到pypi

    1、修改setup.py中version='1.1.0',

    2、发布 python3 setup.py sdist upload

    可选参数

    上述nester.py模块有个问题,无法兼容老版本,此时我们可以用可选参数

    为了实现可选参数,需要位这个参数提供一个缺省值,如下:

    def print_lol(the_list, level=0):
    

    这样,我们使用以下两种都是一样的了:

    print_lol(li)
    print_lol(li, 0)

    API还是不对

    上述nester.py模块还有个问题,并不是所有人都想有缩进,那如何兼容不带缩进呢

    再添加一个新的变量

    # coding=utf-8
    
    
    def print_lol(the_list, indent=False, level=0):
        """
        所提供列表中的各个数据项会(递归地)打印到屏幕上,而且各占用一行
        :param indent: False-不打开缩进,True-打开缩进
        :param the_list: 包含或者不包含嵌套列表的列表
        :param level:用来在遇到嵌套列表时插入制表符
        :return: None
        """
        for each in the_list:
            if isinstance(each, list):
                print_lol(each, indent, level+1)
            else:
                if indent:
                    for tab_stop in range(level):
                        print("	", end="")
                print(each)
    
    if __name__ == '__main__':
        li = [1, [2, 3], 4]
        print_lol(li, True)
    

     

  • 相关阅读:
    Sql Server2005新特性及性能
    Sql Server Debugger
    .关于 WCF Binding 中 OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout 的解释(转载)
    LightSwitch™初体验
    WinDbg / SOS Cheat Sheet
    《Dissecting SQL Server Execution Plans》随记
    轻松掌握用SQL来合并查询
    Oracle:存储过程的使用
    Eclipse和Tomcat的版本问题已解决
    oracle:触发器的使用
  • 原文地址:https://www.cnblogs.com/lingzeng86/p/6706913.html
Copyright © 2011-2022 走看看