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模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
随机推荐
- 表现层的设计(二)——MVC如何处理复杂的界面元素
需求描述 一个比较复杂的页面,界面中包含的元素数据来自于许多个有关联或者无关联的表,然后我们要做的就是将数据呈现在界面上. 10年前大概都是这么干的 直接写一个复杂的SQL语句,返回一个包含所需数据的 ...
- Xcode7下模拟器输入文本无法显示系统键盘的解决办法
xcode7下的ios模拟器输入内容无法系统键盘,只能用电脑键盘输入内容,这样可能会对调试带来麻烦. 其实xcode7下的ios模拟器默认只能使用一种,要么是模拟器系统键盘,要么就是是电脑键盘.设置方 ...
- HDU 1754 I Hate It 线段树单点更新求最大值
题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> ...
- 创建Odoo8数据库时的“new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)“问题
Odoo8创建数据库时,显示如下错误信息: DataError: new encoding (UTF8) is incompatible with the encoding of the templa ...
- Python列表去除重复元素
主要尝试了3种列表去除重复元素 #2.去除列表中的重复元素 #set方法 def removeDuplicates_set(nums): l2 = list(set(l1)) #用l1的顺序排序l2 ...
- PowerDisner15 关于生成表带双""号问题
我们可以尝试在DBMS配置文件中修改相应的格式来解决. 在PowerDesigner中 选择 Database->Edit current database->Script->Sql ...
- JavaScript中的面向对象
//简单的面向对象 function 构造函数(){ this.属性; } //写在构造函数里面的属性一般为公共属性,或者通过传值进行改变. 构造函数.原型.方法 = function(){}; // ...
- Mittag-Leffler定理,Weierstrass因子分解定理和插值定理
Mittag-Leffler定理 设$D\subset\mathbb C$为区域,而$\{a_{n}\}$为$D$中互不相同且无极限点的点列,那么对于任意给定的一列自然数$\{k_{n}\}$, ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- angular1.x的简单介绍 (一)
angular1.x作为经典的mvc框架,可以创建能够复用的组件,也可进行双向数据绑定.国内的vue.js/avaloon.js都是同类型的框架.适合使用angularjs的项目有大型信息化管理系统: ...