Python学习笔记五

系统模块 sys

系统模块全都是运行时系统相关的信息

import sys

sys.path						# 模块搜索路径 path[0] 是当前脚本程序的路径
sys.modules						# 已加载模块的字典
sys.version						# 版本信息
sys.version_info				# 版本信息的命名元组
sys.platform					# 操作系统平台名称信息
sys.argv						# sys.argv绑定用户启动程序时命令行参数的列表
sys.copyright					# 获取python版权相关的信息
sys.builtin_module_names		# 获取python内建模块的名称(字符串元组)
sys.stdin						# 标准输入文件对象,多用于input()
sys.stdout						# 标准输出文件对象,多用于print()
sys.stderr						# 标准错误输出文件对象,多用于输出错误信息

# sys的方法
sys.exit([arg])					# 退出程序,正常退出是sys.exit(0)

sys.getrecursionlimit()			# 得到递归嵌套层次限制(栈的深度)
sys.setrecursionlimit(n)		# 得到和修改递归嵌套层次限制(栈的深度)

自定义模块

# 此模块是用户自定义模块
# mymod1.py 文件

def myfun1():
	print("正在调用mymod1里的 myfun1()")

def myfun2():
	print("正在调用mymod2里的 myfun2()")

name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# 导入mymod1并调用相应的数据和函数
# test_mymod1.py文件

import mymod1		# 导入模块
from mymod1 import name2

mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)

自定义模块的模块名必须符合标识符的命名规则(同变量名)
模块有各自独立的作用域

# mymod1.py 文件

def myfun1():
	print("正在调用mymod1里的 myfun1()")

def myfun2():
	print("正在调用mymod2里的 myfun2()")

name1 = 'xiaomaomao'
name2 = "xiaoxiaomao"
# mymod2.py 文件

def myfun1():
	print("mymod2.myfun1()")

name1 = "shishi"

# 导入mymod1, mymod2并调用相应的数据和函数
# 各模块内的变量不会冲突
import mymod1		# 导入模块
from mymod1 import name2
import mymod2		

mymod1.myfun1()
mymod1.myfun2()
print(mymod1.name1)
print(name2)

mymod2.myfun1()
print(mymod2.name1)

模块化编程的优点:
(1) 有利于多人合作开发
(2) 使代码更易于维护
(3) 提高代码的复用率
(4) 有利于解决变量名冲突问题

模块的加载与导入

import 语句搜索模块的路径顺序
(1) 搜索程序运行时的路径(当前路径)
(2) sys.path 提供的路径
(3) 搜索内置模块
sys.path 是一个存储模块搜索路径的列表
(1) 可以把自定义的模块放在相应的路径下可以导入
(2) 可以把自己模块的路径添加在sys.path列表中

# 模块加载方法(2)

import sys
sys.path.append("模块路径")

import 模块
模块的加载过程

(1) 在模块导入时,模块的所有语句会执行
(2) 如果一个模块以及导入,则再次导入时不会重新执行模块内的语句
模块的重新加载:

import mymod3
import imp
imp.reload(mymod3)		# 重新加载mymod3模块

mymod3.myfun4()
模块被导入和执行的过程

(1) 先搜索相关的路径找模块(.py)
(2) 判断是否有此模块对应的.pyc文件,如果存在.pyc文件且.py文件新,则直接加载.pyc文件
(3) 否则用.py文件生成.pyc后再进行加载
pyc 模块的编译文件:
编译 解释执行
mymod1.py --------> mymod1.pyc --------> python3

模块的属性

属性的实质是变量(是模块内的全局变量)
模块内预置得到属性:
doc 属性:用来绑定模块的文档字符串

'''这是模块的文档字符串的标题

这是文档字符串的内容
此模块包含两个函数和两个变量'''


def f1():
	'''这是函数的文档字符串'''
	pass
print(__doc__)
print(f1.__doc__)

# 在控制台中输入help(mymod.py)就可以查看模块以及函数的文档字符串

在这里插入图片描述
file 属性:file 绑定模块对应的文档路径名
(1) 对于内建模块,不绑定路径(没有__file__属性)
(2) 对于其他模块,绑定路径的字符串
在这里插入图片描述
name 属性:用来记录模块的自身名字
作用:
(1) 记录模块名
(2) 用来判断是否为主模块(最先运行的模块)
说明:当此模块为主模块时,name 绑定 ‘main’; 当次模块不是主模块时,此属性绑定模块名。

模块的__all__列表

模块中的__all__列表是一个用来存放可导出属性的字符串列表
作用:当用from import * 语句导入时,只导入__all__列表内的属性
示例:

'''
此模块示意__all__列表的作用和用法
'''

# 限制用from mymod6 import * 时只导入f1, var1
__all__ = ['f1', 'var1']

def f1():
	pass

def f2():
	pass

def f3():
	pass

var1 = "hello"
var2 = "world"

模块的隐藏属性

模块中以’_'开头的属性,在from import * 语句导入时,将不被导入,通常称这些属性为隐藏属性。
示例:

'''
此模块示意模块内的隐藏属性
'''

def f1():
	pass

def _f2():
	'''
	此函数在被其他模块用from import * 导入时将不会被导入
	'''
	pass

var = "变量1"
_var2 = "变量2"	# _var2也是隐藏变量,也不会被导入

随机模块 random

作用:用于模拟或生成随机输出的模块

# 随机模块

import random as R

R.random()									# 返回一个[0, 1)之间的随机实数
R.uniform(a, b)								# 返回[a, b)区间内的随机实数
R.randrange([start,] stop[,step])			# 返回range(start, stop, step)中的随机数
R.choice(seq)								# 从序列中返回随意元素
R.shuffle(seq[, random])					# 随机指定序列的顺序(乱序序列)
R.sample(seq, n)							# 从序列中选择n个随机且不重复的元素
R.getrandbits(nbit)							# 以长整型的形式返回用nbit位来表示的
R.seed(a=None)								# 用给定的数a设置随机种子

包 package

包是将模块以文件夹的形式进行分组管理的方法
作用:将一系列模块进行分类管理,有利于防止命名冲突,可以在需要时加载一个或部分模块而不是全部模块
示例:

__init__.py
menu.py
games/
	__init__.py
	contra.py
	supermario.py
	tanks.py
office/
	__init__.py
	excel.py
	word.py

init.py文件:(1) 常规包中必须存在的文件 (2) init.py会在包加载时被自动调用
作用:编写此包的内容;在内部填写文档字符串;在__init__.py内可以加载此包所依赖的一些其他模块
包的导入:
用三条import语句可以导入包(同模块的导入规则)
import 包名 [as 包别名]
import 包名.模块名 [as 模块新名]
import 包名.子包名.模块名

from 包名 import 模块名 [as 模块新名]
from 包名.子包名 import 模块名 [as 模块新名]
from 包名.子包名.模块名 import 属性名 [as 属性新名]

from 包名 import *
from 包名.模块名 import *

包的相对导入

包的相对导入是指包内模块的相互导入
语法:from 相对路径包或模块 import 属性或模块名
或 from 相对路径包或模块 import *
相对路径:
. 代表当前目录
… 代表上一级目录
… 代表上两级目录
以此类推
注:相对导入时不能超出包的外部
示例:

# mypack/games/contra.py


def play():
	print("正在玩contra")

print("contra模块被加载")

def gameover():
	# 用绝对路径导入
	# from mypack.menu import show_menu

	# 用相对路径导入
	from ..menu import show_menu
	show_menu()
包的加载路径

与模块的加载路径相同
(1) 当前文件夹
(2) sys.path给出的路径

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章