Python学习进程(12)模块

    模块让你能够有逻辑地组织你的Python代码段。

    (1)python模块:

模块化的好处:

1.把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
2.模块也是Python对象,具有随机的名字属性用来绑定或引用。
3.简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。

模块化的实例:

[email protected]:/home/sunjimeng/桌面# cat first.py
def ten():
  for index in range(10):
    print index
  return
[email protected]:/home/sunjimeng/桌面# cat second.py
import first 

ten()              #这种写法引用不到first.py的ten()函数
[email protected]:/home/sunjimeng/桌面# vi second.py
[email protected]:/home/sunjimeng/桌面# cat second.py
import first 

first.ten()        #这种写法才能引用到
[email protected]:/home/sunjimeng/桌面# python second.py
0
1
2
3
4
5
6
7
8
9

无论使用了多少个import语句,包只被引入一次。

    (2)import与from ... import ... 语句:

实例:(演示两种语句的区别)

[email protected]:/home/sunjimeng/桌面# cat first.py
def ten():
  for index in range(10):
    print index
  return
[email protected]:/home/sunjimeng/桌面# cat second.py
import first                       #这种方法引入的相当于把模块引入。(a)
from first import ten              #这种方法相当于把函数引入(b)

ten()    #(a)
first.ten()    #(b)
[email protected]:/home/sunjimeng/桌面# python second.py
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

还有一个简单的方法来引入一个模块中的所有项目:

from modename import *

    (3)定位模块:

Python会在以下路径中搜索它想要寻找的模块:

1.程序所在的文件夹;(当前目录)
2.标准库的安装路径;
3.操作系统环境变量PYTHONPATH所包含的路径;(shell变量 PYTHONPATH 下的每个目录)

PYTHONPATH变量:

1.Windows系统:
set PYTHONPATH=c:\python20\lib;
2.UNIX系统:
set PYTHONPATH=/usr/local/lib/python

    (4)包:(python导入自定义包的机制:http://www.verydemo.com/demo_c89_i33039.html)

包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的Python的应用环境。

1)包可以帮助我们解决以下问题:

1.为平坦的名称空间加入有层次的组织结构
2.允许程序员把有联系的模块组合到一起
3.允许分发者使用目录结构而不是一大堆混乱的文件
4.帮助解决有冲突的模块名称

2)模块包:(可以将功能相似的模块放在同一个文件夹中,构成一个模块包。)

import test_dir.module        #引入在目录test_dir下的所有模块

注意:该文件夹中必须包含一个__init__.py的文件,提醒Python,该文件夹为一个模块包。__init__.py可以是一个空文件。

3)创建Python包的实例:

#1.创建目录结构:
  person
    __init__.py    #这里注意init的前是两个‘_‘
    dog.py
    eater.py
    drinker.py
#其中person是目录:各个文件的内容如下:
__init__.py:
from eater import eat
from drinker import drink
from dog import wow
dog.py:
def wow():
  print ‘Dog is WW‘
eater.py
def eat():
  print ‘Eater is eating‘
dog.py:
def wow():
  print ‘Dog is WW‘
#2.在包所在的本地目录下创建文件text.py
import person
person.eater.eat()
person.dog.wow()
person.drinker.drink()
#__init__.py作用的地方
person.eat()
person.drink()
person.wow()
#3.text.py的执行结果:# 包作用的地方
Eater is eating
Dog is WW
Drinker is drinking# __init__文件作用的地方
Eater is eating
Drinker is drinking
Dog is WW 

4)遇到的问题:

1.包的标志文件是__init__.py而不是_init_.py文件。(注意‘_‘的长度);

2.在Python的.py中添加带有中文的注释要加上一句 "# -*- coding: utf-8 -*-".

3.如果不在系统中添加搜索路径,使用自定义python包时要将执行文件与包文件放在同一目录。

4.实现在系统任意目录下引用自定义python包:

临时方法:(每次关闭Python进程后,修改自动无效)

_1.将自定义包所在路径加入sys.path:

>>> import sys
>>> sys.path
[‘‘, ‘/usr/lib/python2.7‘, ‘/usr/lib/python2.7/plat-x86_64-linux-gnu‘, ‘/usr/lib/python2.7/lib-tk‘, ‘/usr/lib/python2.7/lib-old‘, ‘/usr/lib/python2.7/lib-dynload‘, ‘/usr/local/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages/PILcompat‘, ‘/usr/lib/python2.7/dist-packages/gtk-2.0‘, ‘/usr/lib/python2.7/dist-packages/ubuntu-sso-client‘]
>>> sys.path.append(‘/home/sunjimeng/桌面‘)
>>> sys.path
[‘‘, ‘/usr/lib/python2.7‘, ‘/usr/lib/python2.7/plat-x86_64-linux-gnu‘, ‘/usr/lib/python2.7/lib-tk‘, ‘/usr/lib/python2.7/lib-old‘, ‘/usr/lib/python2.7/lib-dynload‘, ‘/usr/local/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages/PILcompat‘, ‘/usr/lib/python2.7/dist-packages/gtk-2.0‘, ‘/usr/lib/python2.7/dist-packages/ubuntu-sso-client‘, ‘/home/sunjimeng/\xe6\xa1\x8c\xe9\x9d\xa2‘]

