廖雪峰python3.6教程笔记7-Python基础之模块

本文详细介绍了 Python 中的模块概念及使用方法,包括如何创建和使用自定义模块、安装第三方模块,以及常用内建模块和第三方模块的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

 模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。在Python中,一个.py文件就称之为一个模块(Module)。

特性:

 大大提高了代码的可维护性。

 其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包  括Python内置的模块和来自第三方的模块。

包(Package):

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

 方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany

├─ __init__.py

├─ abc.py

└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。类似的,可以有多级目录,组成多级层次的包结构

创建自己的模块时,要注意:

  • 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
  • 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块 

一使用模块

二安装第三方模块

三常见内建模块

四常用第三方模块

感觉这部分廖雪峰老师排版的比较乱,可能也是因为这部分东西本来也比较杂。里面介绍的一些模块,我平时没用过,所以看着头晕,也不想看。所以比较相对范范了。常用内建模块的话,非常常用的我以后会分开一个个介绍的,第三方模块的话,我自己常用的我以后也会单独拿出来介绍的。那就先到这里了。

  

一 使用模块

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

#!/usr/bin/env python3   //可以让这个hello.py文件直接在Unix/Linux/Mac上运行
# -*- coding: utf-8 -*-      //表示.py文件本身使用标准UTF-8编码;
' a test module '    //一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
__author__ = 'xue zha’      //使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
import sys     //导入该模块,可以访问sys模块的所有功能
def test():
    args = sys.argv
    if len(args)==1:
        print('Hello, world!')
    elif len(args)==2:
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')
if __name__=='__main__':    //Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。
    test()

如下的两个链接比较详细的介绍了__name__=='__main__'的作用,总结就是Make a script both importable and executable

https://www.liaoxuefeng.com/discuss/001409195742008d822b26cf3de46aea14f2b7378a1ba91000/001493211314389d16e06a0a58b4890b055866c763f2d71000

https://stackoverflow.com/questions/419163/what-does-if-name-main-do

作用域

在一个模块中,会定义很多函数和变量,有的函数和变量希望给别人使用,有的函数和变量希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。

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

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;其实Python并没有一种方法可以完全限制访问private函数或变量,只是从编程习惯上不应该引用private函数或变量。 

二 安装第三方模块

在Python中,安装第三方模块,是通过包管理工具pip完成的.

注意:Mac或Linux上有可能并存Python 3.x和Python 2.x,因此对应的pip命令是pip3

方法一:

在使用Python时,我们经常需要用到很多第三方库,例如,处理图像的工具库

PIL/Pillow,以及MySQL驱动程序,Web框架Flask,科学计算Numpy等。 

pip install Pillow

方法二:

用pip一个一个安装费时费力,还需要考虑兼容性。我们推荐直接使用Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。

可以从Anaconda官网下载GUI安装包,安装包有500~600M,所以需要耐心等待下载。网速慢的同学请移步国内镜像。下载后直接安装,Anaconda会把系统Path中的python指向自己自带的Python,并且,Anaconda安装的第三方模块会安装在Anaconda自己的路径下,不影响系统已安装的Python目录。

安装好Anaconda后,重新打开命令行窗口,输入python,可以看到Anaconda的信息

模块搜索路径

当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错:

>>> import mymodule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mymodule'

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

>>> sys.path
['','/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python36.zip', '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6', '/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/site-packages']

如果我们要添加自己的搜索目录,有两种方法:

一是直接修改sys.path,添加要搜索的目录:

>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

这种方法是在运行时修改,运行结束后失效。

第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响 

三 常见内建模块

这个章节里面廖雪峰还算详细的介绍了好几个内建模块:datetime, collections, base64, struct, hashlib, hmac, itertools, contextlib, urllib, XML, HTMLParser. 有很多我平时没遇到过的就暂时不提了,几个用到过的简单说明下,这些在实际应用中去学习会更有效率点。 

1 datetime

datetime是python处理日期和时间的标准库。 

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2018, 4, 9, 19, 46, 34, 890462)
>>> now = datetime.now()
>>> print(now)
2018-04-09 19:46:52.898472   //获取当前日期和时间
>>> type(now)
<class 'datetime.datetime'>
>>> dt = datetime(2015, 4, 19, 12, 20)  //获取指定日期和时间
>>> print(dt)   
2015-04-19 12:20:00
>>> dt.timestamp()         //datetime转换为timestamp
1429417200.0
>>> print(datetime.fromtimestamp(1429417200.0)) //timestamp转换为datetime, 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(1429417200.0))  //转换到UTC标准时区的时间
2015-04-19 04:20:00
>>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')    //str转换为datetime
>>> print(cday)
2015-06-01 18:19:59
>>> now = datetime.now()
>>> print(now.strftime('%a, %b %d %H:%M'))  //datetime转换为str
Mon, Apr 09 19:56
>>> from datetime import datetime, timedelta    //datetime加减
>>> now + timedelta(hours=10)
datetime.datetime(2018, 4, 10, 5, 56, 17, 335833)
>>> now + timedelta(days=10)
datetime.datetime(2018, 4, 19, 19, 56, 17, 335833)
>>> now + timedelta(days=1, hours=1)
datetime.datetime(2018, 4, 10, 20, 56, 17, 335833)

2 collections

