Python模块相关内容

模块基础内容
模块的概念:为了易维护性,把很多函数分组,分别放在不同文件里,在Python中一个.py文件就可以被称为一个模块(module),一般一个模块内函数的功能相近或者处理的内容有很强相关性。

使用模块的好处:1.代码的可维护性 2.一个模块编写完毕可以被其他地方引用 3.使用模块可以避免函数名和变量名冲突的问题,相同名字的函数和变量完全可以分别存在不同的模块中

模块的种类:1.Python标准库 2.第三方模块 3.应用程序自定义模块

pip命令可以用来安装第三方模块

调用模块的实现
模块内的函数有两种调用方式:1.import 模块名 在调用时 模块名.函数名 2.from 模块名 import 函数名

使用 from 模块名 import * 语句可以得到模块内所有的函数,即相当于没一个函数都被import了。这种方法一般不推荐,因为使用者通常不清楚模块内到底存在多少变量,会导致变量名覆盖的问题。

在import之后,被import的模块的所有代码就都可以使用了,注意import不单会将模块内的函数加载到内存,还会将模块内的代码全部执行一遍,所以通常不在模块内写入执行语句。即import语句相当于将被import模块的内容执行了一次(from 模块名 import 函数名 也会执行模块内全部代码)。

import time

print(time.time())
from time import time

print(time())

一个自定义模块的例子:

#需求:科学计算
#在执行文件的同目录下有cal.py文件:
def add(x, y): #此处若想实现多个数字计算则将参数设置为*args 然后for循环args这个元祖,将每一个数字相加
    return x + y


def sub(x, y):
    return x - y
    
#执行文件bin(通常执行文件均命名为bin,即bin文件代表着程序入口):
import cal #如果在cal.py内加入执行语句如print("ok"),则在调用cal模块时就会执行print("ok")语句

print(cal.add(1, 2))
print(cal.sub(1, 2))

package和module
package内可以放入多个module,通常都是功能相近或者关联性比较强的module。package和普通文件夹的区别是有没有_ init_.py文件。调用package内的module需要使用from package名 import module名 的语句,如果需要调用的module在多个子package下需要用点表示package的嵌套关系。
使用package的好处是1.会让程序有更强的可读性 2.使用包无需担心module重名的问题

#在执行文件(执行文件名字为bin)目录下有my_module包,在my_module包内有my_module1包,在my_module1包内有module.py文件
#module.py:
def add(*args):
	ret = 0
	for i in args:
		ret += i
	return ret

#bin.py:
from my_module.my_module1 import module

print(module.add(1,2,2,3,4))

注意
在执行文件目录下有包1,包1内有包2,包2内有包3,包3内有模块1的情况下,执行from 模块1.模块2 import 模块3的命令相当于执行模块3内的_ init__文件。在这种import方式下想调用到模块1需要在模块3的 _init__文件中写入from . import 模块1 命令,再通过 包3.模块1.函数名 的方式调用该模块。

import或者from语句实现的原理
import或者from语句会在sys.path内按照顺序寻找被调用的module或者package
而被执行文件的路径会被加入sys.path(变为sys.path列表的第一个元素),所以如果module或者package和执行文件在同一目录下则可以直接使用import或者from语句,如果解释其在第一个路径内没有找到被调用module就会依次在后面的路径寻找,这也侧面说明了自定义module尽量不要与标准库中的module重名,否则解释器在第一个路径(执行文件目录)内已经找到了被调用module则不会在标准库路径下寻找。
如果想调用其他位置的自定义module可以考虑使用append语句将需要调用的module的路径加入sys.path中。

#显示sys.path
import sys

print(sys.path)

if _ name_ == “_ main_” 的意义
_ name__只有在执行文件中被赋值为 main_,只要不在执行文件中_ _name__被赋值为模块名

#在执行文件(bin.py)目录下有package名字为moudle,其中有模块cal.py
#cal.py:
def add(*args):
    ret = 0
    for i in args:
        ret += i
    return ret


print(__name__)

#bin.py:
from web1 import cal

print(cal.add(1, 2, 3, 4, 5))
print(__name__)

if _ name_ == "_ main_"作用:
1.将部分代码写在某文件的if _ name_ == "_ main_"下是为了保证这段代码在该文件被调用时不执行,只有在直接运行该文件的时候才执行,所以if _ name_ == "_ main_"语句多数用在模块功能测试时。
2.写在执行文件(bin.py)文件内的if _ name_ == "_ main_"下写代码是为了保证该执行文件中的这段代码无法被其他文件调用,如果想在执行文件中留出接口,可以在if _ name_ == "_ main_"语句之外写出想要被调用的功能函数。


模块的调用
time模块、sys模块等不是.py文件,他们是c语言实现的内置在python解释器中的模块,这一类模块有最高的优先级,即无论在什么路径,无论执行文件目录下有没有time.py或者sys.py文件,import time和import sys语句永远加载内置 time、sys模块。

调用路径
多数时候,模块和执行文件不在同一目录下,且模块所在的package也和执行文件不在同一目录下(执行文件一般单独开一个package)。此时,若要调用某模块,需要将该模块所在的绝对路径或模块所在的package的绝对路径加入到sys.path中。

import sys
import os

sys.path.append(os.path.abspath(__file__)) #注意这种方法改变环境变量是暂时的,退出程序后环境变量会变回原样

_ _file__变量
_ file__变量在pycharm终究是执行文件的绝对路径,但在终端中 file__变量就只是一个.py文件名。
一般package都和执行文件的package同级的,如果人工将路径append进sys.path中,相当于写死路径,会导致程序移到其他终端无法运行,所以一半利用os.path.dirname(
file_)的方法,相当于找出上一层的路径再append进环境变量。但是在终端中,_ file__变量仅仅是一个文件名,所以需要利用os.path.abspath( file_)方法获得执行文件的绝对路径。

import sys,os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#相当于向上找了两层目录,因为一般package和执行文件的package是同级的
sys.path.append(BASE_DIR)#此时package的路径就进入环境变量,通过from package名 import module名 的方式就可以导入想要的module
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值