Python模块之day4
模块,代码归类实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;file是文件操作相关的模块
模块分为三种:
- 自定义模块
- 第三方模块
- 内置模块
自定义模块
1.定义模块
2.导入模块
导入模块默认寻找的路径
import sys
#print sys.path
for i in sys.path:
print(i) C:\Users\Administrator\PycharmProjects\dbb0928\1106 #pycharm 自动添加的路径
C:\Users\Administrator\PycharmProjects\dbb0928 #IDIL,或者Linux里没有,最好忽略
C:\python\python35.zip
C:\python\DLLs
C:\python\lib
C:\python
C:\python\lib\site-packages
上面的路径,即是调用模块的顺序,一旦找到调用的函数,则停止寻找 ****模块名称命名很重要****
自定义的模块名字不要跟系统的模块命名相同,不然会首先调用你自己的函数,忽略系统函数
如果sys.path路径列表没有你想要的路径,那么怎么添加默认路径
- 通过 sys.path.append('路径') 添加。
import sys
import os pre_path = os.path.abspath('../')
sys.path.append(pre_path)
2. 设置环境变量PYTHONPATH
该环境变量的内容会被自动添加到模块搜索路径中。设置方式与设置Path环境变量类似。注意只需要添加你自己的搜索路径,Python自己本身的搜索路径不受影响。
导入模块的方式
#推荐导入方法
1.单模块,在同一目录下
import module #导入可以调用该模块的所有函数,使用方法module.xxx() 2.嵌套在文件夹下
from module.xx.xx import xx #导入模块里的某个函数
from module.xx.xx import xx as rename # 当模块名字相同是,可以重命名
from module.xx.xx import * #导入模块下的所有函数,不建议使用,容易重名
开源模块
1.下载安装
下载安装有两种方式:
#方式一
yum
pip
apt-get
... #方式二 下载源码
解压源码
进入目录
编译源码 python setup.py build
安装源码 python setup.py install #注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行:
yum install gcc
yum install python-devel
或
apt-get python-dev
安装成功后,模块会自动安装到 sys.path 中的某个目录中,如:
/usr/lib/python3.5/site-packages/
python 序列化
把变量从内存中变成可存储或传输的过程称之为序列化,在程序运行的过程中,所有的变量都是在内存中,那么我们修改某个字典的values后,如果程序退出,则下次再运行程序,values,则会被初始化原来的值。
如果序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
Python用于序列化的两个模块:
1. pickle
pickle,用于python特有的类型 和 python的数据类型间进行转换,支持Python所有的数据类型,一般用于比较复杂的序列化,如游戏数据存档。
- dump,dumps
#pickle.dumps()方法把任意对象序列化成一个bytes,然后,就可以把这个bytes写入文件
>>> import pickle
>>> d = {'name':'bob','age':14,'score':88}
>>> pickle.dumps(d)
b'\x80\x03}q\x00(X\x05\x00\x00\x00scoreq\x01KXX\x03\x00\x00\x00ageq\x02K\x0eX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00bobq\x04u.' #另一个方法pickle.dump()直接把对象序列化后写入一个file-like Object:
>>> f = open('dump.txt','wb')
>>> pickle.dump(d,f)
>>> f.close()
- load,loads
#字符串反序列化,文件里可以先把内容读到一个bytes,然后用pickle.loads()方法反序列化出对象 >>> print(d)
{'score': 88, 'age': 14, 'name': 'bob'}
>>> nb = pickle.dumps(d)
>>> print (nb)
b'\x80\x03}q\x00(X\x05\x00\x00\x00scoreq\x01KXX\x03\x00\x00\x00ageq\x02K\x0eX\x04\x00\x00\x00nameq\x03X\x03\x00\x00\x00bobq\x04u.'
>>> pickle.loads(nb)
{'name': 'bob', 'age': 14, 'score': 88} #也可以直接用pickle.load()方法从一个file-like Object中直接反序列化出对象 >>> d = pickle.load(f)
>>> f.close()
>>> d
{'name': 'bob', 'age': 14, 'score': 88}
2.json
json,用于字符串 和 python数据类型间进行转换,仅支持python的基本数据类型,但可以在语言之间传递对象,能直接在Web页面中读取,非常方便。
- dump,dumps,load,loads
#把Python对象变成一个JSON:
>>> import json
>>> d = dict(name='Bob', age=20, score=88)
>>> json.dumps(d) # dumps()方法返回一个str
'{"age": 20, "score": 88, "name": "Bob"}' #使用dump写入文件
>>>with open('dump.txt','w') as f:
json.dump(d,f) #JSON反序列化为Python对象: >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}' #注意字典里一定要双引号
>>> json.loads(json_str)
{'age': 20, 'score': 88, 'name': 'Bob'} #使用load 读出文件
>>> with open ('load.txt','r') as f:
ret= json.load(f)
print('ret')
- 进阶用法
#有时候,我们更喜欢用class表示对象,比如定义Student类,然后序列化:
import json class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score s = Student('Bob', 20, 88)
print(json.dumps(s)) #错误输出
Traceback (most recent call last):
...
TypeError: <__main__.Student object at 0x10603cc50> is not JSON serializable
错误的原因是Student对象不是一个可序列化为JSON的对象 #然而可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可: def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
} #这样,Student实例首先被student2dict()函数转换成dict,然后再被顺利序列化为JSON: >>> print(json.dumps(s, default=student2dict))
{"age": 20, "name": "Bob", "score": 88} #不过,下次如果遇到一个Teacher类的实例,照样无法序列化为JSON。我们可以偷个懒,把任意class的实例变为dict: print(json.dumps(s, default=lambda obj: obj.__dict__)) ##同样的道理,如果我们要把JSON反序列化为一个Student对象实例,loads()方法首先转换出一个dict对象,然后,我们传入的object_hook函数负责把dict转换为Student实例: def dict2student(d):
return Student(d['name'], d['age'], d['score']) 运行结果如下: >>> json_str = '{"age": 20, "score": 88, "name": "Bob"}'
>>> print(json.loads(json_str, object_hook=dict2student))
<__main__.Student object at 0x10cd3c190>
Python模块之day4的更多相关文章
- Python之旅Day4 闭包函数 模块及模块倒入
闭包函数 闭包函数就是在内部函数当中有对外部函数名字的引用 ###代码示例1### def f1(): x =1 def f2(): print(x) return f2 f=f1() f() ### ...
- Python之路,Day4 - Python基础4 (new版)
Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 ...
- 使用C/C++写Python模块
最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...
- Python模块之configpraser
Python模块之configpraser 一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...
- Python模块之"prettytable"
Python模块之"prettytable" 摘要: Python通过prettytable模块可以将输出内容如表格方式整齐的输出.(对于用Python操作数据库会经常用到) 1. ...
- python 学习第五天,python模块
一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...
- windows下安装python模块
如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar. ...
- 安装第三方Python模块,增加InfoPi的健壮性
这3个第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 目录 1.cchardet 自动检测文本编码 2.lxml 用于解析 ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
随机推荐
- (原创)ssm sql 例子(freemarker+jsp)
ssm整合地址:http://www.cnblogs.com/xiaohuihui96/p/6104351.html 接下讲解一个插入语句的流程和顺带讲解freemarker+jsp视图的整合 初次接 ...
- [转]C/C++ 程序员必须收藏的资源大全
from: https://github.com/jobbole/awesome-cpp-cn C++ 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome – XXX 系列 ...
- php五种常见的设计模式(转载)
很多人都想着写博客来记录编程生活中的点滴,我也不例外,但想了好长时间不知道写什么........万事开头难,先转载一篇吧..... 设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Ga ...
- mac版本cornerstone的无限期破解方法【转】
CornerStone是个人非常喜欢的mac上的一款SVN客户端工具,官方提供了14天的免费试用(trail)版本.我们可以在此基础上提供无限期试用版本. 方法一:如果你从来没有安装过这个trail版 ...
- C++ 关键字浅谈
这里有一个游戏:要求写一个符合C++标准的程序,包含至少十个连续而且不同的关键字.连续是指不能被标识符.运算符.标点符号分割.注意这里的“不同”要求,别想用 int main() { return s ...
- PL/SQL连接Oracle数据库,中文乱码,显示问号
问题描述: 登陆PL/SQL,执行SQL语句后,输出的中文标题显示成问号????:条件包含中文,则无数据. 如果不是中文,需要修改注册表值,方法如下: 进入注册表:Win+r,输入re ...
- 【leetcode】Minimum Depth of Binary Tree
题目简述: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along th ...
- C#创建文件夹,往里追字符串。
/// <summary>写文本日志</summary> /// <param name="StrMessage">日志消息</param ...
- Ubuntu菜鸟入门(六)—— 有道词典安装
一.在有道辞掉官网上下载安装包: youdao-dict_1.1.0-0-ubuntu_amd64.deb 二.安装 1.打开下载目录,进行安装 sudo dpkg -i youdao-dict_1. ...
- form表单提交问题
1.提交后不能跳转到指定页面 jsp代码 <form class="form-horizontal" role="form"> <p clas ...