collections是Python内建的一个集合模块,提供了许多有用的集合类。

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> type(Point)
<class 'type'>
>>> p = Point(1, 2)    //namedtuple是一个函数,它用来创建一个自定义的tuple对象
>>> type(p)
<class '__main__.Point'>
>>> p.x
1
>>> p.y
2
>>> isinstance(p, tuple)   //创建的Point对象是tuple的一种子类
True
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')   //高效实现插入和删除操作的双向列表,适合用于队列和栈
>>> q
deque(['y', 'a', 'b', 'c', 'x'])
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1']
'abc'
>>> dd['key2']    //如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict
'N/A'
from collections import OrderedDict
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od
OrderedDict([('a', 1), ('b', 2), ('c', 3)])   //OrderedDict的Key会按照插入的顺序排列,不是Key本身排序,便于对dict做迭代。
>>> from collections import Counter
>>> c = Counter()    //Counter是一个简单的计数器
>>> for ch in 'programming':
...     c[ch] = c[ch] + 1
>>> c
Counter({'r': 2, 'g': 2, 'm': 2, 'p': 1, 'o': 1, 'a': 1, 'i': 1, 'n': 1})

3 hashlib

Python的hashlib提供了常见的摘要算法(又称哈希算法、散列算法),如MD5,SHA1等等。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。因为摘要函数是一个单向函数,可以用于指出数据是否被篡改过。

>>> import hashlib
>>> md5 = hashlib.md5()    //md5哈希算法
>>> md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
>>> print(md5.hexdigest())      //生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示
d26a53750bc40b38b65a520292f69306
>>> md5.update('how to use md5 in '.encode('utf-8'))   //大块数据可以分块变换
>>> md5.update('python hashlib?'.encode('utf-8'))
>>> print(md5.hexdigest())
d26a53750bc40b38b65a520292f69306
>>> sha1 = hashlib.sha1()    //sha1哈希算法
>>> sha1.update('how to use sha1 in '.encode('utf-8'))
>>> sha1.update('python hashlib?'.encode('utf-8'))
>>> print(sha1.hexdigest())        //结果是160 bit字节,通常用一个40位的16进制字符串表示。
2c76b57293ce30acef38d98f6046927161b46a44 

4 itertools

itertools提供了非常有用的用于操作迭代对象的函数。

>>> import itertools
>>> natuals = itertools.count(1)    //count()会创建一个无限的迭代器,这里是从1开始
>>> for n in natuals:
...     print(n)
...
1
2
3
...
>>> ns = itertools.takewhile(lambda x: x <= 10, natuals)  //无限序列可以加takewhile等函数设置条件来截取一部分序列
>>> list(ns)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
>>> for c in cs:
...     print(c)
...
'A'
'B'
'C'
'A'
'B'
'C'
…
>>> ns = itertools.repeat('A', 3)    //repeat 负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数
>>> for n in ns:
...     print(n)
...
A
A
A
>>> for c in itertools.chain('ab', '12'):   //chain()可以把一组迭代对象串联起来,形成一个更大的迭代器
...     print(c)
...
a
b
1
2
>>> for key, group in itertools.groupby('aabbca'):  //groupby()把迭代器中相邻的重复元素挑出来放在一起
...     print(key, list(group))
...
a ['a', 'a']
b ['b', 'b']
c ['c']
a ['a']

5 urllib

urllib提供了一系列用于操作URL的功能。

urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应.

例如,对豆瓣的一个URLhttps://api.douban.com/v2/book/2129650进行抓取,并返回响应:

from urllib import request
with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8')) 

6 HTMLParser

利用HTMLParser,可以把网页中的文本、图像等解析出来。   

四 常用第三方模块

除了内建的模块外,Python还有大量的第三方模块。

基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip安装。

1 Pillow

PIL提供了操作图像的强大功能,可以通过简单的代码完成复杂的图像处理。

要详细了解PIL的强大功能,请请参考Pillow官方文档:

https://pillow.readthedocs.org/ 

$ pip install pillow
-bash: pip: command not found
C02Q13KUFVH6:python-test julzhe01$ pip3 install Pillow
Collecting Pillow
  Downloading Pillow-5.1.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (3.6MB)
    100% |████████████████████████████████| 3.6MB 378kB/s
Installing collected packages: Pillow
Successfully installed Pillow-5.1.0
You are using pip version 9.0.1, however version 9.0.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(/usr/local/lib/python3.6/site-packages/PIL/) 这个路径放了中文该模块对应的所有方法。

例: 

>>> from PIL import Image
>>> im = Image.open('1.png')
>>> w, h = im.size
>>> print('Original image size: %sx%s' % (w, h))
Original image size: 214x180
>>> im.thumbnail((w//2, h//2))      //缩放图像操作
>>> print('Resize image to: %sx%s' % (w//2, h//2))
Resize image to: 107x90
>>> im.save('thumbnail.png', 'png')

>>> from PIL import ImageFilter
>>> im = Image.open('1.png')
>>> im2 = im.filter(ImageFilter.BLUR)   //模糊效果,其他功能如切片、旋转、滤镜、输出文字、调色板等一应俱全
>>> im2.save('blur.png', 'png')

2 requests

用requests获取URL资源,比自带的urllib方便,而且有很多高级功能。

3 psutil

psutil使得Python程序获取系统信息变得易如反掌。

psutil还可以获取用户信息、Windows服务等很多有用的系统信息,具体请参考psutil的官网:https://github.com/giampaolo/psutil

 

附加章节:

1 virtualenv

virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。

每个应用可能需要各自拥有一套“独立”的Python运行环境。virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境。 

还可以顺便学习下vagrant以及docker。

 

2 图形界面

Python内置的Tkinter可以满足基本的GUI程序的要求,如果是非常复杂的GUI程序,建议用操作系统原生支持的语言和库来编写。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值