python学习笔记十——模块与函数
第五章 模块与函数
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学习笔记十——模块与函数的更多相关文章
- Python学习笔记之模块与包
一.模块 1.模块的概念 模块这一概念很大程度上是为了解决代码的可重用性而出现的,其实这一概念并没有多复杂,简单来说不过是一个后缀为 .py 的 Python 文件而已 例如,我在某个工作中经常需要打 ...
- Python学习笔记014——迭代工具函数 内置函数enumerate()
1 描述 enumerate() 函数用于将一个可遍历的数据对象(如列表.元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中. 2 语法 enumerate(sequ ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- Python学习笔记—itertools模块
这篇是看wklken的<Python进阶-Itertools模块小结> 学习itertools模块的学习笔记 在看itertools中各函数的源代码时,刚开始还比较轻松,但后面看起来就比较 ...
- python学习笔记_week5_模块
模块 一.定义: 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能), 本质就是.py结尾的python文件(文件名:test.py,对应模块名:test) 包:用来从逻辑上 ...
- python学习笔记013——模块
1 模块module 1.1 模块是什么 模块是包含一系列的变量,函数,类等程序组 模块通常是一个文件,以.py结尾 1.2 模块的作用 1. 让一些相关的函数,变量,类等有逻辑的组织在一起,使逻辑更 ...
- PYTHON 学习笔记4 模块的使用、基本IO 写入读取、JSON序列化
前言 若在之前写代码的方式中,从Python 解释器进入.退出后再次进入,其定义的变量.函数等都会丢失.为了解决这个为,我们需要将需要的函数.以及定义的变量等都写入一个文件当中.这个文件就叫做脚本 随 ...
- python 学习笔记 -logging模块(日志)
模块级函数 logging.getLogger([name]):返回一个logger对象,如果没有指定名字将返回root loggerlogging.debug().logging.info().lo ...
- Python学习笔记-常用模块
1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作 ...
随机推荐
- oracle远程物化视图
一.创建远程物化视图日志 源端: CREATE MATERIALIZED VIEW LOG ON tozwdb.test tablespace tozwdb_data WITH ROWID; 二.付权 ...
- PAT A1019 General Palindromic Number (20 分)——回文,进制转换
A number that will be the same when it is written forwards or backwards is known as a Palindromic Nu ...
- 【Codeforces 1137C】Museums Tour
Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...
- 最近开始学习Cesium,学习学习。
最近开始学习Cesium,学习学习.
- 学习Android(入门基础和实用教程)
为了方便大家学习,准备录制Android基础篇的视频教程, https://item.taobao.com/item.htm?spm=0.7095261.0.0.17a61debAKIDPI& ...
- CSS3选择器之:nth-child(n)
第一次用到这个选择器还是为了解决下面了的问题: 手机的前端,我们使用了mint-ui,里面有一个日期选择控件,但是选择的时候没有提供年月的选择器,如: 而是提供了下面的方式: 为了达到上面的效果,使用 ...
- 【强化学习】python 实现 q-learning 例一
本文作者:hhh5460 本文地址:https://www.cnblogs.com/hhh5460/p/10134018.html 问题情境 -o---T# T 就是宝藏的位置, o 是探索者的位置 ...
- 记一次MongoDB裸奔
导言 大意失荆州,裸奔的 MongoDB 被黑了.虽然并不是什么非常重要的数据,但也给自己敲响的一个警钟.虽然我们平时不容易接触到数据安全,但我们在开发,部署项目的时候,一定要养成良好的安全意识. 根 ...
- .Net core使用EF Core Migration做数据库升级
---恢复内容开始--- (1)VS Code下创建含有授权功能的并且使用localdb作为数据库的命令 dotnet new -au individual -uld --name identityS ...
- Mvc4_ @RenderBody、@RenderPage、@RenderSection用法
一.@RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过_Layout.cshtml布局页面的@RenderBody() ...