python系列教程26

朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow

 

声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好的理解人工智能技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是要由所写,所以不如我的人工智能技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!

 

导入和重载提供了一种自然的程序启动的选择,因为导入操作将会在最后一步执行文件。从更宏观的角度来看,模块扮演了一个工具库的角色,这将在后面学到。从一般意义上来说,模块往往就是变量名的封装,被认作是命名空间。在一个包中的变量名就是所谓的属性:也就是说,属性就是绑定在特定的对象上的变量名(就像一个模块)。

 

在典型的应用中,导入者得到了模块文件中在顶层所定义的所有变量名。这些变量名通常被赋值给通过模块函数、类、变量以及其他被导出的工具。这些往往都会在其他文件或程序中使用。表面上来看,一个模块文件的变量名可以通过两个Python语句读取——import和from,以及reload调用。

 

为了讲清楚,请使用文本编辑器创建一个名为myfile.py的单行的Python模块文件,其内容如下所示:

title = "The Meaning of Life"

这也许是世界上最简单的Python模块文件之一了(它只包含了一行赋值语句),但是它已经足够讲明白基本的要点。当文件导入时,它的代码运行并生成了模块的属性。这个赋值语句创建了一个名为title的模块的属性。

 

可以通过两种不同的办法从其他组件获得这个模块的title属性。第一种,你可以通过使用一个import语句将模块作为一个整体载入,并使用模块名后跟一个属性名来获取它:

% python                # Start Python

>>> import myfile       # Run file; load module as a whole

>>> print(myfile.title) # Use its attribute names: '.' to qualify

The Meaning of Life

一般来说,这里的点号表达式代表了object.attribute的语法,可以从任何的object中取出其任意的属性,并且这是Python代码中的一个常用操作。在这里,我们已经使用了它去获取在模块myfile中的一个字符串变量title,即myfile.title。

 

作为替代方案,可以通过这样的语句从模块文件中获得(实际上是复制)变量名:

% python                     # Start Python

>>> from myfile import title # Run file; copy its names

>>> print(title)             # Use name directly: no need to qualify

The Meaning of Life

