zoukankan      html  css  js  c++  java
  • 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:Python27Scripts>python task_test.py

    14

     

    #反对角线之和

     

    for i in range(len(a)):

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

    print diagonal_sum

    .c:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Libsite-packages

    #encoding=utf-8

     

    import a

     

    print a.add(1,3)

    c:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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:Python27Scripts>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文件

     

  • 相关阅读:
    BZOJ1087=Codevs2451=洛谷P1896&P2326互不侵犯
    poj1286
    P1066 2^k进制数
    开车旅行
    洛谷P1396 营救
    poj1840
    poj3693
    poj1195
    3955 最长严格上升子序列(加强版)
    1021 玛丽卡
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/8379808.html
Copyright © 2011-2022 走看看