Python研究学习--7--模块和包

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/82503502

7.1 Python程序的结构

包 [ 模块 [ 类 [ 函数 [ 变量等 ] ] ] ]

7.2 模块

模块简介:
模块是python组织代码的基本方式。
一个脚本可以导入到另一个脚本中运行,因此.py文件就是模块
模块名与脚本名相同 (注意!没有.py后缀)

调用模块方法:

import 模块名
import 模块名 as 模块重命名           #一般重命名为更方便理解的名字,为了后期维护
from 模块名 import 函数              #再用该函数将不再声明模块名。如:hanshu()。但是其会造成代码可读性较差。
from 模块名 import *                #导入模块下所有的函数

调用模块规则:

模块名.函数                         #使用模块下的函数。若模块下没有该函数则报错  
1、先在当前目录下寻找要导入的模块。
2、如果当前目录下没有,则到系统模块目录下寻找。(Lib目录)
3、如果上条没有。则到site-packages目录下寻找。(Python27\Lib\site-packages)
4、如果上条没有。则到环境变量(PYTHONPATH)设置的目录下寻找。
5、如果都没有,则报错

模块属性介绍:

1、__name__属性。注意左右各是两个下划线。下同。
    该属性在此处代表当前模块名字,如果当前程序正在被使用,则__name__的值为__main__。常在调试代码时用到。
    用法:通常是加一个条件语句来测试该模块的功能。

2、__doc__属性。
    Python中的模块是一个对象,而每一个对象都会有一个__doc__属性。该属性用来描述该对象的作用。
    用法:直接输出该属性即可。同时它可以输出文档字符串的内容。

模块的内置函数:
内联模块(buildin模块)中定义了许多在软件开发过程中常用的函数。

apply()函数
    该函数可以实现调用可变参数列表的功能,把函数的参数存放到一个元组或序列中。
    用法:apply(函数名,[参数])            #该函数有几个参数,这里就传递几个参数

filter()函数
    该函数可以对序列做过滤处理。就是用一个函数来过滤一个序列,把序列的每一项都传递到过滤函数中。通过返回结果是否为True来过滤。
    用法:filter(过滤函数,被过滤序列)

reduce()函数
    该函数可以实现连续处理功能。例如:累加
    用法:reduce(函数名,待处理序列)

map()函数
    该函数可以对多个序列中的每个元素执行相同的操作,并返回一个与输入序列长度相同的列表。
    用法:map(函数名,待处理序列)           #可以接收多个待处理序列。长度不一时短序列后面补None

dir()函数:
该函数返回一个列表,列表容纳了在一个模块里定义的所有模块、变量和函数。

# -*- coding:utf-8 -*-
import math

content = dir(math)
print content

代码执行结果如下所示:
执行结果如图所示

7.3 包

包简介:
python的模块可以按目录组织为包。就是很多功能类同模块放一起。
举例: 安装目录Lib下的sqlite3文件夹就是一个包,用于数据库相关操作。

创建包:
创建一个名字为包名的文件夹
在该文件夹下创建一个__init__.py的文件 #注意!那个是前后双下划线。这是包的标志
根据需要在该文件夹下存放脚本文件(模块)

包的调用:

import 包名.模块名

7.4 代码实例

调用执行环境应和模块所在环境在同一目录下!

第一个代码文件:jisuan.py

# -*- coding:utf-8 -*-

def jia(x,y):
    u"doc属性描述字符串在这里"
    return x+y
def jian(x,y):
    return x-y
if __name__ == "__main__":       #代表被直接执行,否则代表被调用,不执行下方代码
    print jia(3,4)
    print jian(7,6)
print jia.__doc__                #输出描述字符串
print apply(jia,[8,9])           #该函数有几个参数,此处就写几个参数。返回17

第二个代码文件:diaoyong.py

# -*- coding:utf-8 -*-

import jisuan                    #如果模块在其他目录下,将运行环境转移到其他目录即可
import jisuan as jiajianfa       #一般重命名为更方便理解的名字,为了后期维护
from jisuan import jia 

#测试__name__属性
if __name__=='__main__':  
    print u"是主程序"
else:
    print u"不是主程序"

#测试__doc__属性。输出描述字符串
print __doc__ 

#测试reduce函数
s=[1,2,3,4,5,6,7,8,9]
print reduce(jia,s)              #此处实现累加功能

#常规调用模块中的函数
x=jisuan.jia(1,2)
x=jiajianfa.jia(1,2)
x=jia(1,2)
print x

第三个代码文件:

# -*- coding:utf-8 -*-

#filter函数
str=[-1,-2,-3,-4,1,2,3,4,5,6]
def guolv(x):
    if x>=-1:
        return x
print filter(guolv,str)            #过滤,返回过滤后的新序列[-1,1,2,3,4,5,6]

#map函数
def add1(a):
    return a+1
def add2(a,b):
    return a+b
def add3(a,b,c):
    return a+b+c
a1=[1,2,3,4]
a2=[1,2,3,4]
a3=[1,2,3,4]
print map(add1,a1)                #输出:[2,3,4,5]
print map(add2,a1,a2)             #输出:[2,4,6,8]
print map(add3,a1,a2,a3)          #输出:[3,6,9,12]

7.5 浅拷贝和深拷贝

背景:python中以存储数据为基准,不同变量若值相同,则存储相同地址空间,一旦一个变量值变化,另一个变量值相应变化
目标:将其值拷贝出来,使得一个变量值变化,另一个变量保持不变

浅拷贝:
对引用的拷贝。只拷贝父对象。
以拷贝一变量为例。只拷贝了变量名,变量名存储空间变化,使其具有相同值的两个变量名占用不同的存储空间,而变量值存储空间不变。
若一变量可变值(原始值)变化则另一变量值随之变化。可变值之外的值变化对方不受影响。
深拷贝:
对对象资源的拷贝。
以拷贝一变量为例。拷贝了变量的值,变量名和它的值的地址都变化了。修改一变量任意值对方不受影响。

代码实例:

# -*- coding:utf-8 -*-
import copy                          #调用拷贝模块

a=[1,2,3,['a','b','c']]
b=a                                  #b和a完全相同

c=copy.copy(a)                       #浅拷贝a。copy模块的copy函数
a.append('d')                        #变量a和b变化。多了一个字符
print c                              #变量c不变
a[3].append('d')                     #改变原始值
print c                              #变量a可变值(原始值)变化,变量c随之变化

d=copy.deepcopy(a)                   #深拷贝a。copy模块的deepcopy函数
a.remove(1)                          #删除原始数据1。原始值变化
print a                              #变量a变化
print d                              #变量d不受影响

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/82503502
今日推荐