Python(2):创建函数模块
说明:
在使用python的时候我们除了使用内置的函数之外,可能还需要使用一些别人写的函数。或者我们写的代码也希望可以给其他人使用。要实现这样的功能,我们就需要按照下面的步骤来定义自己的模块:
Step1:新建一个py文件
首先我们将前面一章所写的打印列表的函数保存为一个.py文件,假设我这里保存为 kider.py。
1 """
2 这是一个打印列表的函数,如果列表中有嵌套的列表也会展开打印出来
3 """
4 def print_list(movies):
5 if isinstance(movies, list):
6 for movie in movies:
7 print_list(movie)
8 else:
9 print(movies)
如果要发布的话,最好将函数快代码添加上注释。在python里面,三引号 """ 中的字符串表注释,这个是多行注释 ,单行注释使用 # 。 这时候如果想使用该模块,最原始的办法是将前面的kider.py文件放入到本机的python模块地址。
如何知道本机的python模块放在哪,只需在IDLE(python控制台)中输入:
import sys
sys.path
sys.path的输出就是本机的python模块所在的文件
1 >>> import sys
2 >>> sys.path
3 ['', '/usr/local/lib/python3.5/dist-packages/redis-2.10.5-py3.5.egg', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/zyq/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
Step2:将py文件作为模块安装到本地 但其实我们不需要将自己写的python模块放入本机的python模块地址,可以直接通过命令来安装python模块到本机: 主要步骤如下: 》1.新建一个和准备安装的python文件同名的目录,这里取名为 kider,并且将前面的kider.py文件放入该目录下 》2. 在该目录下建立一个setup.py文件,并且编辑文件的内容大致如下:
1 from distutils.core import setup
2 setup(
3 name = 'kider',
4 version = '1.0.0',
5 py_modules = ['kider'],
6 author = 'KiDe',
7 author_email = '929557120@qq.com',
8 url = 'http://www.rampage.com',
9 description = 'KiDe's first test module',
10 )
》3. 进入kider目录,并且使用 python3 setup.py sdist 来进行编译,编译完成之后可以发现多了很多文件和目录 》4. 使用 sudo python3 setup.py install 命令安装到本地的python模块。 》5. 接下来可以在程序中按如下方式使用python模块了:
1 import kider
2 movies = ["haha", [1, 2, "Ha"], "movie2"];
3 kider.print_list(movies)
为啥不能直接通过 print_list来使用刚刚发布的python模块?
这是因为默认的在python shell中的命名空间是 __main__, 如果想要使用print_list 因为他是属于 kider 命名空间的,所以应该带上该名称空间。 不过当然你也可以使用和setup.py中的同样的语法,将命名空间中的方法引入进来,这样你就可以直接使用方法名: form kider import print_list 但是这样存在一个风险,就是会覆盖当前名称空间的同名函数。
PS:注意到install之后其实在新生成的 __pycache__ 文件夹中多了一个 pyc文件,该文件可以当做是编译后的class文件,可以删除,但是如果删除,在执行的时候就可能损失掉对应的优化性能。
Step3:可选的把模块上传到pypi 现在可以把模块上传到pypi(python package index)上了: 》1. 首先需要去官网上注册一个账号 http://pypi.python.org 》2. python3 setup.py register 如果完成了第一步,那么该步骤选则选项1, 否则其实该部也可以选择2 进行直接新账号创建注册 》3. pyhton3 setup.py sdist upload 这一步进行将模块代码上传 假设选择了将代码上传到高大上的pypi,那么肯定需要对原来函数的功能进行改进,增加两个参数,一个可以指定是否需要缩进,一个可以指定缩进时tab的个数。最终版本的代码如下:
1 """ this is KiDe's python module """
2
3 """ 这个函数打印传入的参数,如果传入的参数是一个列表,则会依次打印列表中的项。
4 支持多重嵌套的列表,会逐行依次打印出每一个嵌套列表中的所有子项。
5 """
6 # 第一个参数是输入的准备用来输出的对象,第二个参数表示如果对象中有子列表是否对子项采用缩进,第三个参数表示如果采用缩进,缩进的tab数量
7 def print_list(args, level=0, indent=False):
8 if isinstance(args, list):
9 for arg in args:
10 print_list(arg, level+1, indent)
11 else:
12 if indent:
13 for tab_stop in range(level):
14 print("t", end='')
15 print(args)
对于python指定了缺省值的参数可以省略,比如可以直接指定第三个参数而不指定第二个参数的值,此时的调用方式如下:
1 >>> import kider
2 >>> kider.print_list(['aa', 'bb', 'cc'], indent=True)
3 aa
4 bb
5 cc
- 全世界最短IE判定if(!+[1,])的解释
- Log4Net与Log2Console配合时中文问题的解决
- 如何改变AspNetPager当前页码的默认红色?
- Flash/Flex学习笔记(48):反向运动学(下)
- 如何给sublime text3安装汉化包?so easy 哦
- Flash/Flex学习笔记(47):反向运动学(上)
- 汉诺塔问题算法介绍
- Flash/Flex学习笔记(36):自己动手实现一个滑块控件(JimmySilder)
- 使用Zabbix服务端本地邮箱账号发送报警邮件及指定报警邮件操作记录
- fckeditor上传问题的解决
- Flash/Flex学习笔记(46):正向运动学
- 异步Socket处理的一些测试值
- .Net中DES加密的细节问题
- 分布式监控系统Zabbix--完整安装记录 -添加web页面监控
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【猫狗数据集】利用tensorboard可视化训练和测试过程
- springmvc之视图解析流程
- 【猫狗数据集】从命令行接收参数
- django-URL重定向(八)
- Jetpack新成员,App Startup一篇就懂
- python之利用魔术方法实现自己定义的二维向量
- 【猫狗数据集】使用top1和top5准确率衡量模型
- django-URL反向解析Reverse(九)
- spring之如何在web应用中使用?
- 【猫狗数据集】使用预训练的resnet18模型
- django-URL应用命名空间(十)
- 【colab pytorch】模型权重初始化
- 【colab pytorch】提取模型中的某一层
- django-URL实例命名空间(十一)
- 【colab pytorch】数据预处理