📄 node8.html
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head> <title>6. 模组</title> <meta name="description" content="6. 模组 "> <meta name="keywords" content="tut"> <meta name="resource-type" content="document"> <meta name="distribution" content="global"> <link rel="STYLESHEET" href="tut.css"> <link rel="next" href="node9.html"> <link rel="previous" href="node7.html"> <link rel="up" href="tut.html"> <link rel="next" href="node9.html"></head> <body> <div class="navigation"><table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node7.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node9.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody></table> <b class="navlabel">Previous:</b> <a class="sectref" href="node7.html">5.资料结构</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node9.html">7. 输入与输出</a> <br><hr></div> <!--End of Navigation Panel--> <!--Table of Child-Links--> <a name="CHILD_LINKS"><strong>小段落 </strong></a> <ul> <li><a name="tex2html305" href="node8.html#SECTION008100000000000000000">6.1 模组(续) </a> <ul> <li><a name="tex2html306" href="node8.html#SECTION008110000000000000000">6.1.1 寻找模组的路径 </a> </li> <li><a name="tex2html307" href="node8.html#SECTION008120000000000000000">6.1.2 “编译过的” Python档案</a> </li> </ul> </li> <li><a name="tex2html308" href="node8.html#SECTION008200000000000000000">6.2 标准模组 </a> </li> <li><a name="tex2html309" href="node8.html#SECTION008300000000000000000">6.3 <tt class="function">dir()</tt> 函式 </a> </li> <li><a name="tex2html310" href="node8.html#SECTION008400000000000000000">6.4 Packages(套件) </a> <ul> <li><a name="tex2html311" href="node8.html#SECTION008410000000000000000">6.4.1 从一个Package中Import * </a> </li> <li><a name="tex2html312" href="node8.html#SECTION008420000000000000000">6.4.2 Package内的References(参考) </a> </li> </ul> </li></ul> <!--End of Table of Child-Links--> <hr> <h1> <br> 6. 模组 </h1> <p> 如果你离开Python直译器然后又再打开Python直译器的话,你会发现你刚才定义的一些东西(函式或变数)都不再存在了。所以说,如果你真的想写一些比较大型的程式的话,你可能需要有一个文字编辑器来编辑一个档案,然后再让Python直译器来将这个档案当作输入(input)来处理。这个过程就是写脚本( <i>script</i> )的过程。如果你的程式继续的越来越长的话,你也许会想要把你的程式分成几个小的档案,这样比较方便来维护你的程式。你也许也会希望有一些方便的函式可以让你自由的用在好几个程式之中,你又不想要copy这些函式的定义在每个程式之中。 </p><p> 要达到以上的这些目的,Python有一个将定义放在档案中的方法,你可以之后再在你的script或是互动模式的程式下使用这些存好的定义。这样的档案就叫做模组(<i>module</i> )。存在于module之中的定义可以用 <i>imported</i> 放入在其他的module或是主要的 <i>main</i> module之中。(main module是一组你可以在script的最高一级 (top level)部分使用,或是在互动模式中使用的变数)。 </p><p> 一个module就是一个包含有Python的定义及叙述的档案,档案的名称就是module的名称加上延伸档名 <span class="file">.py</span> 在后面。在一个module里面,module的名字(是一个字串)会存在 <code>__name__</code> 这个变数里面并当作全域变数(globalvariable)使用。举例来说,你可以用你喜欢的文字编辑器打入以下的内容,并将这个档案存在目前的目录,并取名为 <span class="file">fibo.py</span> : </p><p> </p><dl><dd><pre class="verbatim"># Fibonacci numbers module<br><br>def fib(n): # write Fibonacci series up to n<br> a, b = 0, 1<br> while b < n:<br> print b,<br> a, b = b, a+b<br><br>def fib2(n): # return Fibonacci series up to n<br> result = []<br> a, b = 0, 1<br> while b < n:<br> result.append(b)<br> a, b = b, a+b<br> return result<br></pre> </dd> </dl> <p> 现在你可以进入Python的直译器里面并且import 你刚刚建立的module,其方法如下: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> import fibo<br></pre> </dd> </dl> <p> 这个命令并不会使得所有的 <code>fibo</code> 里面的函式名称都写入目前的符号表(symbol table)里面,但是会把 <code>fibo</code> 这个module的名字写在symbol table里面。 所以,我们现在就可以使用module的名字来呼叫这些我们之前所定义的函式了: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> fibo.fib(1000)<br>1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987<br>>>> fibo.fib2(100)<br>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]<br>>>> fibo.__name__<br>'fibo'<br></pre> </dd> </dl> <p> 如果你真的想要只用函式名称的话,你可以把这些函式名称设定到另一个local变数去(可以就是函式的名称): </p> <p> </p> <dl> <dd><pre class="verbatim">>>> fib = fibo.fib<br>>>> fib(500)<br>1 1 2 3 5 8 13 21 34 55 89 144 233 377<br></pre> </dd> </dl> <p> </p> <h1> <br> 6.1 模组(续) </h1> <p> 一个module里面除了放函式的定义之外也可以放可执行的叙述(statement)。这些statement的功用在于初始化(initialize)这个module。这些statement也只有在module <i>第一次</i> 被import的时候才会被执行。 <a name="tex2html4" href="#foot628"><sup>6.1</sup></a> </p> <p> 每一个模组都有其自己的符号表(symbol table),这个symbol table也就成为在module里面所定义的函式的全域变数(globalvariables)。所以说,写module的人就可以自由的使用这些global variable而不需要担心会跟module的使用者的globalvariable有所冲突。从另一方面来说,如果你知道自己在做什么的话,你也可以跟使用函式一样的使用module里面的global variable。其语法为 <code>modname.itemname</code>. </p> <p> Module可以被import到其他的module里面。习惯上(并非一定),我们会把所有的 <tt class="keyword">import</tt> 的叙述都放在module(或者是script)的最开头。这样的话这个被import的module的名称就会被放在目前这个module的globalsymbol table里面了。 </p> <p> 有一个变形的方式可以直接import module里面的变数或函式的名称进入symbol table里面。举例如下: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> from fibo import fib, fib2<br>>>> fib(500)<br>1 1 2 3 5 8 13 21 34 55 89 144 233 377<br></pre> </dd> </dl> <p> 这样做的话并不会使得module的名字被放在目前的symbol table里面。(所以在上面的例子里 <code>fibo</code> 是没有被定义的)。 </p> <p> 我们甚至可以一次将所有的在module里面所定义的名称都import进来: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> from fibo import *<br>>>> fib(500)<br>1 1 2 3 5 8 13 21 34 55 89 144 233 377<br></pre> </dd> </dl> <p> 这一个写法会import所有的定义的名称,除了以底线 ( <code>_</code> ) 开头的之外。 </p> <p> </p> <h2> <br> 6.1.1 寻找模组的路径 </h2>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -