• 手机版

    扫码体验手机版

  • 微信公众号

    扫码关注公众号

游客您好
第三方账号登陆
  • 点击联系客服

    在线时间:8:00-16:00

    客服QQ

    2938366614

    电子邮件

    pcs2938366614@163.com
  • 友智园

    随时随地学习编程

  • 扫描二维码

    关注微信公众号

Lv.16 站长
1号会员,11532活跃度,2019/12/31 加入学习
  • 622发帖
  • 492主题
  • 7关注
  • 69842粉丝
官方账号
  • 满级大神

    用户达到16级即可
  • 老兵专属

    老用户专属勋章
  • 达人守护

    友智园守护达人
  • 牛气冲天

    2021新春活动专属
  • 虎虎生威

    2022虎年限定勋章
推荐课程更多
优秀讲师更多
课堂交流更多

python教程8-模块

[复制链接]
友智君官方认证 实名认证 发表于 2020-9-1 17:51:36 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
模块2 r' _& U& F' x: q7 t/ n: Z: N2 ]

. \: Z0 a- R5 o! i7 W5 y简介
$ r. {' }/ n7 h0 Y+ J3 U% v% ^
& o6 l5 G, P( V. G: E  y你已经学习了如何在你的程序中定义一次函数而重用代码。如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块。模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py 为扩展名。+ U- l: h3 M+ ]& j  P

8 `- T; n9 M3 T# @1 M0 j模块可以从其他程序 输入 以便利用它的功能。这也是我们使用 Python 标准库的方法。首先,我们将学习如何使用标准库模块。# B" F/ Q1 w3 p4 u

  _4 W  x, Z) r  C* P- X使用 sys 模块# ^. J" C' F: S3 X
3 H, b& C/ c1 T5 H9 T1 X& p
例 8.1 使用 sys 模块
* f4 \( ~( O  g; L8 Y3 D# D2 Q7 l% o: I6 I5 ^- Y9 I% Q" ]/ m1 W
  1. #!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments are:' for i in sys.argv: print i print '\n\nThe PYTHONPATH is', sys.path, '\n'
复制代码
, ?2 Z+ @( b$ S! r3 I
输出0 T# E- e' R+ r5 |
# s' P6 H& x" v5 g' Y+ m
  1. $ python using_sys.py we are arguments The command line arguments are: using_sys.py we are arguments The PYTHONPATH is ['/home/swaroop/byte/code', '/usr/lib/python23.zip', '/usr/lib/python2.3', '/usr/lib/python2.3/plat-linux2', '/usr/lib/python2.3/lib-tk', '/usr/lib/python2.3/lib-dynload', '/usr/lib/python2.3/site-packages', '/usr/lib/python2.3/site-packages/gtk-2.0']
复制代码
0 Q) B9 _( n# {) Q
它如何工作
6 T% A% H1 ?) ?5 v. P: |$ H1 Q
8 @; x4 S" i  U6 a8 c* i首先,我们利用 import 语句 输入 sys 模块。基本上,这句语句告诉 Python,我们想要使用这个模块。sys 模块包含了与 Python 解释器和它的环境有关的函数。
* |. M- ?) O& j6 G: ]* }7 A& o! D; E+ X
当 Python 执行 import sys 语句的时候,它在 sys.path 变量中所列目录中寻找 sys.py 模块。如果找到了这个文件,这个模块的主块中的语句将被运行,然后这个模块将能够被你 使用 。注意,初始化过程仅在我们 第一次 输入模块的时候进行。另外,“sys”是“system”的缩写。4 K+ Z+ U7 e; Y5 D

& Z; I2 w& |5 X; l6 t' z0 m' asys 模块中的 argv 变量通过使用点号指明——sys.argv——这种方法的一个优势是这个名称不会与任何在你的程序中使用的 argv 变量冲突。另外,它也清晰地表明了这个名称是 sys 模块的一部分。; R" I# @5 t$ @0 ?% w8 {
( R7 H1 }* A( a$ y& v! T
sys.argv 变量是一个字符串的 列表(列表会在后面的章节详细解释)。特别地,sys.argv 包含了 命令行参数 的列表,即使用命令行传递给你的程序的参数。
! n8 b6 G. s8 e3 O; Q9 N- I4 w/ [/ F6 b5 h% j& s5 i7 y
如果你使用 IDE 编写运行这些程序,请在菜单里寻找一个指定程序的命令行参数的方法。* K* i6 R( |2 J+ j1 Z6 _" T; j

- L- c# g+ q* h: W) i) T这里,当我们执行 python using_sys.py we are arguments 的时候,我们使用 python 命令运行 using_sys.py 模块,后面跟着的内容被作为参数传递给程序。Python 为我们把它存储在 sys.argv 变量中。
  w' q( B2 L- W4 Q
  Z9 B% U( \& ^; g- G: Q& M记住,脚本的名称总是 sys.argv 列表的第一个参数。所以,在这里,'using_sys.py'是sys.argv[0]、'we'是 sys.argv[1]、'are'是sys.argv[2]以及'arguments'是 sys.argv[3]。注意,Python 从 0 开始计数,而非从 1 开始。
  @# u% d( w" x& D/ |6 d1 Y" }2 R/ {+ X. v/ B6 _( V
sys.path 包含输入模块的目录名列表。我们可以观察到 sys.path 的第一个字符串是空的——这个空的字符串表示当前目录也是 sys.path 的一部分,这与 PYTHONPATH 环境变量是相同的。这意味着你可以直接输入位于当前目录的模块。否则,你得把你的模块放在 sys.path 所列的目录之一。( D* g. V4 G% j
! x/ O9 c& ~' m( A7 q& B
字节编译的.pyc文件/ F# Y9 x5 d. a- [# K5 e

; M; ]8 B8 P  G! E& g) O输入一个模块相对来说是一个比较费时的事情,所以 Python 做了一些技巧,以便使输入模块更加快一些。一种方法是创建 字节编译的文件 ,这些文件以.pyc作为扩展名。字节编译的文件与 Python 变换程序的中间状态有关(是否还记得 Python 如何工作的介绍?)。当你在下次从别的程序输入这个模块的时候,.pyc 文件是十分有用的——它会快得多,因为一部分输入模块所需的处理已经完成了。另外,这些字节编译的文件也是与平台无关的。所以,现在你知道了那些.pyc 文件事实上是什么了。
0 C3 Q6 T- J/ A! h) N- n# w- ]5 {2 I- s5 x
from..import 语句
3 v3 Q- A- m4 F5 ]4 X8 _
( w# E( [+ [2 G: k7 }如果你想要直接输入 argv 变量到你的程序中(避免在每次使用它时打 sys.),那么你可以使用 from sys import argv 语句。如果你想要输入所有 sys 模块使用的名字,那么你可以使用 from sys import *语句。这对于所有模块都适用。一般说来,应该避免使用 from..import 而使用 import 语句,因为这样可以使你的程序更加易读,也可以避免名称的冲突。' B8 E. L4 [- @
. k" ^9 ?: }& i% m, O
模块的name7 ?# d  x: A4 U7 K; f1 b! H2 I5 q+ b+ _
( i5 L3 Q' R$ T& ^1 k- {8 g
每个模块都有一个名称,在模块中可以通过语句来找出模块的名称。这在一个场合特别有用——就如前面所提到的,当一个模块被第一次输入的时候,这个模块的主块将被运行。假如我们只想在程序本身被使用的时候运行主块,而在它被别的模块输入的时候不运行主块,我们该怎么做呢?这可以通过模块的 name 属性完成。
6 n1 b% U) Z( R, ?  u# d
' U2 f# O& }2 Y( V, W使用模块的 name
+ Y( @& L0 s  W+ T$ h
: R; W2 ]2 K6 x例 8.2 使用模块的 name
- H3 C7 u( g2 N% \6 A8 v
  1. <p>#!/usr/bin/python # Filename: using_name.py if __name__ == '__main__': print 'This program is being run by itself' else: print 'I am being imported from another module' </p>
复制代码

: W/ Z1 R/ D4 x' ]输出
$ n; O8 q/ j8 E$ n9 H* H
( k, a8 ~+ d/ E" }; i
  1. <p>$ python using_name.py This program is being run by itself $ python >>> import using_name I am being imported from another module >>></p><p>
    3 J: @7 r- Q# M$ P; e- x. G
  2. </p><p>```</p>
复制代码
5 W- ?8 Z' N; F+ p( e$ m
它如何工作* b7 q( I3 _. D

6 y7 Q5 B0 Y) f* U* R0 J每个 Python 模块都有它的 name,如果它是'main',这说明这个模块被用户单独运行,我们可以进行相应的恰当操作。5 Y) _5 m% ^. N) ^+ m: E$ S2 Z/ \7 k

) r7 m/ ^4 F6 i* i制造你自己的模块
4 J: @% e0 F# s: v6 y' T2 J1 E6 b7 N$ S0 p; _2 v2 E
创建你自己的模块是十分简单的,你一直在这样做!每个 Python 程序也是一个模块。你已经确保它具有.py 扩展名了。下面这个例子将会使它更加清晰。
; l. s% ^; L  e4 [4 ~2 Z- ^+ J& k  f6 g
创建你自己的模块
$ c1 {* t4 y4 `* L" ~/ F9 X- ~$ ?7 R; w' l3 ]# D
例 8.3 如何创建你自己的模块
  z5 c+ Y% X" K& t* j  v- m7 d
  1. <p>#!/usr/bin/python # Filename: mymodule.py def sayhi(): print 'Hi, this is mymodule speaking.' version = '0.1' # End of mymodule.py </p>
复制代码
1 _3 W$ z' u6 G4 L' q
上面是一个 模块 的例子。你已经看到,它与我们普通的 Python 程序相比并没有什么特别之处。我们接下来将看看如何在我们别的 Python 程序中使用这个模块。
5 j( H' V" [3 r) W3 i+ A5 J' [& P3 ^, N+ i6 P& q4 b
记住这个模块应该被放置在我们输入它的程序的同一个目录中,或者在 sys.path 所列目录之一。
+ O- n8 i7 U7 ~" H8 V) W* }" ?3 s& D
  1. <p>#!/usr/bin/python # Filename: mymodule_demo.py import mymodule mymodule.sayhi() print 'Version', mymodule.version </p>
复制代码
) t. S- L6 m0 ?6 U1 M1 q$ I
输出
: J) B3 ~. j2 S
  1. <p>$ python mymodule_demo.py Hi, this is mymodule speaking. Version 0.1 </p>
复制代码

4 t8 [1 v# V/ h它如何工作
0 f! J6 l' h" G8 K8 V: O" ]; V1 I' t3 S( X3 e
注意我们使用了相同的点号来使用模块的成员。Python 很好地重用了相同的记号来,使我们这些 Python 程序员不需要不断地学习新的方法。
2 A6 g) R; ^0 |  d, }. x/ j! v# @3 f2 [/ V
from..import
+ ^$ `. d2 l/ @) ^7 E- M0 j5 P, [3 M6 u0 l3 \5 R. N) R' P% ~+ E
下面是一个使用 from..import 语法的版本。/ d6 q( b. b! c" l8 \
3 f) R6 ]  j5 A2 f. l$ S
  1. #!/usr/bin/python # Filename: mymodule_demo2.py from mymodule import sayhi, version # Alternative: # from mymodule import * sayhi() print 'Version', version
复制代码
4 N2 e" e! A! N8 b" c
mymodule_demo2.py 的输出与 mymodule_demo.py 完全相同。5 n, O1 f/ D8 N$ y0 y
& o& n$ I+ n, D( u: ^: z) i
dir()函数
6 c4 Q. L/ w8 k8 o6 T! r2 H4 R
7 L' N. p' g- t+ U你可以使用内建的 dir 函数来列出模块定义的标识符。标识符有函数、类和变量。7 \; [  Q, e, N! _4 ], W+ G
, o& {% c: E2 }; w( e* A
当你为 dir()提供一个模块名的时候,它返回模块定义的名称列表。如果不提供参数,它返回当前模块中定义的名称列表。+ k1 M) m7 N9 l- j) e2 m

2 m$ s8 X7 v: f2 i使用 dir 函数9 x2 R5 _4 K! D/ N* E3 U
7 \: J2 j' }. U
例 8.4 使用 dir 函数
0 N* C& b' m7 F. w4 F2 L# E3 c, m3 v& R7 [/ s
  1. $ python >>> import sys >>> dir(sys) # get list of attributes for sys module ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode', 'meta_path','modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'version', 'version_info', 'warnoptions'] >>> dir() # get list of attributes for current module ['__builtins__', '__doc__', '__name__', 'sys'] >>> >>> a = 5 # create a new variable 'a' >>> dir() ['__builtins__', '__doc__', '__name__', 'a', 'sys'] >>> >>> del a # delete/remove a name >>> >>> dir() ['__builtins__', '__doc__', '__name__', 'sys'] >>>
复制代码
4 s5 v- ^* O0 ]8 D0 V2 H0 J
它如何工作  j! b* i" m3 y6 i