永久方法:(修改配置文件)

_2.将文件拷贝到site-package文件夹下:

[email protected]:/# find / -name ‘*site-package*‘
/home/sunjimeng/.local/share/Trash/files/Python-3.5.2/Lib/site-packages
/usr/local/lib/python3.5/site-packages
/usr/local/lib/python2.7/site-packages
[email protected]:/# cd /usr/local/lib/python2.7/site-packages
[email protected]:/usr/local/lib/python2.7/site-packages# cp -r /home/sunjimeng/桌面/person .

_3.在dist-packages文件夹下新建*.pth(不是.path文件)路径文件。将路径名添加到.path文件中:

首先python下有两个自定义包配置文件:

[email protected]:/usr/local/lib/python2.7# ll
总用量 16
drwxrwsr-x 4 root staff 4096  7月 23  2014 ./
drwxr-xr-x 6 root root  4096  7月 17 12:04 ../
drwxrwsr-x 2 root staff 4096  7月 23  2014 dist-packages/
drwxrwsr-x 3 root staff 4096  7月 24 11:46 site-packages/

这种方法相当于永久修改sys.path:

[email protected]:/usr/local/lib/python2.7/dist-packages# cat person.pth
/home/sunjimeng/桌面
[email protected]:/usr/local/lib/python2.7/dist-packages# python
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
[‘‘, ‘/usr/lib/python2.7‘, ‘/usr/lib/python2.7/plat-x86_64-linux-gnu‘, ‘/usr/lib/python2.7/lib-tk‘, ‘/usr/lib/python2.7/lib-old‘, ‘/usr/lib/python2.7/lib-dynload‘, ‘/usr/local/lib/python2.7/dist-packages‘, ‘/home/sunjimeng/\xe6\xa1\x8c\xe9\x9d\xa2‘, ‘/usr/lib/python2.7/dist-packages‘, ‘/usr/lib/python2.7/dist-packages/PILcompat‘, ‘/usr/lib/python2.7/dist-packages/gtk-2.0‘, ‘/usr/lib/python2.7/dist-packages/ubuntu-sso-client‘]
>>> import person
>>> person.eat()
Eater is eating

    (5)其他与模块有关知识:

1)命名空间和作用域:

变量是拥有匹配对象的名字(标识符);命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典.

一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

因此,如果要给全局变量在一个函数里赋值,必须使用global语句:

# -*- coding= utf-8 -*-
myname=‘MenAngel‘
def modifyName():
  myname=‘sunjimeng‘
  # global myname
  print "函数里的姓名为:",myname
print "全局里的姓名为:",myname
modifyName()
print "全局里的姓名为:",myname

代码的结果:

1.没去掉注释:
全局里的姓名为: MenAngel
函数里的姓名为: sunjimeng
全局里的姓名为: MenAngel
2.去掉注释:
全局里的姓名为: MenAngel
函数里的姓名为: sunjimeng
全局里的姓名为: sunjimeng

2)dir()函数:

dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字:

>>> import math
>>> list=dir(math)
>>> print list
[‘__doc__‘, ‘__name__‘, ‘__package__‘, ‘acos‘, ‘acosh‘, ‘asin‘, ‘asinh‘, ‘atan‘, ‘atan2‘, ‘atanh‘, ‘ceil‘, ‘copysign‘, ‘cos‘, ‘cosh‘, ‘degrees‘, ‘e‘, ‘erf‘, ‘erfc‘, ‘exp‘, ‘expm1‘, ‘fabs‘, ‘factorial‘, ‘floor‘, ‘fmod‘, ‘frexp‘, ‘fsum‘, ‘gamma‘, ‘hypot‘, ‘isinf‘, ‘isnan‘, ‘ldexp‘, ‘lgamma‘, ‘log‘, ‘log10‘, ‘log1p‘, ‘modf‘, ‘pi‘, ‘pow‘, ‘radians‘, ‘sin‘, ‘sinh‘, ‘sqrt‘, ‘tan‘, ‘tanh‘, ‘trunc‘]
>>> import text
>>> list=dir(text)
>>> print list
[‘__builtins__‘, ‘__doc__‘, ‘__file__‘, ‘__name__‘, ‘__package__‘, ‘modifyName‘, ‘myname‘]

3)globals()和locals()函数:

根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。

如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。

两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。

# -*- coding= utf-8 -*-
# 全局变量
myname=‘MenAngel‘
def localArea():
  yourname=‘sunjimeng‘
  print "局部函数",locals()
  print "全局函数",globals()
