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'))
原文地址:https://www.cnblogs.com/yding/p/12594644.html