使用python模块

模块

类可以封装方法和属性

模块是最高级别的程序组织单元。

我们不但可以直接存放变量,还能存放函数,还能存放类。

定义变量需要用赋值语句,封装函数需要用def语句,封装类需要用class语句,但封装模块不需要任何语句。

之所以不用任何语句,是因为每一份单独的Python代码文件(后缀名是.py的文件)就是一个单独的模块。

如果你使用过vscode或pycharm等编程工具编写python程序,每次都需要先创建一个后缀名为.py的Python程序文件,才能运行程序:

封装模块的目的也是为了把程序代码和数据存放起来以便再次利用。如果封装成类和函数,主要还是便于自己调用,但封装了模块,我们不仅能自己使用,文件的方式也很容易共享给其他人使用。

所以,我们使用模块主要有两种方式,一种是自己建立模块并使用,另外一种是使用他人共享的模块。

使用自己的模块

建立模块,其实就是在主程序的py文件中,使用import语句导入其他py文件。

我们看一个小例子,这个例子中有两个模块,一个是test.py文件,另一个是main.py文件。

import test  # 导入test模块
print(test.a)
print(test.hi())
# 直接点击运行按钮即可,无需任何修改

import语句

我们使用import语句导入一个模块,最主要的目的并不是运行模块中的执行语句,而是为了利用模块中已经封装好的变量、函数、类。

现在我们要做的是把这段代码拆分成两个模块,把封装好的变量、函数、类,放到test.py文件中,把执行相关的语句放到main.py文件中。

a = '我是模块中的变量a'

def hi():
    a = '我是函数里的变量a'
    print('函数“hi”已经运行!')

class Go1:  # 如果没有继承的类,class语句中可以省略括号,但定义函数的def语句括号不能省
    a = '我是类1中的变量a'
    @classmethod
    def do1(cls):
        print('函数“do1”已经运行!')

class Go2:
    a = '我是类2中的变量a'
    def do2(self):
        print('函数“do2”已经运行!')

print(a)  # 打印变量“a”

hi()  # 调用函数“hi”

print(Go1.a)  # 打印类属性“a”
Go1.do1()  # 调用类方法“Go1”

A = Go2()  # 实例化“Go2”类
print(A.a)  # 打印实例属性“a”
A.do2()  # 调用实例方法“do2

main.py:

import test

print(test.a)

test.hi()

print(test.Go1.a)
test.Go1.do1()

A = test.Go2()
print(A.a)
A.do2()

当我们导入模块后,要使用模块中的变量、函数、类,需要在使用时加上模块.的格式。请阅读主程序main.py的代码注释:

# 这是主程序main.py
# 请阅读代码注释

import test  # 导入test模块

print(test.a)  # 使用“模块.变量”调用模块中的变量

test.hi()  # 使用“模块.函数()”调用模块中的函数

print(test.Go1.a)   # 使用“模块.类.变量”调用模块中的类属性
test.Go1.do1()  # 使用“模块.类.函数()”调用模块中的类方法

A = test.Go2()  # 使用“变量 = 模块.类()”实例化模块中的类
print(A.a)  # 实例化后,不再需要“模块.”
A.do2()  # 实例化后,不再需要“模块.”
 

# 【文件:story.py】

sentence = '从前有座山,'

def mountain():
    print('山里有座庙,')

class Temple:
    sentence = '庙里有个老和尚,'
    @classmethod
    def reading(cls):
        print('在讲故事,')

class Story:
    sentence = '一个长长的故事。'
    def reading(self):
        print('讲的什么故事呢?')


# 【文件:main.py】

import story

for i in range(10):
    print(story.sentence)
    story.mountain()
    print(story.Temple.sentence)
    story.Temple.reading()
    A = story.Story()
    print(A.sentence)
    A.reading()
    print()

import语句还有一种用法是import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”。

# 文件:main.py

import story as s

