说明:

在使用python的时候我们除了使用内置的函数之外,可能还需要使用一些别人写的函数。或者我们写的代码也希望可以给其他人使用。要实现这样的功能,我们就需要按照下面的步骤来定义自己的模块:

Step1:新建一个py文件

首先我们将前面一章所写的打印列表的函数保存为一个.py文件,假设我这里保存为 kider.py。

 """
这是一个打印列表的函数,如果列表中有嵌套的列表也会展开打印出来
"""
def print_list(movies):
if isinstance(movies, list):
for movie in movies:
print_list(movie)
else:
print(movies)

kider.py

如果要发布的话,最好将函数快代码添加上注释。在python里面,三引号 """ 中的字符串表注释,这个是多行注释 ,单行注释使用 # 。
这时候如果想使用该模块,最原始的办法是将前面的kider.py文件放入到本机的python模块地址。

如何知道本机的python模块放在哪,只需在IDLE(python控制台)中输入:

import sys

sys.path

sys.path的输出就是本机的python模块所在的文件

 >>> import sys
>>> sys.path
['', '/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']

modulePath

 Step2:将py文件作为模块安装到本地
但其实我们不需要将自己写的python模块放入本机的python模块地址,可以直接通过命令来安装python模块到本机:
主要步骤如下:
》1.新建一个和准备安装的python文件同名的目录,这里取名为 kider,并且将前面的kider.py文件放入该目录下
》2. 在该目录下建立一个setup.py文件,并且编辑文件的内容大致如下:

 from distutils.core import setup
setup(
name = 'kider',
version = '1.0.0',
py_modules = ['kider'],
author = 'KiDe',
author_email = '929557120@qq.com',
url = 'http://www.rampage.com',
description = 'KiDe\'s first test module',
)

setup.py

》3. 进入kider目录,并且使用 python3 setup.py sdist 来进行编译,编译完成之后可以发现多了很多文件和目录
》4. 使用 sudo python3 setup.py install 命令安装到本地的python模块。
》5. 接下来可以在程序中按如下方式使用python模块了:

 import kider
movies = ["haha", [1, 2, "Ha"], "movie2"];
kider.print_list(movies)

UseKider

为啥不能直接通过 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的个数。最终版本的代码如下:

 """ this is KiDe's python module """

 """ 这个函数打印传入的参数,如果传入的参数是一个列表,则会依次打印列表中的项。
支持多重嵌套的列表,会逐行依次打印出每一个嵌套列表中的所有子项。
"""
# 第一个参数是输入的准备用来输出的对象,第二个参数表示如果对象中有子列表是否对子项采用缩进,第三个参数表示如果采用缩进,缩进的tab数量
def print_list(args, level=0, indent=False):
if isinstance(args, list):
for arg in args:
print_list(arg, level+1, indent)
else:
if indent:
for tab_stop in range(level):
print("\t", end='')
print(args)

kider.py

对于python指定了缺省值的参数可以省略,比如可以直接指定第三个参数而不指定第二个参数的值,此时的调用方式如下:

 >>> import kider
>>> kider.print_list(['aa', 'bb', 'cc'], indent=True)
aa
bb
cc

Invoke

Python(2):创建函数模块的更多相关文章

  1. Python 动态创建函数【转】

    知乎上也有相似的问题 偶然碰到一个问题,初想是通过动态创建Python函数的方式来解决,于是调研了动态创建Python函数的方法. 定义lambda函数 在Python中定义lambda函数的写法很简 ...

  2. python 循环语句 函数 模块

    python循环语句 while循环语法结构 当需要语句不断的重复执行时,可以使用while循环 while expression: while_suite 语句ehile_suite会被连续不断的循 ...

  3. Head First Python之2函数模块

    模块就是一个包含Python代码的文本文件,以.py结尾. 第三方模块都在PyPI(python package index)上,可使用PyPI发布你的模块,供他人使用. 注释代码 # coding= ...

  4. python基础14 ---函数模块5(模块和包)

    模块与包 一.模块 1.模块是怎么诞生的. 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护.为了编写可维护的代码,我们把很多函数分组,分别放到 不同的文 ...

  5. python基础12 ---函数模块2

    函数模块 一.sys函数模块详解 1.sys.argv[x] 功能:从程序外部接受参数,接收的参数个数可以是多个,在程序内部sys.argv吧这些外部参数转换成元组的形式,然后以索引x的方式在内部取出 ...

  6. python基础11 ---函数模块1

    函数模块 一.函数模块的作用(为什么要有函数模块) 1.函数模块可以减少代码量 2.函数模块方便阅读 3.函数模块维护性强二.函数模块的本质以及调用方法 1.函数模块的本质就是一个.py结尾的文件,该 ...

  7. Python变量/运算符/函数/模块/string

    Python笔记(一) 1.变量类型 Python 有五个内置的简单类型:bool.int.long.float 和 complex.这些类型是不可变的,就是说整数对象一旦创建,其类型便不可更改. t ...

  8. python基础13 ---函数模块3(正则表达式)

    正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的 ...

  9. python基础14 ---函数模块4(configparser模块)

    configparser模块 一.configparser模块 1.什么是configparser模块:configparser模块操作配置文件,配置文件的格式与windows ini和linux的c ...

随机推荐

  1. leetcode 合并两个有序数组

    给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: - 初始化 nums1 和 nums2 的元素数量分别为 m 和 ...

  2. .NET处理HTTP请求

    第一种:使用HttpWebRequest string result = ""; HttpWebRequest request = (HttpWebRequest)WebReque ...

  3. UWP开发砸手机系列(一)—— Accessibility

    因为今天讨论的内容不属于入门系列,所以我把标题都改了.这个啥Accessibility说实话属于及其蛋疼的内容,即如何让视力有障碍的人也能通过声音来使用触屏手机……也许你这辈子也不会接触,但如果有一天 ...

  4. 使用 Apache Atlas 进行数据治理

    本文由  网易云发布. 作者:网易/刘勋(本篇文章仅限知乎内部分享,如需转载,请取得作者同意授权.) 面对海量且持续增加的各式各样的数据对象,你是否有信心知道哪些数据从哪里来以及它如何随时间而变化?采 ...

  5. jQuery--事件, 事件绑定, 阻止事件冒泡, 事件委托,页面载入后函数

    1.常用事件, 按住shift键实现同步选择效果,搜索框联想效果 2.阻止事件冒泡 3.事件委托 4.使用 $(document).ready(function (){...}) 实现文件加载完绑定事 ...

  6. java修饰符顺序

    Modifiers should be declared in the correct order (squid:ModifiersOrderCheck) Code smell Minor The J ...

  7. Java Web 学习与总结(三)会话跟踪

    何为会话跟踪?举个简单的例子,比如登陆到某购物网站后,在一定时间内无论你在这个网站中切换到任意的网页,只要不执行退出操作,一直保持着你账号的登录状态. 那么在Java Web中我们应当如何去实现这一操 ...

  8. 【招聘】滴滴滴~ i春秋内推直通车来咯,帮你找工作!

    凑是这么简单粗暴,i春秋冬日特享福利!虽然金九银十已经过去,但素想换工作想找工作的小哥哥小姐姐看过来! [职位方向]渗 透 测 试.代 码 审 计.安全开发.病毒分析.风险控制.安全运维.....任何 ...

  9. logstash5.5.0同步sql server数据

    注意:jdbc.conf和jdbc.sql文件编码都为ANSI jdbc.conf内容如下: input { stdin { } jdbc { jdbc_connection_string => ...

  10. P2051 中国象棋

    P2051 中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中 ...