赞
踩
目录
声明:本文章内容均摘自mooc中的python编程基础。
模块
python提供了交互式和脚本式两种运行方式。当要执行的代码比较长、且需要重复使用时,我们通常将代码放在扩展名.py的python脚本文件中。
当我们要编写一个规模较大的程序时,如果将所有代码都放在一个脚本文件中,则不方便维护和多人协同开发。
对于可以在多个程序中重用的功能,我们也最好将其放在单独的脚本文件中,以方便多个程序通过引用该脚本文件、共享这些功能。
此时,我们需要按照代码功能的不同,将代码分门别类地放在不同的脚本文件中,这些脚本文件就是模块(Module)。
当要使用一个模块中的某些功能时,我们可以通过import方式将该模块导入。例如,假设模块A中定义了一些变量和函数,如果希望在模块B中使用,则可以在模块B中通过import将模块A导入,此时在模块B中就可以使用这些变量并调用模块A的所有函数。
语法格式:
- import module1
- import module2
- ...
- imopot modulen
-
- 或
-
- import module1,module2,...,moduleN
- fibo.py
-
- def PrintFib(n): #定义函数PrintFib,输出斐波那契数列的前n项
- a,b=1,1
- for i in range(1,n+1): #i的取值一次为1,2,...,n
- print(a,end='') #输出斐波那契数列的第i项
- a,b=b,a+b;
- print() #输出一个换行
-
- def GetFib(n): #定义函数GetFib,返回斐波那契数列的前n项
- fib=[] #定义一个空列表fib
- a,b=1,1
- for i in range(1,n+1):
- fib.append(a)
- a,b=b,a+b
- return fib
-
- testfibo.py
-
- import fibo #导入fibo模块
- fibo.PrintFib(5) #调用fibo模块中的PrintFib函数,输出斐波那契数列的前五项
- ls=fibo.GetFib(5)
- print(ls)
每个模块中都有一个全部变量__name__。
__name__的作用是获取当前模块的名称,如果当前模块是单独执行的,则其__name__的值就是__main__;否则,如果是作为模块导入,则其__name__的值就是模块名字。
例如上分代码:在fibo.py中执行中执行print(__name__),则屏幕上输出:__main__;而在testfibo.py的脚本文件中import fibo,则会在屏幕上输出。
修改后的fibo.py脚本文件:
- fibo.py
-
- def PrintFib(n): #定义函数PrintFib,输出斐波那契数列的前n项
- a,b=1,1
- for i in range(1,n+1): #i的取值一次为1,2,...,n
- print(a,end='') #输出斐波那契数列的第i项
- a,b=b,a+b;
- print() #输出一个换行
-
- def GetFib(n): #定义函数GetFib,返回斐波那契数列的前n项
- fib=[] #定义一个空列表fib
- a,b=1,1
- for i in range(1,n+1):
- fib.append(a)
- a,b=b,a+b
- return fib
- if__name__=='__main__': #只有单独执行fibo.py时该条件才成立
- PrintFib(10)
- ls=GetFib(10)
- ptint(ls) #输出列表中ls的元素
当执行fibo.py时,将在屏幕上输出如下结果:
- 1 1 2 3 5 8 13 21 34 55
- [1,1,2,3,5,8,13,21,34,55]
当执行testfibo.py时,将在屏幕上输出如下结果:
- 1 1 2 3 5
- [1,1,2,3,5]
可以直接导入 系统提供的模块,使用其中的功能
例:通过sys模块获取运行Python脚本时传入的参数
修改后的testfibo.py脚本文件:
- import fibo
- import sys
- n=int(sys.argv[1]) #通过sys模块的argv获取执行脚本时传入的参数
- fibo.PrintFib(n)
- ls=fibo.GetFib(n)
- print(ls)
除了使用import将整个模块导入,也可以使用from import将模块中的标识符(变量名、函数名)直接导入当前环境,这样我们在访问这些标识符时就不再需要指定模块名。
语法格式:
from 模块名 import 标识符1,标识符2,...,标识符N
例: 直接导入模块中的标识符
- from fibo import PrintFib,GetFib #导入fibo模块中的PrinFib和GetFib
- PrintFib(5) #忽略fibo模块名直接调用PrintFib函数
- ls=GetFib(5)
- print(ls)
提示:如果导入一个模块中的所有标识符,也可以使用“from 模块名 import* ”的方式。例如,对于“from fibo import PrintFib GetFib”,可以直接改为“from fibo import”
如果一个模块定义了列表__all__,则from 模块名 import* 语句智能导入__all__列表中存在的标识符。例如,对于fibo.py脚本文件,如果在第一行加入__all__列表的定义__all__=['PrintFib'],则通过“from fibo import* ”只能导入fibo模块中的PrintFib,而不会导入GetFib。
导入的标识符过长,可以使用as为模块或者标识符起别名。例如:
- import fibo as f #导入fibo模块,并为fibo起了别名f
- f.PrintFib(5) #调用fibo模块中的PrintFib函数
包
Python中的包(Package)的作用与操作系统中文件夹的作用相似,利用包可以将多个关系密切的模块组成在一起,一方面方便进行各脚本文件的管理,另一方面可以有效避免模块明面冲突问题。
定义一个包,就是创建一个文件夹并在该文件夹下创建一个__init__.py文件,文件夹的名字就是包名。
另外,可以根据需要在该文件夹下再创建子文件夹,子文件夹中创建一个__init__.py文件,则又形成了一个子包。
模块可以放在任何一个包或子包中,在导入模块时需要指定所在的包和子包的名字。例如,如果要导入包A中的模块B,则需要使用“import A.B”。
示例:
- sound/顶级包
- __init__.py #初始化这个声音包
- formats #文件格式转换子包
- __init__.py
- wavread.py
- wavwrite.py
- aiffread.py
- aiffwrite.py
- auread.py
- auwrite.py
- effects.py
- ...
-
- effcets/子包
- __init__.py
- echo.py
如果要使用sound包中的echo模块,则可以通过下面方式导入:
import sound.effects.ech
假设在ehco模块中有一个echo模块中有一个echofilter函数,则调用该函数时必须指定完整的路径名字,即:
import sound.effects.echo.echofilter(实参列表)
也开始使用from import的方式导入包中的模块(推荐),如:
- from sound.effects import echo
- echo.echofilter(实参列表) #不需要加包名
也可以使用from import直接导入模块中的标识符:
- from sound.effects.echo.import.echofilter
- echofilter(实参) #可以直接调用函数
闭包是一种特殊情况,外层函数在结束时会发现其定义的局部变量将会在内层函数中使用,此时外层函数就会把这些自由变量绑定到内层函数。
所谓闭包,实际上就是将内层函数的代码以及自由变量(外层函数定义,但会由内层函数使用)打包在一起了,例如:
- def outer(x): #定义函数outer
- y=10 #定义局部变量y并赋为10
- def inner(z): #在outer函数中定义
- nonlocal x,y #nonloal声明
- return x+y+z
- return inner
- f=outer(5)
- g=outer(50)
- print('f(20)的值为:',f(20))
- print('g(20)的值为:',g(20))
- print('f(30)的值为:',f(30))
- print('g(30)的值为:',g(30))
-
- 输出:
- f(20)的值为:35
- g(20)的值为:80
- f(30)的值为:45
- g(30)的值为:90
闭包的主要作用在于可以封存函数执行的上下文环境。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。