就像今后看到的更多细节一样,from和import很相似,只不过增加了对载入组件的变量名的额外的赋值。从技术上讲,from复制了模块的属性,以便属性能够成为接收者的直接变量。因此,能够直接以title(一个变量)引用导入字符串而不是myfile.title(一个属性引用。

无论使用的是import还是from去执行导入操作,模块文件myfile.py的语句都会执行,并且导入的组件(对应这里是交互提示模式)在顶层文件中得到了变量名的读取权。也许在这个简单的例子中只有一个变量名(变量title被赋值给一个字符串),但是如果开始在模块中定义对象,例如,函数和类时,这个概念将会很有用。这样一些对象就变成了可重用的组件,可以通过变量名被一个或多个客户端模块读取。

 

在实际应用中,模块文件往往定义了一个以上的可被外部文件使用的变量名。下面这个例子中定义了三个变量名:

a = 'dead'          # Define three attributes

b = 'parrot'        # Exported to other files

c = 'sketch'

print(a,b,c)      # Also used in this file

文件treenames.py,给三个变量赋值,并对外部世界生成了三个属性。这个文件并且在一个print语句中使用它自有的三个变量,就像在将其作为顶层文件运行时看到的结果一样:

% python threenames.py

dead parrot sketch

所有的这个文件的代码运行起来就和第一次从其他地方导入(无论是通过import或者from)后一样。这个文件的客户端通过import得到了具有属性的模块,而客户端使用from时,则会获得文件变量名的复本。

% python

>>> import threenames  # Grab the whole module

dead parrot sketch

>>>

>>> threenames.b,threenames.c


('parrot','sketch')

>>>

>>> from threenames import a,b,c # Copy multiple names

>>> b,c

('parrot','sketch')

这里的结果打印在括号中,因为它们实际上是元组(下一部分介绍的一种对象);目前我们可以暂时忽略它们。

 

一旦你开始就像这里一样在模块文件编写多个变量名,内置的dir函数开始发挥作用了。你可以使用它来获得模块内部的可用的变量名的列表。下面代码返回了一个Python字符串列表(我们将从后面开始学习列表):

>>> dir(threenames)
['__builtins__','__doc__','__file__','__name__','__package__','a','b','c']

我们在Python 3.0和Python 2.6中分别运行它,较早的Python可能返回较少的名字。当dir函数就像这个例子一样,通过把导入模块的名称传至括号里,进行调用后,它将返回这个模块内部的所有属性。其中返回的一些变量名是“免费”获得的:一些以双下划线开头并结尾的变量名,这些通常都是由Python预定义的内置变量名,对于解释器来说有特定的意义。那些通过代码赋值而定义的变量(a、b和c)在dir结果的最后显示。

 

模块导入是一种运行代码文件的方法,但是就像稍后我们即将讨论的那样,模块同样是Python程序最大的程序结构。

 

一般来说,Python程序往往由多个模块文件构成,通过import语句连接在一起。每个模块文件是一个独立完备的变量包,即一个命名空间。一个模块文件不能看到其他文件定义的变量名,除非它显式地导入了那个文件,所以模块文件在代码文件中起到了最小化命名冲突的作用。因为每个文件都是一个独立完备的命名空间,即使在它们拼写相同的情况下,一个文件中的变量名是不会与另一个文件中的变量冲突的。

 

实际上,就像你将看到的那样,正是由于模块将变量封装为不同部分,Python具有了能够避免命名冲突的优点。我们将会在后面讨论模块和其他的命名空间结构(包括类和函数的作用域)。就目前而言,模块是一个不需要重复输入而可以反复运行代码的方法。

 

reload是不可传递的,重载(也就是reload)一个模块的话只会重载该模块,而不能够重载该模块所导入的任何模块,因此,有时候必须reload多个文件。

 

由于这些复杂的地方(并且我们将会在后边碰到其他的麻烦,包括前面的所讨论的reload/from问题),从现在开始就要避免使用import和reload启动程序,这是一个好主意。例如,后面所介绍的IDLE Run→Run Module的菜单选项,提供了一个简单并更少错误的运行文件的方法,并且总是运行代码的最新版本。系统shell命令行提供了类似的优点。如果使用这些技术的话,不需要使用reload。

 

如果必须导入,为了避免复杂性,请将所有的文件放在同一目录下,同时将这个目录作为你的工作目录。

 

也就是说,import和reload已经证明了是Python类中的一种常用测试技术,并且你可能也喜欢使用这种方法。然而,通常如果你发现自己碰壁了,那就停止继续碰壁。

 

 

 

实际上,除了这里介绍的,还有更多的方法可以运行模块文件中保存的代码。例如,exec(open('module.py').read())内置函数调用,是从交互提示模式启动文件而不必导入以及随后的重载的一种方法。每次exec都运行文件的最新版本,而不需要随后的重载(script1.py保留我们在前面一次重载它之后的样子):

C:\misc> c:\python30\python

.>>> exec(open('script1.py').read())

win32

65536

Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

...change script1.py in a text edit window...

 

.>>> exec(open('script1.py').read())

win32

4294967296

Spam!Spam!Spam!Spam!Spam!Spam!Spam!Spam!

 

exec调用有着类似于import的效果,但是,它从技术上不会导入模块,默认情况下,每次以这种方式调用exec的时候,它都重新运行文件,就好像我们把文件粘贴到了调用exec的地方。因此,exec不需要在文件修改后进行模块重载,它忽略了常规的模块导入逻辑。

 

缺点是,由于exec的工作机制就好像在调用它的地方粘贴了代码一样,和前面提到的from一样,对于当前正在使用的变量有潜在的默认覆盖的可能。例如,我们的script1.py赋给了一个名为x的变量。如果这个名字已经在exce调用的地方使用了,那么这个名称的值将被覆盖。

.>>> x = 999

.>>> exec(open('script1.py').read())  # Code run in this namespace by default

...same outout...

.>>> x                                # Its assignments can overwrite names here

'Spam!'

 

相反,基本的import语句每个进程只运行文件一次,并且它会把文件生成到一个单独的模块名称空间中,以便它的赋值不会改变你的作用域中的变量。为模块名称空间分隔所付出的代价是,在修改之后需要重载。

 

注意:版本差异提示:除了允许exec(open('module.py'))的形式,Python 2.6也包含一个execfile('module.py')内置函数,这两个函数都会自动读取文件的内容。这两种形式都等同于exec(open('module.py').read())的形式,后者更为复杂,但是在Python 2.6和Python 3.0中都可以运行。

 

遗憾的是,两种较简单的Python 2.6的形式,在Python 3.0中都不可用,这意味着我们必须理解文件及其读取方法,以便今天完全理解这一技术(唉,这似乎是针对Python 3.0的实用性的美学痛击)。实际上,Python 3.0中的exec形式需要如此多的录入,以至于最佳建议都是干脆不要使用它,通常启动文件的最好方式是输入系统shell命令行或者使用后面所介绍的IDLE菜单选项。

 

 

到目前为止,我们看到了如何通过交互提示模式、系统命令行、图标点击、模块导入和exec调用来运行Python代码。如果你希望找到更可视化的方法,IDLE提供了做Python开发的用户图形界面(GUI),而且它是Python系统的一个标准并免费的部分。它往往被认为是一个集成开发环境(IDE),因为它在一个单独的界面中绑定了很多开发任务。

 

简而言之,IDLE是一个能够编辑、运行、浏览和调试Python程序的GUI,所有都能够在单独的界面实现。此外,由于IDLE是使用Tkinter GUI工具包开发的Python程序,可以在几乎任何Python平台上运行,包括微软Windows、X Windows(例如,Linux、UNIX以及Unix类平台)以及Mac OS(无论是Classic还是OS X)。对于很多人来说,IDLE代表了一种简单易用的命令行输入的替代方案,并且比点击图标出问题的可能性更小。

 

让我们直接来看一个例子。在Windows中启动IDLE很容易:在开始按钮的Python菜单中进行启动,并且也能够通过右键点击Python程序图标进行选择。在UNIX类系统中,需要在命令行中启动IDLE的顶层脚本,另一种办法是通过点击位于Python的Lib目录下的idlelib子目录下的idle.pyw或idle.py运行。在Windows中,IDLE是位于C:\Python30\Lib\idlelib或者在Python 2.6中是C:\Python26\Lib\idlelib中的一个Python脚本。

 

Python shell窗口是主窗口,一开始就会被打开,并运行交互会话。

 

IDLE可以使用友好的菜单并配合键盘快捷键进行绝大多数操作。为了在IDLE中创建(或编写)源文件,可以打开一个新的文本编辑窗口:在主窗口,选择File下拉菜单,并选择New Window来打开一个新的文本编辑窗口(或者Open…去编辑一个已存在的文件)。

 

IDLE使用了语法导向的着色方法,对在主窗口输入的代码和文本编辑窗口的关键字使用的是一种颜色,常量使用的是另一种颜色。这有助于给代码中的组件一个更好的外观(甚至可以帮助你发现错误,例如,连续的字符串都是一种颜色)。

 

为了运行在IDLE中编辑的代码文件,首先选中文本编辑窗口,并点击窗口中的Run下拉菜单,选择列举在那里的Run Module选项(或者使用等效的键盘快捷键,快捷键在菜单中已给出)。如果已经在文件打开或最后一次保存后改变了文件,Python将会提醒需要首先保存文件。

 

在Windows下进行。使用File菜单开始创建一个(新窗口)或打开(Open … )一个源文件;使用文件编辑窗口的Run菜单去运行窗口的代码(Run Module)

 

注意:建议:如果想要在IDLE的主窗口中重复前一条命令,可以使用Alt-P组合键回滚,找到命令行的历史记录,并用Alt-N向前寻找(在Mac上,可以试试使用Ctrl-P和Ctrl-N)。之前的命令可以重新调用并显示,并且可以编辑改变后运行。也可以通过使用游标指到命令上重新运行该命令,或使用复制粘贴的操作,但这些看起来需要花费更多力气。除了IDLE,Windows的交互模式对话环境中,可以使用方向键重新调用使用过的命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值