1、模块是最高级别的程序组织单元
(1)在模块中,我们不但可以直接存放变量,还能存放函数,还能存放类。
(2)每一个单独的py文件,本质上都是一个模块。
(3)模块主要有两种方式,一种是自己建立模块并使用,另外一种是使用他人共享的模块。
An example:
a = '我是模块中的变量a'
def hi():
a = '我是函数里的变量a'
print('函数“hi”已经运行!')
class Go2:
a = '我是类2中的变量a'
def do2(self):
print('函数“do2”已经运行!')
print(a) # 打印变量“a”
hi() # 调用函数“hi”
A = Go2() # 实例化“Go2”类
print(A.a) # 打印实例属性“a”
A.do2() # 调用实例方法“do2”
2、模块相关的常用语句
(1)import
import语句导入一个模块,最主要的目的并不是运行模块中的执行语句,而是为了利用模块中已经封装好的变量、函数、类。
test.py
a = '我是模块中的变量a'
def hi():
a = '我是函数里的变量a'
print('函数“hi”已经运行!')
class Go2:
a = '我是类2中的变量a'
def do2(self):
print('函数“do2”已经运行!')
main.py
# 这是主程序main.py
# 请阅读代码注释
import test # 导入test模块
print(test.a) # 使用“模块.变量”调用模块中的变量
test.hi() # 使用“模块.函数()”调用模块中的函数
A = test.Go2() # 使用“变量 = 模块.类()”实例化模块中的类
print(A.a) # 实例化后,不再需要“模块.”
A.do2() # 实例化后,不再需要“模块.”
import语句还有一种用法是import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”
当我们需要同时导入多个模块时,可以用逗号隔开。比如import a,b,c可以同时导入“a.py,b.py,c.py”三个文件。
(2)from...import...
from test import a,hi,Go2
print(a) # 打印变量“a”
hi() # 调用函数“hi”
A = Go2() # 实例化“Go2”类
print(A.a) # 打印实例属性“a”
A.do2() # 调用实例方法“do2”
不过,一般情况下,我们不要为了图方便直接使用【from xx模块 import 】的形式。
这是因为,模块.xx的调用形式能通过阅读代码一眼看出是在调用模块中的变量/函数/方法,而去掉模块.*后代码就不是那么直观了。
(3) if __name__ == '__main__'
程序的入口:对于Python和其他许多编程语言来说,程序都要有一个运行入口。
在Python中,当我们在运行某一个py文件,就能启动程序 ——— 这个py文件就是程序的运行入口。
简单情况:
复杂情况:
当我们有了一大堆py文件组成一个程序的时候,为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码:
当xx.py文件被直接运行时,代码块②将被运行
import story
if __name__ == '__main__':
print(story.sentence)
story.mountain()
A = story.Temple()
print(A.sentence)
A.reading()
print()
xx.py文件作为模块是被其他程序导入时,代码块②不被运行。
#module a
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”已经运行!')
if __name__ == '__main__':
print('是主模块的时候才会执行以下语句:')
print(a)
hi()
b = Go2()
print(Go2.a)
b.do2()
#module B
import A
#结果为无
(4)使用他人模块
import time
print('第一句话,过两秒出现第二句。')
time.sleep(2)
print('第二句话。')
import random
a = random.randint(0,100) # 随机从0-100之间抽取一个数字
print(a)
3、自学模块
学习模块的核心是搞清楚模块的功能,也就是模块中的函数和类方法有什么作用,以及具体使用案例长什么样。
官方文档:https://docs.python.org/3.6/library/random.html](https://docs.python.org/3.6/library/random.html
CSV 模块的学习
import语句导入csv模块,然后用dir()函数看看它里面有什么东西:
import csv
for i in dir(csv):
print(i)
import csv
with open('test.csv', newline = '', encoding = 'utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
print('程序结束')
#参数encoding = 'utf-8'防止出现乱码
#newline是为了解决写入时新增行与行之间的一个空白行问题。
import csv #导入模块
with open("test.csv", "a", newline="", encoding = "utf-8") as f:
writer = csv.writer(f)
writer.writerow([1,2,3,4,5]) #注意是writerow而不是writerrow
writer.writerow([6,7,8,9,10])