第五章 模块与函数

5.1 python程序的结构

  函数+类->模块              模块+模块->包                 函数+类+模块+包=Python

  python的程序由包(package)、模块(module)和函数组成。模块是处理某一类问题的集合,模块由函数和类组成。包是由一系列模块组成的集合。如图所示:

  包就是一个完成特定任务的工具箱,python提供了许多有用的工具包,如字符串处理、图形用户接口、Web应用、图形图像处理等。使用自带的这些工具包,可以提高程序员的开发效率,减少编程的复杂度,达到代码重用的效果。这些自带的工具包和模块安装在Python的安装目录下的lib子目录中。

  例如,lib目录中的xml文件夹。xml文件夹就是一个包,这个包用于完成XML的应用开发。xml包中有几个子包:dom、sax、etree和parsers。文件__init__.py是xml包的注册文件,如果没有该文件,Python将不能识别xml包。在系统字典表中定义了xml包。

注意:包必须至少含有一个__init__.py文件。__init__.py文件的内容可以为空,它用于识别当前文件夹是一个包。

5.2 模块

  模块是python中重要的概念,python的程序是由一个个模块组成的。前面已经接触到了模块,一个python文件就是一个模块。

5.2.1 模块的创建

  模块把一组相关的函数或代码组织到一个文件中。一个文件即是一个模块。模块由代码、函数或类组成。创建一个名为myModule.py的文件,即定义了一个名为myModule的模块。在myModule模块中定义一个函数func()和一个类MyClass 。MyClass类中定义一个方法myFun()。

#!/usr/bin/env python
#vim myModule.py
#自定义模块
def func():  #函数
print("MyModule.func()") class MyClass: #类          
def myFunc(self):
print("MyModule.MyClass.myFunc()")
#!/usr/bin/env python
#vim call_myModule.py
#调用自定义模块的类和函数
import myModule myModule.func()
myClass=myModule.MyClass()
myClass.myFunc()
[root@Dannyserver danny]# python call_myModule.py
MyModule.func()
MyModule.MyClass.myFunc()

注意:模块myModule.py和call_myModule.py需要在同一目录下,或放在sys.path所列出的目录下;否则python解释器找不到自定义的模块

  当python导入一个模块时,python首先查找当前路径,然后查找lib目录、site-packages目录(Python\Lib\site-packages)和环境变量PYTHONPATH(pythonpath)设置的目录。如果导入的模块没有找到,在以上路径搜索下是否含有这个模块。可以通过sys.path语句搜索模块的查找路径。

5.2.2 模块的导入

  在使用一个模块的函数或类之前,首先要导入该模块。模块的导入使用import语句,如:

import module_name

  这条语句可以直接导入一个模块。调用模块的函数或类时,需要以模块名作为前缀,其格式如下:

module_name.func()

  如果不想在程序中使用前缀符,可以使用from...import...语句导入。格式如下:

from module_name  import function_name

后面调用function_name就等同于调用module_name.function_name

  导入模块下所有的类和函数,可以使用如下格式:
from module_name import *

  此外,同一个模块文件支持多条import语句。例如,定义一个名为myModule的模块。该模块定义一个全局变量count和一个函数func()。每次调用函数func(),使变量count的值加1。

#vim myModule.py
count=1 def func():
global count
count=count+1
return count
#vim a.py
import myModule
print("count=", myModule.func())
myModule.count=10
print("count=",myModule.count) import myModule
print("count=",myModule.func())
[root@Dannyserver test2]# python a.py
count=
count=
count=

  python中的import语句比Java的import语句更加灵活。python的import语句可以置于程序中任意的位置,甚至可以放在条件语句中,在上面的代码段添加如下语句:

if myModule.count>1:
myModule.count=1
else:
import myModule
print("count=", myModule.count)

输出结果

[root@Dannyserver test2]# python a.py
count=
count=
count=
count=

5.2.3 模块的属性

  模块有一些内置属性,用于完成特定的任务,如__name__、__doc__。每个模块都有一个名称,例如,__name__用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为“__main__”。通常给每个模块都添加一个条件语句,用于单独测试该模块的功能。例如,创建一个模块myModule。

if __name__=="__main__":
print("myModule作为主程序运行")
else:
print("myModule被另一个模块调用")

单独运行该模块输出结果:

[root@Dannyserver test2]# python a.py
myModule作为主程序运行

创建另一个模块call_myModule。这么模块很简单,只要导入模块myModule即可

import myModule
print(__doc__) #调用了模块另一个属性__doc__。由于该模块没有定义文档字符串,所以输出None
[root@Dannyserver test2]# python call_myModule.py
myModule被另一个模块调用
None

5.2.4 模块的内置函数

  Python提供了一个内联模块buildin。内联模块定义了一些开发中经常使用的函数,利用这些函数可以实现数据类型的转换、数据的计算、序列的处理等功能。下面将介绍内联模块中常用的函数。

1. apply()

  python3中移除了apply函数,所以不再可用了。调用可变参数列表的函数的功能只能使用在列表前添加*来实现。

2. filter()

  filter()可以对某个序列做过滤处理。判断自定义函数的参数返回的结果是否为真来过滤,并一次性返回处理结果。filter()的声明如下所示

class filter(object)

  filter(function or None,iterable) -->filter object

filter()过滤序列的功能示例:

def func(x):
if (x>0):
return x
print (filter(func,range(-9,10))) #调用filter函数,返回的是filter对象
print(list(filter(func,range(-9,10)))) #将filter对象转换为列表
[root@Dannyserver test2]# python a.py
<filter object at 0x7fd4f762a160> #直接打印出的是filter对象,无法看到内容
[, , , , , , , , ] #将filter对象转换为列表

