1. 模块的定义
- 在Python中一个后缀名为.py的Python文件就是一个模块 (1)模块中可以定义函数、类等
- 模块也可以避免函数、类、变量等名称相冲突的问题。
- 模块不仅提高了代码的可维护性,同时还提高了代码的可重用性。
- 在给模块命名的时候要求全部使用小写字母,多个单词之间使用下划线进行分隔。
- 如果自定义模块名称与系统内置模块名称相同,那么在导入时会优先导入自定义的模块。
系统内置模块:
由开发人员编写好的模块,在安装 python解释器时一同安装到计算机
自定义模块:
一个以.py结尾的文件就是一个模块,新建python文件,实际上就是在新建模块
自定义模块的意义
- 规范代码,将功能相同的函数 、类等封装到一个模块中,让代码更易于阅读,
- 与系统内置模块相同,可以被其他模块调用,提高开发效率
2. 模块的导入
模块编写完成就可以被 其他模块进行调用,使用被调用模块中的功能
import 导方方式的语法结构:
import 模块名称 [as 别名]
from … import 导入方式的语法结构:
from 模块名称 import 变量/函数/类/*
导入demo
name='小安'
def info():
print(f'您好,我是{name}')
导入
import my_info
print(my_info.name)
my_info.info()
import my_info as a
print(a.name)
a.info()
from my_info import *
print(name)
info()
from my_info import name
print(name)
同时导入多个模块
# 同时导入多个模块
import math,time,random
如果导入模块中具有同名的变量和函数,后导入的会将之前导入的进行覆盖
my_info.py
name='小安'
def info():
print(f'您好,我是{name}')
my_info1.py
name='张三'
def info():
print(f'您好,我是{name}')
demo1.py
from my_info import *
from my_info1 import *
print(name)
info()
输出
张三
您好,我是张三
如果不想被覆盖
使用import来解决
import my_info
import my_info1
print(my_info.name)
my_info.info()
print('-'*30)
print(my_info1.name)
my_info1.info()
输出
小安
您好,我是小安
张三
您好,我是张三
封装StringUtils模块
string_utils.py
# 字符串反转
def reverse_string(string):
return string[::-1]
# 转成大写
def to_be_upper(string):
return string.upper()
# 转成小写
def to_be_lower(string):
return string.lower()
# 获取字符索引
def get_str_index(string, find_str):
return string.find(find_str)
# 获取字符出现的次数
def get_str_count(string, count_str):
return string.count(count_str)
demo1.py
import string_utils as su
str=su.to_be_upper('hello')
print(str)
print(su.get_str_count('hello world','hello'))
输出
HELLO
1
另外一种封装方式
class StringUtils:
# 字符串反转
@staticmethod
def reverse_string(string):
return string[::-1]
# 转成大写
@staticmethod
def to_be_upper(string):
return string.upper()
# 转成小写
@staticmethod
def to_be_lower(string):
return string.lower()
# 获取字符索引
@staticmethod
def get_str_index(string, find_str):
return string.find(find_str)
# 获取字符出现的次数
@staticmethod
def get_str_count(string, count_str):
return string.count(count_str)
demo1.py
from string_utils import StringUtils as su
str=su.to_be_upper('hello')
print(str)
print(su.get_str_count('hello world','hello'))
输出
HELLO
1
3. python中的包
- 包含__init__.py文件的文件夹(目录)
- 可以避免模块名称相冲突的问题
- 当包被导入时,
__init__.py
文件中的代码被自动执行,只执行一次
新建包
my_info.py
def info():
print("大家好,我是小安")
name='小安'
__init__.py
print('__init__.py文件,在导入时会被自动执行一次')
demo1.py
import admin.my_info as a
print(a.name)
a.info()
print('-'*30)
from admin import my_info as b
b.info()
print('-'*30)
from admin.my_info import info
info()
print('-'*30)
from admin.my_info import *
print(name)
输出
主程序运行
当模块在被导入到其他的模块中时,它的代码不希望被执行时,使用主程序运行去控制
if __name__== '__main__'
pass
module_a.py
print("hello world")
module_b.py
# 导入
import module_a
运行module_b.py,输出
hello world
在导入模块时,被导入的模块代码中会被执行一次,为了不执行这一次代码,可以使用主程序运行代码进行控制
module_a.py 修改为如下代码
# print("hello world")
# name='小安'
# print(name)
if __name__ == '__main__':
print("hello world")
name='小安'
print(name)
再次执行module_b.py,module_a中的代码将不会执行