|
先从sys.modules里查看模块是否已被导入,如果没有导入就依据sys.path路径寻找模块,找到模块后就导入,并创建这个模块的命名空间,把文件中的名字都存储在命名空间中。
有重命名的功效,重命名后只有重新命名的模块可用,之前的模块就不能使用了。
使用场景:
当应用操作类似时的两个模块时,如oracle和mysql,对数据库进行操作时,对这两个数据库的操作类似,如连接数据库、登录认证、增删改查、关闭数据库。
import oracle as db
import mysql as db
单独从模块中导入某些方法,from time import sleep
而from ... import *导入一个模块中的所有方法的做法不太安全。
所有模块导入都应该尽量写在程序的顶部
书写导入模块的顺序应尽量遵循内置模块、扩展模块、自定义模块
sys.modles使模块不会被重复导入
sys.path表明从哪里导入模块
import 模块名
模块名、变量名与本文件中的变量名完全不冲突
import 模块名 as 重命名的模块名
提高代码的兼容性
from 模块名 import 变量名
直接使用变量名就可以完成操作
如果本文件中有相同的变量名会发生冲突
from 模块名 import 变量名 as 重命名的变量名
from 模块名 import 变量名1,变量名2
from 模块名 import *
将模块中的所有变量名都放到内存中
如果本文件中有相同文件名就会发生冲突
from 模块名 import * 和__all__是一对
如果没有这个变量名就会导入所有的名字,如果有all只导入all列表中的名字
在不会使用米快时可以看模块的源码
一大推模块的集合,把解决一类问题的模块放在一个文件夹里——包
关于包的注意事项:
关于包的导入语句分为import和from...import..两种,但无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带一连串的点,如item.subitem.subsubitem,但是必须遵循这个原则。
导入后,在使用时就没有这种限制了,点的左边可以是包、模块、函数、类(它们都是用点的方式调用自己的属性)
from ... import ...需要注意的是from后import导入的模块,必须是明确的,不能带点,否则会有语法错误,如from a import b.c是错误的。模块导入相当于执行了.py文件,而导入一个包,默认执行包里面的__init__文件。对比import item和from item import name的应用场景:如果我们向直接使用name那比如使用后者。
__name__
在模块中有一个变量__name__,当我们直接执行这个模块的时候,__name__='__main__',当我们执行其他模块中引用的这个模块的时候,这个模块中的__name__='模块的名字'。
import demo __all__ = ['read', 'read2'] money = 100 def login(): print('正在执行登录程序') def read(): print('in read1', money) def read2(): print('in read2') if __name__ = '__main__': ret = login() print(ret)
作业要求:
作业要有完整的目录结构 bin 程序入口 start.py 开始文件\程序入口 if __name__=='__main__': core.main() # 在bin目录下放start.py,一执行就都跑起来了 core #核心代码 core.py shopping() pay() main() conf 配置文件,给运维人员看的,给操作这个代码的人看的 db 放数据,数据库 lib 放自己写的包\模块,不是python解释器中的模块 log 代码运行时的执行过程
什么是异常
1、语法错误:这种错误根本过不了python解释器的于法检测,必须在程序执行前就改正
2、逻辑错误:如1/0,name 未命名,2+‘3’,[][3]超出索引范围
try: ret = int(input('number>>>')) print(ret*'*') except ValueError: print('您输入的内容有误,请重新输入一个数字') except IndexError: print('超出列表的最大长度,请重新输入一个数字')
程序一旦发生错误,就从错误的位置停下来,不再执行后面的内容。
try: print(111) 1/0 print(222) name [][3] ret = int(input('number>>>')) print(ret*'*') except ValueError: print('您输入的数据类型有误,请重新输入一个数字') except Exception as error: #万能异常 print('你错了,老铁,error') else: print('---------') #没有异常的时候执行else代码 finally: print('+++++') # 不管代码是否异常,都会执行
使用try和except就能处理异常
try是我们需要处理的代码
except后面跟一个错误类型,当代码发生错误且错误类型符合的时候,就会执行except中的代码
except支持多分支
Exception能处理所有错误类型
有了万能的处理机制,仍然需要把预测到的问题单独处理
单独处理的所有内容都应写在万能异常之前
没有异常的时候执行else带啊
finally不管代码是否异常,都会执行
finally和return相遇的时候,依然会执行
函数里做异常处理用,不管是否异常去做一些首位工作,比如打开数据库后需要关闭。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-20 01:55
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社