从0开始学python----6

目录

模块

import语句

模块使用方法示例

全局变量__name__

 系统模块

from import

as

子包

闭包


声明:本文章内容均摘自mooc中的python编程基础。

模块

python提供了交互式和脚本式两种运行方式。当要执行的代码比较长、且需要重复使用时,我们通常将代码放在扩展名.py的python脚本文件中。

当我们要编写一个规模较大的程序时,如果将所有代码都放在一个脚本文件中,则不方便维护和多人协同开发。

对于可以在多个程序中重用的功能,我们也最好将其放在单独的脚本文件中,以方便多个程序通过引用该脚本文件、共享这些功能。

此时,我们需要按照代码功能的不同,将代码分门别类地放在不同的脚本文件中,这些脚本文件就是模块(Module)。

import语句

当要使用一个模块中的某些功能时,我们可以通过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__的作用是获取当前模块的名称,如果当前模块是单独执行的,则其__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)

from import

除了使用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

导入的标识符过长,可以使用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

 闭包的主要作用在于可以封存函数执行的上下文环境。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值