for i in range(10):
    print(s.sentence)
    s.mountain()
    print(s.Temple.sentence)
    s.Temple.reading()
    A = s.Story()
    print(A.sentence)
    A.reading()
    print()

另外,当我们需要同时导入多个模块时,可以用逗号隔开。比如import a,b,c可以同时导入“a.py,b.py,c.py”三个文件。

好,学完了import语句,我们接着学习from … import …语句。

from … import … 语句

from … import …语句可以让你从模块中导入一个指定的部分到当前模块。格式如下:

# 【文件:test.py】
def hi():
    print('函数“hi”已经运行!')

# 【文件:main.py】
from test import hi  # 从模块test中导入函数“hi”
hi()  # 使用函数“hi”时无需加上“模块.”前缀

当我们需要从模块中同时导入多个指定内容,也可以用逗号隔开,写成from xx模块 import a,b,c的形式。我们再运行一个小案例。

from test import a,hi,Go1,Go2

print(a)  # 打印变量“a”

hi()  # 调用函数“hi”

print(Go1.a)  # 打印类属性“a”
Go1.do1()  # 调用类方法“Go1”

对于from … import …语句要注意的是,没有被写在import后面的内容,将不会被导入。

from test import hi # 从模块test中导入函数“hi”

hi()

# 以下语句将会导致报错,因为并没有导入test模块,只是导入test模块中的函数“hi”
test.hey()

我们需要从模块中指定所有内容直接使用时,可以写成【from xx模块 import *】的形式,*代表“模块中所有的变量、函数、类”,我们再运行一个小案例。

from test import *

print(a)  # 打印变量“a”

hi()  # 调用函数“hi”

print(Go1.a)  # 打印类属性“a”
Go1.do1()  # 调用类方法“Go1”

不过,一般情况下,我们不要为了图方便直接使用【from xx模块 import *】的形式。
这是因为,模块.xx的调用形式能通过阅读代码一眼看出是在调用模块中的变量/函数/方法,而去掉模块.后代码就不是那么直观了。
到这里我们学完了from … import …语句,再来做一个练习吧。请看以下代码:

# 【文件:story.py】

sentence = '从前有座山,'

def mountain():
    print('山里有座庙,')

class Temple:
    sentence = '庙里有个老和尚,'
    @classmethod
    def reading(cls):
        print('在讲故事,')

class Story:
    sentence = '一个长长的故事。'
    def reading(self):
        print('讲的什么故事呢?')

# 【文件:main.py】

import story

for i in range(10):
    print(story.sentence)
    story.mountain()
    print(story.Temple.sentence)
    story.Temple.reading()
    A = story.Story()
    print(A.sentence)
    A.reading()
    print()

要直接使用Temple类的属性,我们需要在导入的时候指定Temple类(不能直接指定类属性)。老师的答案是这样的:

# 【文件:story.py】

sentence = '从前有座山,'

def mountain():
    print('山里有座庙,')

class Temple:
    sentence = '庙里有个老和尚,'
    @classmethod
    def reading(cls):
        print('在讲故事,')

class Story:
    sentence = '一个长长的故事。'
    def reading(self):
        print('讲的什么故事呢?')


# 【文件:main.py】

from story import Temple

print(Temple.sentence)

if __name__ == '__main__'语句

为了解释什么是if __name__ == '__main__',我先给大家讲解一个概念“程序的入口”。

对于Python和其他许多编程语言来说,程序都要有一个运行入口。

在Python中,当我们在运行某一个py文件,就能启动程序 ——— 这个py文件就是程序的运行入口。

更复杂的情况,我们也可以运行一个主模块,然后层层导入其他模块:

但是,当我们有了一大堆py文件组成一个程序的时候,为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码:

这里的if __name__ == '__main__'就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这是一种程序员达成共识的编码习惯。

第一种情况:加上这句话后,程序运行效果不会变化,我们来试试:

