Python基础学习09(模块的小知识)

Python基础学习09(模块的小知识)

本节内容,阅读了解为主

ppt看到这里基本就结束了,
剩下要看的,基本就需要另外去找了

模块

开发过程中,一个文件里代码会越来越长,维护起来就不容易。
为了编写课维护的代码,把很多函数分组,放到不同的文件里,这样每个文件包含的代码就相对较少,这是一种常用的组织代码的方式。
在Python中,一个.py文件就称之为一个模块(Module)

使用模块的好处,
提高代码的可维护性,可以引用python内置的模块和第三方模块,可以避免函数名和变量名冲突,相同的函数名和变量可以分别存在不同的模块中。
https://docs.python.org/3/library/functions.html
可以查看Python的内置函数

为了避免模块名冲突,Python又引入了按目录来组织模块的方法,
称为 (Package)

举个栗子,
一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件同理
现在,假设abc和xyz这两个模块名字和其他的模块冲突了,
于是,我们可以通过包来组织模块,避免冲突。
方法是选择一个顶层包名,比如mycompany,按照以下目录存放:
在这里插入图片描述
引入名以后,只要顶层的包名不与别人冲突,其所有模块也不会冲突。abc.py的模块就变成了mycompany.abc

注意,每一个包目录下面都会有一个

__init__py

文件,文件必须存在,否则,Python就把这个当成 普通目录 ,而不是一个包。

上面所说的文件,可以是空文件,也可以有Python代码,因为其本身就是一个模块,它的模块名是 mycompany

类似的,可以有多级目录,组成多级层次的包结构,比如:
在这里插入图片描述
文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名,分别是mycompany.utils和mycompany.web.utils

自己创建模块的时候,注意命名不要和Python自带的模块冲突,否则,无法导入系统自带的对应模块。

使用、编写模块

Python本身内置了很多非常有用的模块,只要安装完毕,就可以使用

以内建的sys模块为例,编写一个hello的模块。
示例:

#!/usr/bin/env python3		一二行是标准注释,第一行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行
#-*-coding:utf-8 -*-	    第二行注释表示.py文件本身使用UTF-8编码

' a test module '			一个字符串,表示模块的文档注释,任何模块代码的 第一个衣服穿都被视为模块的文档注释

__anthor__='Kagura mea'	    使用__author__变量把作者写进去,之前内容就是Python模块的标准文件模块,当然也可以删掉不写

import sys					导入该模块

def test():
	args=sys.argv			变量sys指向该模块,利用这个变量,就可以访问模块的所有功能
	if len(args)==1:
		print('Hello,world!')
	elif len(args)==2:
		print('Hello,%s!'%args[1])
	else:
		print('Too many arguments!')
if __name__=='__main__':
	test()

sys模块有一个argv变量,用list存储了命令行的所有参数。
argv至少有一个元素,因为这第一个元素永远是该.py文件的名称
例如:
运行python3 hello.py获得的sys.argv就是[‘hello.py’];
运行python3 hello.py Kagura获得的sys.argv就是[‘hello.py’,‘Kagura’].

最后,两行代码
当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量
置为另一个

__name__=__main__

如果在其他地方导入该hello模块时,if判断失败,
因此,这种if测试可以让一个模块通过命令行运行时,执行一些额外的代码,最常见的就是运行测试。

命令行运行(并不会),之后学吧

启动Python交互环境,导入hello模块,导入时,不会打印结果,
调用hello.test()时,才能打印出

作用域

确定某些函数和变量的使用者,私有,公有等等

Python中,可以通过_前缀实现,

正常的函数和变量是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似

__xxx__

的变量是特殊变量,可以被直接引用,有特殊用途,比如上文的author

__name__

就是特殊变量,hello模块定义的文档注释也可以用特殊变量

__doc__

来访问,我们自己的变量一般不要用这种变量名;
类似

_xxx和__xxx

这样的函数或变量就是非公开的(private),不应该直接引用,比如 _abc,___abc等;

之所以,“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制private函数或变量,从习惯上,是不应该拿引用的。

Python函数或变量不应该,被别人引用,有什么用呢?
示例

def _prinvate_1(name):
	return 'Hello, %s'%name
def _private_2(name):
	return 'Hi,%s'%name
def greeting(name):
	if len(name)>3:
		return _private_1(name)
	else:
		return _private_2(name)

我们在模块里公开greeting()函数,而把内部逻辑用private()函数隐藏起来,这样,调用greeting()函数,不用关心内部的private函数细节,也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public

安装第三方模块

Python中,安装第三方模块,是通过包管理工具pip完成的
Mac/Linux系统可以跳过安装pip这个步骤
Windows,确认安装时勾选了pip和Add python.exe

例如,安装一个第三方库— —Python Imaging Library 是Python下非常强大的处理图像的工具库,不过,基于PIL的Pillow项目开发很活跃,支持Python3
一般来说,第三方库都会在Python的官方网站的pypi.python.org网站注册,要安装一个第三方库,知道库的名字,就可以在官网或者pypi上搜索

示例,安装Pillow的命令

pip install Pillow

安装常用模块

使用Python时,我们经常需要使用很多第三方库,例如,Pillow,MySQL驱动程序,Web框架Flask,科学计算Numpy等。
使用pip安装一个一个费时费力,还要考虑兼容性

推荐使用 Anaconda,是一个基于Python的数据处理和科学计算平台,内置了许多第三方库

可以从Anaconda官网下载GUI安装包,下载后直接安装,Anaconda会把系统Python指向自己带的Python,并且,Anaconda安装的第三方模块会在自己的路径下,不影响系统已安装的Python目录。

安装好后,打开命令行窗口,输入Python可以看到Anaconda信息,
可以直接尝试import numpy等已安装的第三方模块。

模块搜索路径

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中
示例

>>>import sys
>>>sys.path

如果要添加自己的搜索目录,
一、直接修改sys.path,添加要修改的目录

>>>import sys
>>>sys.path.append('/User/kagura/df')

仅在运行时修改,结束后,失效
二、设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到搜索模块中,设置方式与Path环境变量类似。注意,只需要添加你自己的搜索路径。

猜你喜欢

转载自blog.csdn.net/weixin_43420243/article/details/86750824