标签:自定义 用途 需要 python print 下划线 写法 内置模块 情况下
定义:一个模块就是一个py文件。这个模块存储很多相似的功能,相似的函数的集合体.
模块的分类:
import
第一次导入模块执行的三件事
被导入模块有独立的名称空间
坑:通过tbjx.的方式引用此模块的名字时,一定一定是从此模块中寻找.
通过import 引用模块 他有自己的独立名称空间,与当前执行文件没有关系.
name = '李业'
print(tbjx.name)
def read1():
print('in 02 模块import')
tbjx.read1()
好处可以将很长的模块名改成很短,方便使用.
import tbjx as t
t.read1()
有利于代码的扩展和优化。
#mysql.py
def sqlparse():
print('from mysql sqlparse')
#oracle.py
def sqlparse():
print('from oracle sqlparse')
#test.py
db_type=input('>>: ')
if db_type == 'mysql':
import mysql as db
elif db_type == 'oracle':
import oracle as db
db.sqlparse()
在一个文件中,导入多个模块,推荐写法是一个一个导入。
import os,sys,json # 这样写可以但是不推荐
推荐写法
import os
import sys
import json
from ... import ... 的使用示例。
from tbjx import name, read1
print(name)
read1()
'''
执行结果:
from the tbjx.py
太白金星
tbjx模块: 太白金星
?
'''
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:tbjx.
from...import...的方式有好处也有坏处
? 好处:使用起来方便了
? 坏处:容易与当前执行文件中的名字冲突
示例演示:
执行文件有与模块同名的变量或者函数名,会有覆盖效果。
name = 'oldboy'
from tbjx import name, read1, read2
print(name)
'''
执行结果:
太白金星
'''
----------------------------------------
from tbjx import name, read1, read2
name = 'oldboy'
print(name)
?
'''
执行结果:
oldboy
?
'''
----------------------------------------
def read1():
print(666)
from tbjx import name, read1, read2
read1()
?
'''
执行结果:
tbjx模块: 太白金星
'''
----------------------------------------
?
from tbjx import name, read1, read2
def read1():
print(666)
read1()
?
'''
执行结果:
tbjx模块: 666
'''
当前位置直接使用read1和read2就好了,执行时,仍然以tbjx.py文件全局名称空间
#测试一:导入的函数read1,执行时仍然回到tbjx.py中寻找全局变量 'alex'
#test.py
from tbjx import read1
name = 'alex'
read1()
'''
执行结果:
from the spam.py
spam->read1->name = '太白金星'
'''
?
#测试二:导入的函数read2,执行时需要调用read1(),仍然回到tbjx.py中找read1()
#test.py
from tbjx import read2
def read1():
print('==========')
read2()
?
'''
执行结果:
from the tbjx.py
tbjx->read2 calling read
tbjx->read1->tbjx 'barry'
'''
4.3.3 也支持as
通过这种方式引用模块也可以对模块进行改名。
from tbjx import read1 as read
read()
from tbjx import read1,read2,name
from spam import * 把tbjx中所有的不是以下划线(_)开头的名字都导入到当前位置
? 大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
可以使用all来控制*(用来发布新版本),在tbjx.py中新增一行
__all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
编写好的一个python文件可以有两种用途:
一:脚本,一个文件就是整个程序,用来被执行(比如你之前写的模拟博客园登录那个作业等)
二:模块,文件中存放着一堆功能,用来被导入使用
?
python为我们内置了全局变量__name__,
当文件被当做脚本执行时:name 等于‘main‘
当文件被当做模块导入时:__name__等于模块名
?
#作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)
if __name__ == '__main__':![img]
print('from the tbjx.py')
__all__ = ['name', 'read1',]
name = '太白金星'
def read1():
print('tbjx模块:',name)
def read2():
print('tbjx模块')
read1()
def change():
global name
name = 'barry'
if __name__ == '__main__':
# 在模块文件中测试read1()函数
# 此模块被导入时 __name__ == tbjx 所以不执行
read1()
四、模块的搜索路径
寻找模块的路径: 内存 ----> 内置模块 ---> sys.path中找
只要这三个地方:内存 内置模块 sys.path可以找到这个引用的模块的路径,这个模块就可以直接引用到
手动添加路径,来引用其他模块
? sys.path.append(r‘D:\s23\day15‘)
标签:自定义 用途 需要 python print 下划线 写法 内置模块 情况下
原文地址:https://www.cnblogs.com/cuixiaoying/p/11104814.html