我们解释了“当xx.py文件被直接运行时,代码块②将被运行”,再解释一下“xx.py文件作为模块是被其他程序导入时,代码块②不被运行。”

第一段代码没有使用if __name__ == '__main__',所有语句都会被运行。

现在我们运行代码的时候,会发现if __name__ == '__main__'下的语句不会被执行。这是因为B.py文件并不是我们现在的程序运行入口,它是被A.py文件导入的。

关于这一个点目前你只需有个印象即可。接下来,我们来看看如何“使用他人的模块”。

使用他人的模块

如果是第三方编写的模块,我们需要先从Python的资源管理库下载安装相关的模块文件。

下载安装的方式是打开终端,Windows用户输入pip install + 模块名;苹果电脑输入:pip3 install + 模块名,点击enter即可。(需要预装python解释器和pip)

比如说,爬虫时我们会需要用到requests这个库(库是具有相关功能模块的集合),就需要在终端输入pip3 install requests(Mac用户)的指令。

我们用命令random.__file__找出了random模块的文件路径,就可以去打开查看它的代码:

像这样,通过阅读源代码我们能找到所有能够使用的变量、函数、类方法。

虽然你可以通过看源代码的方式来理解这个模块的功能。但如果你想要高效地学会使用一个模块,看源代码并不是最佳选项。我们接着谈谈“如何自学模块”。

如何自学模块

学习模块的核心是搞清楚模块的功能,也就是模块中的函数和类方法有什么作用,以及具体使用案例长什么样。

用自学“random”模块为例,如果英文好的同学,可以直接阅读官方文档:https://docs.python.org/3.6/library/random.html

或者也可以直接百度搜索:

搜到教程后,我们重点关注的是模块中的函数和类方法有什么作用,然后把使用案例做成笔记(还记得第8关谈到的如何做学习笔记么?)。

例如random模块的关键知识(也就是比较有用的函数和类方法),可以做成这样的笔记:

import random  # 调用random模块

a = random.random()  # 随机从0-1之间抽取一个小数
print(a)

a = random.randint(0,100)  # 随机从0-100之间抽取一个数字
print(a)

a = random.choice('abcdefg')  # 随机从字符串/列表/字典等对象中抽取一个元素(可能会重复)
print(a)

a = random.sample('abcdefg', 3) # 随机从字符串/列表/字典等对象中抽取多个不重复的元素
print(a)

items = [1, 2, 3, 4, 5, 6]  # “随机洗牌”,比如打乱列表
random.shuffle(items)
print(items)

另外,我们还可以使用dir()函数查看一个模块,看看它里面有什么变量、函数、类、类方法。

# 请直接运行并体验代码
import random  # 调用random模块
print(dir(random))

这就像是查户口一样,可以把模块中的函数(函数和类方法)一览无余地暴露出来。对于查到的结果“__xx__”结构的,它们是系统相关的函数,我们不用理会,直接看全英文的函数名即可。

这样查询的好处是便于我们继续搜索完成自学。比如我们在列表中看到一个单词“seed”,我们就可以搜一搜random.seed的用法:

里想提醒大家的是,比较小的模块(比如random模块)可以通过这样的方式自学,大型模块的学习就比较困难(除非你有充足的专业背景知识)。

例如数据分析需要用到pandas和NumPy模块,网页开发要用到Django模块等等,这些大型模块最好还是在课程上系统学习,避免散乱的学习形不成知识体系。

以目前大家的水平来说,有一些很实用,又不难学的模块,已经足够我们探索了。在今天的最后,我想手把手带大家自学一个模块

import csv

# dir()函数会得到一个列表,用for循环一行行打印列表比较直观
for i in dir(csv):
    print(i)

同时,我们可以搜索到csv模块的官方英文教程:

https://docs.python.org/3.6/library/csv.html

中文教程:https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv

如果你要通过阅读这份教程来学习csv模块的话,最简单的方式是先看案例(拉到教程的最后),遇到看不懂的函数,再倒回来查具体使用细节。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值