zoukankan      html  css  js  c++  java
  • Python入门day21——模块

    模块

    一、一个python文件有两种用途
    • 被当成程序运行
    • 被当做模块导入
    二、import和from...inport...
    # impot导入模块在使用时必须加前缀"模块."
    # 优点:肯定不会与当前名称空间中的名字冲突
    # 缺点:加前缀显得麻烦
    import *
    # 1、执行foo.py
    # 2、产生foo.py的名称空间,将foo.py运行过程中产生的名字都丢到foo的名称空间中
    # 3、在当前文件中产生的有一个名字foo,该名字指向2中产生的名称空间
    from * import *
    # from ... import ...导入也发生了三件事
    # 1、产一个模块1的名称空间
    # 2、产生模块1的名称空间,,将运行过程中产生的名字都丢到模块1的名称空间去
    # 3、在当前名称空间拿到一个名字,该名字与模块名称空间中的内存地址绑定
    
    # foo.py文件内容
    x=1
    name='yu'
    def get():
        print(x)
    
    def change():
        global x
        x=0
        
    # run文件内容
    from foo import x # x=模块foo中值0的内存地址
    from foo import get # get=模块foo中值get的内存地址
    from foo import change # change=模块change中值0的内存地址
    x=333333333
    
    print(x) # 333333333
    print(get) # <function get at 0x000001B6B8B98280>
    print(change) # <function change at 0x000001B6B8B981F0>
    
    get() # 1
    change() # 
    get() # 0
    
    print(x) # 333333333
    from foo import x # x=新地址
    print(x) # 0
    
    # from...impot...导入模块在使用时不用加前缀
    # 优点:代码更精简
    # 缺点:容易与当前名称空间混淆
    from foo import x # x=模块foo中值1的内存地址 x = 1
    x=1111
    
    # 一行导入多个名字(不推荐)
    from foo import x,get,change
    
    # *:导入模块中的所有名字
    from foo import *
    print(name) # yu
    print(x) # 1
    print(get) # <function get at 0x000001B6B8B98280>
    print(change) # <function change at 0x000001B6B8B981F0>
    
    # # 了解:__all__:代码中是不提倡用 from xxx import * 的写法的,如果一个模块 spam 没有定义 __all__,执行 from spam import * 的时候会将 spam 中非下划线开头的成员都导入当前命名空间中,这样就有可能弄脏当前命名空间。如果显式声明了 __all__,import * 就只会导入 __all__ 列出的成员。如果 __all__ 定义有误,列出的成员不存在,还会明确地抛出异常,而不是默默忽略。
    
    # # 起别名
    from foo import get as g
    print(g) # <function get at 0x000001C892088280>
    
    三、模块的导入路径优先级:
    # 无论是import还是from...import在导入模块时都涉及到查找问题
    # 优先级:
    # 1、内存(内置模块)
    # 2、硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块
    
    import sys
    # 值为一个列表,存放了一系列的对文件夹
    # 其中第一个文件夹是当前执行文件所在的文件夹
    print(sys.path)
    
    # ['D:\老男孩\week4\day21\代码', 'D:\老男孩', 
    'C:\Program Files (x86)\PyCharm 2019.3.3\plugins\python\helpers\pycharm_display', 'D:\python38\python38.zip', 'D:\python38\DLLs', 'D:\python38\lib', 'D:\python38', 'C:\Users\artist\AppData\Roaming\Python\Python38\site-packages', 'D:\python38\lib\site-packages', 'C:\Program Files (x86)\PyCharm 2019.3.3\plugins\python\helpers\pycharm_matplotlib_backend']
    
    # foo文件内容
    print('模块foo==>')
    def say():
        print(1)
        
    # 验证    
    import foo # 导入后内存中已经有foo了
    foo.say() # 1
    def foo # 删除foo的内存绑定
    import time 
    time.sleep(10)
    import foo
    foo.say() # 10秒后打印  1
    
    # 了解:sys.modules查看已经加载到内存中的模块
    import sys
    import foo # foo=模块的内存地址
    del foo
    
    def func():
        import foo # foo=模块的内存地址
    func() # 运行函数func但是里面的import foo会导入但不会运行
    
    print('foo' in sys.modules) # True
    print('func' in sys.modules) # False func不是模块
    print(sys.modules) # 打印模块
    
    import sys
    # 找foo.py就把foo.py的文件夹添加到环境变量中
    sys.path.append(r'D:老男孩week4day21代码)
    import foo
    foo.say()
    
    from foo import say
    

    函数的类型提示

    # 可以在定义函数的时候以下面的格式
    def register(形参:类型)->返回值类型:# 使传参类型得到提示
    
    # 注意
    # 类型错误并不会报错,只是提示作用
    # 最低 Python 版本为 3.5
    
    def register(name:str,age:int,hobbbies:tuple)->int:
       print(name)
       print(age)
       print(hobbbies)
       return 111
    
    register(1,'aaa',[1,])
    res=register('yu',18,('play','music'))
    
  • 相关阅读:
    《当程序员的那些狗日日子》(二十六)再下决心
    创建本地数据库
    Servlet的开发和使用
    tomcat7不能创建解决办法
    windows系统纯净版下载
    Linux打包命令
    Filter的开发和使用
    C语言地址传递和值传递简析
    Servlet生命周期
    Java EE架构
  • 原文地址:https://www.cnblogs.com/yding/p/12594644.html
Copyright © 2011-2022 走看看