( n# I4 Y8 I  Z+ ~首先,我们来看一下在输入的 sys 模块上使用 dir。我们看到它包含一个庞大的属性列表。* v3 \: F  }4 J3 ^5 N7 @  d3 i

5 O5 y6 v) X; G- x; T* j接下来,我们不给 dir 函数传递参数而使用它——默认地,它返回当前模块的属性列表。注意,输入的模块同样是列表的一部分。
- s& k  T0 `0 s; s) I* h8 n
2 ^* V3 u& ~/ r( w; T( U为了观察 dir 的作用,我们定义一个新的变量 a 并且给它赋一个值,然后检验 dir,我们观察到在列表中增加了以上相同的值。我们使用del语句删除当前模块中的变量/属性,这个变化再一次反映在 dir 的输出中。
. O0 Q  m/ g6 b, d2 d: y" P
5 O& R6 |  \9 \/ N关于 del 的一点注释——这个语句在运行后被用来 删除 一个变量/名称。在这个例子中,del a,你将无法再使用变量 a——它就好像从来没有存在过一样。
; w3 C+ b* g3 B3 o  z; d) `' ?- p# }+ O  F6 P0 B
概括
% m+ i# G) l# M, ^0 P# p& d; @& H: `# N; A
模块的用处在于它能为你在别的程序中重用它提供的服务和功能。Python 附带的标准库就是这样一组模块的例子。我们已经学习了如何使用这些模块以及如何创造我们自己的模块。
( D/ y! w9 \- b( A  z
7 S$ Z3 A4 `5 Y7 [( e$ W# Z) ^/ b接下来,我们将学习一些有趣的概念,它们称为数据结构。
6 [, S& j6 |. L% S2 \: S5 E- G# [9 k! q( z! G1 ^4 h
客服QQ:2938366614

精彩评论113

xianyuqing77 发表于 2020-9-1 18:00:33 | 显示全部楼层
顶顶更健康
) b1 W( Y" F& H- V9 x" A4 u1 t
该用户还没有理想!
hccz 发表于 2020-9-1 18:00:33 | 显示全部楼层
不错 支持下
5 n5 i4 F4 z  H+ J
该用户还没有理想!
Archer 发表于 2020-9-1 18:00:33 | 显示全部楼层
看起来好像不错的样子; v% F! U; v5 d/ `& t: Z
该用户还没有理想!
541630296 发表于 2020-9-1 18:00:33 | 显示全部楼层
支持支持再支持
. `- T2 r0 G& L5 r( D, E3 _
该用户还没有理想!
三K(陈日阳) 发表于 2020-9-1 18:00:33 | 显示全部楼层
路过 帮顶 嘿嘿, J' T- X5 g9 M! Z5 C+ Z
该用户还没有理想!
princess 发表于 2020-9-1 18:00:33 | 显示全部楼层
我也是坐沙发的4 z! x  c4 E9 s  J1 Z, ~+ @; |8 d
该用户还没有理想!
pp8111 发表于 2020-9-1 18:00:33 | 显示全部楼层
OMG!介是啥东东!!!
# h# U+ s( `/ K, B8 ]6 h7 H6 B
该用户还没有理想!
xiaso2008 发表于 2020-9-1 18:00:33 | 显示全部楼层
支持楼主,用户楼主,楼主英明呀!!!
! c; ~9 }# b; w9 B: z5 Q% ^7 [
该用户还没有理想!
一埸游戏一埸梦 发表于 2020-9-1 18:00:33 | 显示全部楼层
沙发???7 u1 ~& ~: T, J( k
该用户还没有理想!
懒得打字嘛,点击右侧快捷回复 【友智园专属】
您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于我们
  • 关注官方微信

  • QQ在线客服

    在线联系
  • 友智园
  • 山东省菏泽市


Copyright © 2019- PCS Rights Reserved