print "调用函数"
localArea()
print "局部函数",locals()
print "全局函数",globals()
调用函数
局部函数 {‘yourname‘: ‘sunjimeng‘}
全局函数 {‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__file__‘: ‘text.py‘, ‘myname‘: ‘MenAngel‘, ‘__package__‘: None, ‘localArea‘: <function modifyName at 0x7f5979061578>, ‘__name__‘: ‘__main__‘, ‘__doc__‘: None}
局部函数 {‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__file__‘: ‘text.py‘, ‘myname‘: ‘MenAngel‘, ‘__package__‘: None, ‘localArea‘: <function localArea at 0x7f5979061578>, ‘__name__‘: ‘__main__‘, ‘__doc__‘: None}
全局函数 {‘__builtins__‘: <module ‘__builtin__‘ (built-in)>, ‘__file__‘: ‘text.py‘, ‘myname‘: ‘MenAngel‘, ‘__package__‘: None, ‘modifyName‘: <function localArea at 0x7f5979061578>, ‘__name__‘: ‘__main__‘, ‘__doc__‘: None}

4)reload()函数:

当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。因此,如果你想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块。语法如下:

reload(module_name)

在这里,module_name要直接放模块的名字,而不是一个字符串形式。比如想重载hello模块,如下:

reload(hello)
时间: 2024-10-07 14:42:18

Python学习进程(12)模块的相关文章

python 学习笔记 12 -- 写一个脚本获取城市天气信息

最近在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么能够显示后最重要的就是显示什么的问题了.最容易想到的就是显示时间啊,CPU利用率啊,IP地址之类的.那么我觉得呢,如果能够显示当前时间.温度也是甚好的,作为一个桌面小时钟还是很精致的. 1. 目前有哪些工具 目前比较好用的应该是 weather-util, 之前我获取天气信息一般都是通过它. 使用起来也很简单: (1) Debian/Ubuntu 用户使用 sudo apt-get install weather-util 安装

Python学习之cookielib模块

cookielib是一个用于处理客户端HTTP cookie的模块 https://docs.python.org/2/library/cookielib.html?highlight=cookielib#cookielib In [191]: import cookielib,urllib2 In [192]: cj=cookielib.CookieJar() In [193]: openner=urllib2.build_opener(urllib2.HTTPCookieProcessor(

python学习笔记12 ----线程、进程

进程和线程的概念 进程和线程是操作系统中两个很重要的概念,对于一般的程序,可能有若干个进程,每一个进程有若干个同时执行的线程.进程是资源管理的最小单位,线程是程序执行的最小单位(线程可共享同一进程里的所有资源,进程之间则是独立的). 进程(progress) 直观的说,进程就是正在执行的程序(python中每一个.py文件都可以看作是一个进程),是多任务操作系统中的基本单元,是包含了程序指令和相关资源的集合. 操作系统隔绝了每个进程可以访问的地址空间,如果进程间想要传递信息,可使用进程间通信或者

Python学习总结12:sys模块

sys模块常用来处理Python运行时配置以及资源,从而可以与前当程序之外的系统环境交互. 1. 导入及函数查看 >>> import sys #导入sys模块 >>> dir(sys) #dir()方法查看模块中可用的方法 注意:如果是在编辑器,一定要注意要事先声明代码的编码方式,否则中文会乱码. 2. 重要函数变量 sys.argv 命令行参数List,第一个元素是程序本身路径     sys.modules.keys() 返回所有已经导入的模块列表     sys

python学习之random模块

Python中的random模块用于生成随机数.下面介绍一下random模块中最常用的几个函数. random.random random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0 random.uniform random.uniform的函数原型为:random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限.如果a > b,则生成的随机数n: a <= n <= b.如果 a <

Python之进程 - multiprocessing模块

? 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快.以我们之前所学的知识,并不能实现创建进程这个功能,所以我们就需要借助python中强大的模块. ? 仔细说来,multiprocess不是一个模块而是python中一个操作.管理进程的包. 之所以叫multi是取自multipl

Python学习笔记-常用模块

1.python模块 如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失.因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作为输入执行.这就是传说中的 脚本.随着你的程序变得越来越长,你可能想要将它分割成几个更易于维护的文件.你也可能想在不同的程序中使用顺手的函数,而不是把代码在它们之间中拷来拷去. 为了满足这些需要,Python 提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用.这样的文件被称

Python学习:9.模块的安装以及调用模块

什么是模块 在Python中,模块其实也就是包含python代码的文件,我们为什么要使用模块?在我们以后写代码的时候,我们会发现有很多功能需要经常使用,那我们想要使用这些功能怎么办,要再把那些代码在敲一遍吗,这样不但增加了代码量,还浪费了时间,有人说我们可以写在函数里,是的,我们可以把一些功能写在函数里,使用的时候调用函数就行了,但是我们每次新建一个文件的时候,都需要再次将那些功能函数写一遍,还是有些麻烦,这时候,模块的便捷就体现出来了,我们将大量功能函数写在一个py文件里,当我们需要用到部分功

Python学习进程(10)字典

    本节介绍Python中的字典:是另一种可变容器模型,且可存储任意类型对象.     (1)字典简介: 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d = {key1 : value1, key2 : value2 } 注意:键必须是唯一的,但值则不必.值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组.     (2)字典的操作: 包括创建字典.访问字典元素.修改字典的值.删除字典指定

python学习笔记(五) - 模块

一. 使用模块 引入sys模块,使用import #!/usr/bin/env python # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print 'Hello, world!' elif len(args)==2: print 'Hello, %s!' % args[1] else: p