python-模块

Posted 夏晓旭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python-模块相关的知识,希望对你有一定的参考价值。

 

先做几个练习题 

练习计算一个四乘四矩阵的所有元素的和,以及对角线之和

 

#encoding=utf-8

a=[[1,2,3,4],

   [2,5,2,3],

   [1,5,3,2],

   [5,3,2,5]

]

 

#encoding=utf-8

 

a=[[1,2,3,4],

   [2,5,2,3],

   [1,5,3,2],

   [5,3,2,5]

]

total_sum=0

diagonal_sum=0

 

\'\'\'

for i in a:

    print "i:",i

    for j in range(len(i)):

        print i[j],

        total_sum+=i[j]

print total_sum

 

 

\'\'\'

#正对角线之和

for i in range(len(a)):

    diagonal_sum+=a[i][i]

print diagonal_sum

c:\\Python27\\Scripts>python task_test.py

14

 

#反对角线之和

 

for i in range(len(a)):

    diagonal_sum+=a[i][len(a)-i-1]

print diagonal_sum

.c:\\Python27\\Scripts>python task_test.py

16

第二题:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。

#encoding=utf-8

 

a=[]

while True:

    try:

        content=raw_input("input the interger number:")

        if content.strip()==\'over\':

            break

        else:

            a.append(int(content))

 

 

    except:

        print "input error, input again!"

print a

 

max_num=max(a)

min_num=min(a)

a[a.index(max_num)] = a[0]

a[0]=max_num

a[a.index(min_num)] = a[-1]

a[-1]=min_num

 

print a

第三题:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数

#encoding=utf-8

 

a=[1,2,3,4,5,6,7,8,9,0]

m=3

 

print "a:",a

print "m",m

 

a_first=a[-m:]

a_second=a[:-m]

 

print a_first

print a_second

 

print "a:",a_first+a_second

 

c:\\Python27\\Scripts>python task_test.py

a: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

m 3

[8, 9, 0]

[1, 2, 3, 4, 5, 6, 7]

a: [8, 9, 0, 1, 2, 3, 4, 5, 6, 7]

 

 

找到模块或包的三种方法:

把包或模块放到与当前文件同一个目录下

 

#encoding=utf-8

 

import a

 

print a.add(1,3)

 

c:\\Python27\\Scripts>python task_test.py

4

把包或模块的路劲放到path里

#encoding=utf-8

 

import sys

print "sys.path:",sys.path

sys.path.append("d:\\\\")

print "sys.path:",sys.path

 

import a

 

c:\\Python27\\Scripts>python task_test.py

