Python中模块的使用

  • 原文博客地址: Python中模块的使用
  • 做过开发工作的童鞋应该都知道, 在一个完整的项目中, 会有大量的代码, 而且慢慢代码量会越来越多, 代码也就越来越难以维护;
  • 随着你的程序变得越来越长,你可能想要将它分割成几个更易于维护的文件。
  • 你也可能想在不同的程序中使用顺手的函数,而不是把代码在它们之间中拷来拷去
  • 为了解决类似问题, 我们把很多功能相似的函数分组, 分别放到不同的文件中,这样每个文件中的代码相对较少, 且函数功能相似;
  • GitHub代码示例目地址

概述

模块简述

  • Python中提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用, 这样的文件被称为模块;
  • 模块中的定义可以导入到另一个模块或主模块中(在脚本执行时可以调用的变量集位于最高级,并且处于计算器模式)
  • 模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py 后缀。
  • 模块的模块名(做为一个字符串)可以由全局变量 __name__ 得到
  • 模块主要分为内置模块, 三方模块和自定义模块

模块优点

  • 提高了代码的可维护性
  • 提高了代码的服用度, 当一个模块完毕, 可以被多个地方引用
  • 可避免函数名和变量名的冲突

标准库模块

下面是一个使用python标准库中模块的例子

import sys

print('命令行参数如下:')
for i in sys.argv:
   print(i)

print('\n\nPython 路径为:', sys.path, '\n')


# 输出结果如下
命令行参数如下:
../GitHub/PythonDemo/PythonStudy/7-模块/1-模块概述.py

