模块2:函数和常用模块
不同目录间进行模块调用
作业需求:
模拟实现一个ATM+购物商城程序
1.额度 15000或自定义
2.实现购物商城,买东西加入 购物车,调用信用卡接口结账
3.可以提现,手续费5%
4.每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
5.支持多账户登录
6.支持账户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加账户、用户额度,冻结账户等。。。
11.用户认证用装饰器
Python模块详解及import本质
1.定义
- 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能)本质就是.py结尾的python文件(文件名:test.py,模块名:test)
- 包:用来从逻辑上组织模块的,本质就是一个目录(必须带有一个__init__.py文件
2.导入方法
- 导入一个方法:Import module_name
- 导入多个方法:Import module1_name,module2_name
- 导入模块里所有方法:from module_name import *
- 导入模块里多个方法:from module_name import m1,m2.m3
- 导入特定方法:from module_name import X as Y
3.import本质(路径搜索和搜索路径)
- import模块的本质:把python解释一遍,然后所有代码赋值给了module_name(这个变量)
1.import module_name #相当于所有代码赋值给了module_name(这个变量),使用module_name里面的方法或变量时,必须使用module_name.X进行调用
2.from module_name import X #相当于打开module_name这个文件只导入X这个变量,使用该X时直接调用即可
- import包的本质:执行该包下面的__init__.py文件
1.1import module_name ——>module_name.py——>module_name.py的路径——>sys.path
1.2获取当前文件路径:os.path.asbpath(__file__)是一个列表,获取当前文件目录os.path.dirname(os.path.asbpath(__file__)),获取上一层文件目录os.path.dirname(os.path.dirname(os.path.asbpath(__file__)))
1.3再将该文件目录追加到系统sys.path.append(XXX)获Insert(Y,XXX)
2.1导入包就是运行__init__.py文件,那么,我们将模块导入到包就可以在使用时通过包进行调用:在__init__.py文件里使用相对导入:from . Import module_name 模块
4.导入优化
import module_test def logger(): module_test.test() print("in the logger") def search(): module_test.test() print("in the search")
解析:在两个函数中,每次调用module_test.test都需要事先进行一个导入module_test后再进行方法test的查找,那么我们如何改变这种情况呢?
优化:
from module_name import test (as alias) def logger(): test() print("in the logger") def search(): test() print("in the search")
5.模块的分类
标准库:
6.shutil模块:
shutil.copyfileobj(fsrc,fdst) #将文件src内容复制到文件dst
import shutil f1=open("1.txt",encoding="utf-8") f2=open("2.txt",encoding="utf-8") shutil.copyfileobj(f1,f2) shutil.copyfile(src,dst) #拷贝文件,不用事先打开,后台打开 shutil.copyfile(1.txt,2.txt) shutil.copymode(src,dst) #拷贝权限,内容,组,用户均不变 shutil.copyfile(1.txt,2.txt) shutil.copystat(src,dst) #拷贝状态信息,包括:mode bits,atime,mtime,flags shutil.copyfile(1.txt,2.txt) shutil.copy(src,dst) #拷贝文件和权限 shutil.copyfile(1.txt,2.txt) shutil.copy(src,dst) #拷贝文件和权限 shutil.copyfile(1.txt,2.txt) shutil.copytree(src,dst) #递归的去拷贝文件 shutil.copyfile(f1,f2) shutil.copyrmtree(path) #递归的去删除文件 shutil.copyfile(f2) shutil.move(src,dst) #递归的去移动文件 shutil.copyfile(1.txt,2.txt) shutil.make_archive(base_name,format,path) #创建压缩包并返回文件路径 base_name: 压缩包的文件名,也可以是压缩包的路径。只是文件名时,则保存至当前目录,否则保存至指定路径, 如:www =>保存至当前路径 如:/Users/huwei/www =>保存至/Users/huwei/ format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar” root_dir:要压缩的文件夹路径(默认当前目录) owner: 用户,默认当前用户 group: 组,默认当前组 logger: 用于记录日志,通常是logging.Logger对象 shutil.copyfile("test","zip"."/Users/huwei")
注意:shutil对压缩包的处理是调用ZipFile和TarFile两个模块来进行的:
zipfile 压缩解压
import zipfile # 压缩 z = zipfile.ZipFile('laxi.zip', 'w') z.write('a.log') z.write('data.data') z.close() # 解压 z = zipfile.ZipFile('laxi.zip', 'r') z.extractall() z.close()
tarfile 压缩解压
import tarfile # 压缩 tar = tarfile.open('your.tar','w') tar.add('/Users/huwei/PycharmProjects/bbs2.zip', arcname='bbs2.zip') tar.add('/Users/huwei/PycharmProjects/cmdb.zip', arcname='cmdb.zip') tar.close() # 解压 tar = tarfile.open('your.tar','r') tar.extractall() # 可设置解压地址 tar.close()
8.shelve模块:
import datetime import shelve f1=shelve.open("shelve_test") info={"job":"it","age":29} name=["maria","dick","jacky","sophie"] f1["name"]=name #持久化列表 f1["info"]=info #持久化字典 f1["date"]=datetime.datetime.now() f1.close()
解析:执行后,不用dumps直接写入文件,如何读取:
import datetime import shelve f1=shelve.open("shelve_test") print(f1.get("name")) print(f1.get("info")) print(f1.get("date")) 执行结果: ['maria', 'dick', 'jacky', 'sophie'] {'job': 'it', 'age': 29} 2017-07-13 23:35:03.980317
configparser增删改查语法
作业:
开发一个简单的python计算器
实现加减乘除及拓号优先级解析
用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致