说明:第三行代码,使用range()生成待处理的列表,然后把该列表的值依次传入func()。func返回结果给filter(),最后将结果生成一个可迭代对象返回,可以进行遍历。

注意:filter()中的过滤函数func()的参数不能为空。否则,没有可以存储序列(sequence)元素的变量,func()也不能处理过滤。

3.reduce()

  对序列中元素的连续操作可以通过循环来处理。例如,对某个序列中的元素累加操作。Python提供的reduce()也可以实现连续处理的功能。在python2中reduce()存在与全局空间中,可以直接调用。而在python3中将其移到了functools模块中,所以使用之前需要先引入。reduce()的声明如下所示:

reduce(func,sequence[ ,  initial]) ->value

说明:

参数func是自定义的函数,在函数func()中实现对参数sequence的连续操作。

参数sequence是待处理的序列

参数inital可以省略,如果inital不为空,则inital的值将首先传入func()进行计算。如果sequence为空,则对initial的值进行处理。

reduce()的返回值是func()计算后的结果。

下面实现了对一个列表的数字进行累加的操作。

def sum(x,y):
return (x+y)
from functools import reduce #引入reduce
print(reduce(sum,range(0,10))) #0+1+2+3+4+5+6+7+8+9
print(reduce(sum,range(0,10),10)) #10+0+1+2+3+4+5+6+7+8+9
print(reduce(sum,range(0,0),10)) #range(0,0)返回0,所以直接返回后面的10
[root@Dannyserver test2]# python a.py 

注:reduce()还可以对数字进行乘法、阶乘等复杂的累计计算。如果用reduce()进行累计计算,必须在sum中定义两个参数,分别对应加法运算符两侧的操作表。

4.map()

  map()可以对tuple元组进行“解包”操作,调用时设置map()的第一个参数为None。map()的功能非常强大,可以对多个序列的每个元素都执行相同的操作,并返回一个map对象。map()的声明如下所示:

class map(object)

  map(func,*iterables) -->map object

说明:

参数func()是自定义的函数,实现对序列每个元素的操作

参数iterables是待处理的序列,参数iterables的个数可以是多个

map()的返回值是对序列元素处理后的列表。

下面这段代码实现了列表中数字的幂运算

def power(x):
return (x**x)
print(map(power,range(1,5))) #打印map对象
print(list(map(power,range(1,5)))) #转换为列表输出
def power2(x,y):
return (x**y)
print(map(power2,range(1,5),range(5,1,-1))) #打印map对象
print(list(map(power2,range(1,5),range(5,1,-1)))) #转换为列表输出,提供两个列表参数。依次计算1^5、2^4、3^3、4^2
[root@Dannyserver test2]# python a.py
<map object at 0x7f3d35d97208>
[, , , ]
<map object at 0x7f3d35d97240>
[, , , ]

注意:如果map()中提供多个序列,则每个序列中的元素一一对应进行计算,如上。如果每个序列的长度不同,则短的序列后补充None再进行计算。

python学习笔记十——模块与函数的更多相关文章

  1. Python学习笔记之模块与包

    一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...

  2. Python学习笔记014——迭代工具函数 内置函数enumerate()

    1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...

  3. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  4. Python学习笔记—itertools模块

    这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...

  5. python学习笔记_week5_模块

    模块 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), 本质就是.py结尾的python文件(文件名:test.py,对应模块名:test) 包:用来从逻辑上 ...

  6. python学习笔记013——模块

    1 模块module 1.1 模块是什么 模块是包含一系列的变量,函数,类等程序组 模块通常是一个文件,以.py结尾 1.2 模块的作用 1. 让一些相关的函数,变量,类等有逻辑的组织在一起,使逻辑更 ...

  7. PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化

    前言 若在之前写代码的方式中,从Python 解释器进入.退出后再次进入,其定义的变量.函数等都会丢失.为了解决这个为,我们需要将需要的函数.以及定义的变量等都写入一个文件当中.这个文件就叫做脚本 随 ...

  8. python 学习笔记 -logging模块(日志)

    模块级函数 logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root loggerlogging.debug().logging.info().lo ...

  9. Python学习笔记-常用模块

    1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...

随机推荐

  1. PAT A1106 Lowest Price in Supply Chain (25 分)——树的bfs遍历

    A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...

  2. SecureRandom

    我们知道,Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Ra ...

  3. jquery $.each()遍历json数组

    使用jQuery的$.each()方法来遍历一个数组对象 var json=[ {"id":"1","tagName":"appl ...

  4. SQL Server中的Merge关键字(转载)

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  5. Angularjs 地址联动2.1.1

    这个地址联动是基于 Angularjs 的 效果图如下: 看着是不是可美观了?哈哈!源码如下: <!DOCTYPE HTML> <html lang="zh-CN" ...

  6. k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)

    来源:, init='k-means++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, ...

  7. 【php增删改查实例】第二十一节 - 用户修改功能

    19.1 添加用户修改的按钮 打开userManage.html,找到新增按钮的地方: 我们不难发现,编辑按钮就差不多应该在新建用户的右边. 那么,假如我现在是新人,对这个项目本身就不太熟悉,那么我得 ...

  8. Python 学习 第七篇:函数1(定义、调用和变量的作用域)

    函数是把一些语句集合在一起的程序结构,用于把复杂的流程细分成不同的组件,能够减少代码的冗余.代码的复用和修改代码的代价. 函数可以0个.1个或多个参数,向函数传递参数,可以控制函数的流程.函数还可以返 ...

  9. CSS 表格实例

    CSS 表格实例CSS 表格属性可以帮助您极大地改善表格的外观.CSS Table 属性属性 描述border-collapse 设置是否把表格边框合并为单一的边框.border-spacing 设置 ...

  10. WinForm多线程+委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...