sys.path: [\'c:\\\\Python27\\\\Scripts\', \'C:\\\\Windows\\\\SYSTEM32\\\\python27.zip\', \'C:\\\\Python27\\\\DLLs\', \'C:\\\\Python27\\\\lib\', \'C:\\\\Python27\\\\lib\\\\plat-win\', \'C:\\\\Python27\\\\lib\\\\lib-tk\', \'C:\\\\Python27\', \'C:\\\\Python27\\\\lib\\\\site-packages\']

sys.path: [\'c:\\\\Python27\\\\Scripts\', \'C:\\\\Windows\\\\SYSTEM32\\\\python27.zip\', \'C:\\\\Python27\\\\DLLs\', \'C:\\\\Python27\\\\lib\', \'C:\\\\Python27\\\\lib\\\\plat-win\', \'C:\\\\Python27\\\\lib\\\\lib-tk\', \'C:\\\\Python27\', \'C:\\\\Python27\\\\lib\\\\site-packages\', \'d:\\\\\']

4

把sys加入path部分注释掉:

c:\\Python27\\Scripts>python task_test.py

Traceback (most recent call last):

  File "task_test.py", line 8, in <module>

    import a

ImportError: No module named a

 

把模块放到lib下的C:\\Python27\\Lib\\site-packages

#encoding=utf-8

 

import a

 

print a.add(1,3)

c:\\Python27\\Scripts>python task_test.py

4

 

当导入一个模块时,Python解析器会去搜索该模块存在的位置,其搜索顺序为:

当前目录

如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。

如果都找不到,python会查安装路径lib下的site-packages。Unix下,默认路径一般是/usr/local/python/。 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH由安装过程决定的默认目录。

包:文件夹下有一个__init__.py的文件,

模块:就是一个python文件

 

From import把包里的命名空间引入到当前的命名空间,缺点该命名空间里的同名函数会被本地的同名函数覆盖

Globals(), locals()

根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。

如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。

如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。

两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。

#encoding=utf-8

 

xiaxiaoxu="xiaxiaoxu"

 

def func():

    print "calling func()..."

    aStr="bar"

    anInt=23

    print "func()\'s globals:",globals().keys()

    print "func()\'s locals:",locals().keys()

 

print "__main__\'s globals:",globals().keys()

print "__main__\'s locals:",locals().keys()

 

func()

c:\\Python27\\Scripts>python task_test.py

__main__\'s globals: [\'__builtins__\', \'__file__\', \'__package__\', \'func\', \'__name__\', \'xiaxiaoxu\', \'__doc__\']

__main__\'s locals: [\'__builtins__\', \'__file__\', \'__package__\', \'func\', \'__name__\', \'xiaxiaoxu\', \'__doc__\']

calling func()...

func()\'s globals: [\'__builtins__\', \'__file__\', \'__package__\', \'func\', \'__name__\', \'xiaxiaoxu\', \'__doc__\']

func()\'s locals: [\'aStr\', \'anInt\']

 

 

 

 

 

包的概念

在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包是一个分层的文件目录结构,它定义了一个由模块及子包和子包下的子包等组成的Python的应用环境。

包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹被当作包使用时,文件夹中需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,表示全部导出定义过的模块。如果希望调用同一个package中的module,则直接import即可

 

 

创建包,在同一目录下

 

 

#encoding=utf-8

 

import xia.cal

print xia.cal.add(2,3)

 

c:\\Python27\\Scripts>python task_test.py

5

 

 

 

 

__init__.py中的__all__ 限制了这句话from xx import * 的使用范围

__all__ = [\'bar\', \'baz\']在一个模块中,用这个限制调用的范围

使用文件:

a1.py:

#encoding=utf-8

 

__all__ = [\'bar\', \'baz\']

 

waz = 5

bar = 10

def baz(): return \'baz\'

 

task_test.py:

#encoding=utf-8

 

from a1 import *

 

print bar

print baz

 

print waz
运行task_test.py:

c:\\Python27\\Scripts>python task_test.py

10

<function baz at 0x0000000002EE5AC8>

Traceback (most recent call last):

  File "task_test.py", line 8, in <module>

    print waz

NameError: name \'waz\' is not defined

a1.py中改为:

 

#encoding=utf-8

 

__all__ = [\'bar\', \'baz\',\'waz\']

 

#encoding=utf-8

 

__all__=[\'bar\',\'baz\',\'waz\']

 

waz=5

bar=10

 

def baz():

return \'baz\'

 

c:\\Python27\\Scripts>python task_test.py

10

<function baz at 0x0000000002C85AC8>

5

 

 

使用包,建立一个testmodule的目录,目录中有3个文件:a.py、x.py、__init__.py

 

a.py:
waz = 5
bar = 10
def baz(): return \'baz\'

x.py:
name=\'gloryroad\'
def sub(a,b):
    return a-b

__init__:
__all__ = [\'x\']

b.py:
from testmodule import * 

print a.bar
print a.baz 
print a.waz

 

c:\\Python27\\Scripts>python b.py

Traceback (most recent call last):

  File "b.py", line 3, in <module>

    print a.bar

NameError: name \'a\' is not defined

 

x.py改为:

__init__:

__all__ = [\'a]\']

 

c:\\Python27\\Scripts>python b.py

10

<function baz at 0x0000000002FFDAC8>

5

 

 

 

包方法1:有一个gloryroad目录,有个子目录submodule,两个目录中有如下几个文件: gloryroad a.py含有函数add(a,b)(当然可以包含多个函数或属性) gloryroad /submodule/b.py含有函数multiple (a,b)

现在在gloryroad目录下创建文件__init__.py ,里面不写任何内容

现在在gloryroad目录的submodule下创建文件__init__.py ,里面不写任何内容

经过如上处理后,在gloryroad目录的同级目录下,生成task_test.py。

 

#encoding=utf-8

import gloryroad.a

import gloryroad.submodule.b

print gloryroad.a.add(10,30)

print gloryroad.submodule.b.multiple(10,5)

c:\\Python27\\Scripts>python task_test.py

40

50

 

 

 

 

 

包方法2:有一个gloryroad目录,有个子目录submodule,两个目录中有如下几个文件:

gloryroad a.py含有函数add(a,b)(当然可以包含多个函数或属性)

gloryroad /submodule/b.py含有函数multiple (a,b)

 

现在在gloryroad目录下创建文件__init__.py 当导入gloryroad包时,要使用a模块中的函数,你需要在__init__.py里使用显示的导入语句。

Import a

现在在gloryroad目录的submodule下创建文件__init__.py 当导入gloryroad.submodule包时,要使用b模块中的函数,你需要在__init__.py里使用显示的导入语句。

Import b

 

经过如上处理后,在gloryroad目录的同级目录下,生成b.py。

import gloryroad

import gloryroad.submodule

print gloryroad.a.add(10,20)

print gloryroad.submodule.b.multiple(10,20)

 

c:\\Python27\\Scripts>python task_test.py

40

50

 

包方法3有一个test目录,目录中有如下几个文件:

test/a.py含有函数add()(当然可以包含多个函数或属性)

test/b.py含有函数sub()

 

现在在test目录下创建文件__init__.py 当导入test包时,为了能使用所有的函数,你需要在__init__.py里使用显示的导入语句。

 

from a import *

from b import *

 

经过如上处理后,再次导入test(import test)包后,包里所有模块中的方法或属性就全部可用了。

Task.test.py:

 

import test

 

print test.add(1,2)

print test.multiple(1,2)

c:\\Python27\\Scripts>python task_test.py

3

6

 

包方法4:有一个test目录,目录中有如下几个文件:

test/a.py含有函数add()(当然可以包含多个函数或属性)

test/b.py含有函数sub()

现在在test目录下创建文件__init__.py 当导入test包时,为了能使用所有的函数,你需要在__init__.py里使用显示的导入语句。

import a

import b

经过如上处理后,再次导入test(import test)包后,包里所有模块中的方法或属性就全部可用了。

#encoding=utf-8

 

from test import *

 

print a.add(1,2)

print b.multiple(2,1)

print a.add(2,4)

print b.multiple(3,4)

c:\\Python27\\Scripts>python task_test.py

3

2

6

12

 

写的时候为了可读性比较清晰,最好包的__init__里啥都不写,就一层一层的写

If __name__ == ‘__main__’:当前文件被python直接执行,就会执行这个下面的语句,如果作为模块被导入,这下面的语句不会执行

If __name__ == ‘__main__’:用于写测试代码,或者作为工程的入口,主程序

有时候我们会在一个.py文件代码的最下面看到if __name__==\'__main__\':。

在Python中,所有的模块都有一个内置属性__name__。这个属性的值,取决于你如何应用该模块。如果import一个模块,那么模块__name__的值通常为模块文件名,不带路径或者文件扩展名。

但是如果你把一个模块当成一个标准程序直接运行,在这种情况下,__name__的值将是一个特别的缺省值“__main__”。所以在cmd中直接运行.py文件时,__name__的值就等于\'__main__\'。

而在别的.py文件中当模块import一个.py文件后,__name__的值则等于模块文件名。

由此我们可以使用if __name__==‘__main__’来判断是否是直接运行的.py文件

 

以上是关于python-模块的主要内容,如果未能解决你的问题,请参考以下文章

python模块

python aes模块怎么导入

Python模块安装

Python基础(11)_python模块之time模块rando模块hashlibos模块

python基础五——模块

怎么安装python多线程模块