Python 路径为: ['/Users/../GitHub/PythonDemo/PythonStudy/7-模块', '/Users/../GitHub/PythonDemo/PythonStudy', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages', '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend'] 
  • argv: 获取命令行参数的列表
  • import sys 引入python标准库中的sys.py模块
  • import: 这是引入一个模块的方法(后面会提到)
  • sys.path: 包含了一个Python解释器自动查找所需模块的路径的列表

自定义模块

  • Python中不但可以使用第三方模块和系统模块, 同时我们还可以使用自定义模块,
  • Python中一个.py文件就是一个模块
  • 下面是我自定义的一个Titan.py模块, 代码如下
print('这是Titan模块')

# 定义变量
age = 20
name = 'titan'

# 定义方法
def sayGood():
    print('good')

def sayNice():
    print('nice')

def sayBad():
    print('bad')

导入模块

import方式

Python中导入另一个文件或者模块, 受用的语法是import

# 引入单个或多个模块
import module1[, module2[,... moduleN]

# 示例
# 一次导入多个模块
import time, random, os
# 一次导入一个模块
import calendar

需要注意的是:

  • 一个模块只会被导入一次,不管你执行了多少次import, 可以防止模块被重复引用
  • 引入任何模块时(包括自定义模块), 不用加.py后缀
  • 当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?
    • 这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。
    • 这看起来很像环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径。
    • 搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量

使用示例

import Titan

Titan.sayBad()
Titan.sayGood()
print(Titan.name)

# 输出结果:
bad
good
titan

from…import方式

从模块中导入一个指定的部分到当前的命名空间, 同样也可以导入一个模块中的多个部分(或者导入多个方法或变量), 格式如下:

from modname import name1[, name2[, ... nameN]]

使用示例

from Titan import sayGood, sayBad, age

sayBad()
sayGood()
print(age)

# 输出结果:
bad
good
20

需要注意的是:
这种方式, 可能会导致和本文件中定义的方法或者变量重名, 这里需要注意

from…import*方式

把一个模块中所有的内容, 全部倒入当前命名空间, 但是最好不要过多地使用

# 格式:
from modname import *

# 使用:
from Titan import *
sayGood()
print(age)

模块内置属性和函数

__name__属性

  • 除了包含函数定义外,模块也可以包含可执行语句, 这些语句一般用来初始化模块, 他们仅在第一次被导入的地方执行一次
  • 模块就是一个可执行的.py文件, 一个模块呗另一个程序引用, 模块中的一些可执行语句便会执行
  • 如果我们不想让模块中的某些代码执行, 可以用__name__属性来使程序仅调用模块中的一部分
  • 现在我们将模块中的代码修改如下:
if __name__ == '__main__':
    print('这是Titan模块')
else:
    def sayGood():
        print('good')


    def sayNice():
        print('nice')


    def sayBad():
        print('bad')


    age = 20
    name = 'titan'
  • namemain前后都是双下划线
  • 每一个模块中都有一个__name__属性, 当其值等于__main__时, 表明该模块自身在执行, 否则被引入了其他文件
  • 当前文件如果为程序的入口文件, 则__name__属性的值为__main__

dir()函数

  • 内置的函数dir() 可以找到模块内定义的所有名称, 以一个字符串列表的形式返回
  • 如果没有给定参数,那么dir()函数会罗列出当前定义的所有名称
import Titan

print(dir(Titan))

# 输出结果:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'age', 'name', 'sayBad', 'sayGood', 'sayNice']


print(dir())
# 输出结果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']


# 这里定义一个新的变量
sum = 30
print(dir())
# 输出结果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sum']


# 把定义的变量删除后
del sum
print(dir())
# 输出结果:
['Titan', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']

这里我们先思考这样一个问题: 在同一个项目中有两个或两个以上的开发者分别定义了相同名字的模块(当然狮子啊不同的目录中, 同一个目录下不可能创建出相同名字的文件), 那么模块该如何调用

解决

  • 为了解决上述模块命名的冲突, 引入了按照目录来组织模块的方法, 成为包
  • 包是一种管理Python模块命名空间的形式,采用"点模块名称"
  • 引入包以后, 只要顶层的包不与其他人的发生冲突, 那么模块就都不会与别人的发生冲突
  • 所谓顶层的包指的是上一层的文件目录
  • 同一个包可以包含多个模块
  • 例如: 名为A.B的模块表示了名为A的包中名为B的子模块

需要注意的是:

在每一个包内(模块的同级目录下)必须要创建一个名为__init__.py的文件, 主要是为了避免一些滥竽充数的名字, 目前该文件内可以什么都不用写, 如图所示:

包.png

调用方法

import a.Titan
import b.Titan
import b.coder

a.Titan.sayGood()
b.Titan.sayGood()
b.coder.sayGood()


# 输出结果:
good--a
good--b
good--coder

安装使用第三方模块

pip简介

  • Python中第三方库是通过pip安装和管理的, pip就像iOS中的pod一样, 负责安装和管理第三方库
  • MacLinux系统中pip是默认安装过的, 一般无需重新安装, 如有问题, 请自行百度解决
  • Mac系统中会有一个默认的Python2.7版本的, 我自己安装了一个3.6的版本, 自然默认也安装了pip
  • 下面是一些Python3.6pip的命令, 这里需要以pip3为命令头执行
# 查看当前pip版本
pip3 -V

# 安装第三方库
pip3 install ...

# 对pip进行升级
pip3 install --upgrade pip3

安装第三方库

  • Mac系统安装第三方库, 直接打开终端执行安装命令即可
  • Pillow已经是Python平台事实上的图像处理标准库了
  • PIL功能非常强大,但API却非常简单易用
pip3 install Pillow

第三方模块的使用

操作图像

下面是最常见的图像缩放操作示例代码

from PIL import Image

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('titan.jpg')

# 获得图像尺寸
w, h = im.size
print('image size: %sx%s' % (w, h))

# 缩放到50%:
im.thumbnail((w//2, h//2))
print('image to: %sx%s' % (w//2, h//2))

# 把缩放后的图像用jpeg格式保存:
im.save('jun.jpg', 'jpeg')

其他功能如切片、旋转、滤镜、输出文字、调色板等一应俱全, 代码如下:

from PIL import Image, ImageFilter

# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('jun.jpg')
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('jun1.jpg', 'jpeg')

相关参考


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,171评论 4 16
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,791评论 17 410
  • 在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Pyth...
    一只写程序的猿阅读 3,959评论 0 3
  • 三、模块命名空间 命名空间(名称空间)中保存了变量名到对象的映射。向命名空间添加变量名的操作过程涉及到绑定变量到指...
    常大鹏阅读 1,720评论 0 4
  • 一个人,呆在宿舍,嗅不到中秋的味道。 只是,在跟妈妈的聊天中,感觉到了没有回家过节的失落和心酸。 昨晚,彻夜难眠。...
    减肥的女孩阅读 275评论 0 1