一、函数的补充
1、函数回调:
提前在另一个函数中写出函数的调用,再根据实际的需求去考虑函数体的实现
def download(fn=None):
print('开始下载')
my_sleep(1)
data = '下载得到的信息'
print('下载完成')
if fn: # 如果外界提供了回调函数的实现体,再去调用,否则就只完成默认下载的功能
res = fn(data) # 下载成功的回调函数,具体完成什么事之后决定
if res:
print('操作成功')
return True
print('操作失败')
return False
return data # 没有外界具体操作下载结果的功能代码,就将下载结果直接返回
def download_action(data):
print('往文件中写')
with open('1.txt', 'w', encoding='utf-8') as f:
f.write(data)
return True
return False res = download(download_action)
print(res)
def download_action1(data):
print(data)
return True
res = download(download_action1)
print(res) 二、模块:一系列功能的集合体
模块的四种存在方式:
1.使用python编写的.py文件(任何一个py文件都可以作为模块)
2.包:一堆py文件的集合体
3.使用C编写并链接到python解释器的内置模块
4.已被编译为共享库或DLL的C或C++扩展
1、使用模块:在要使用该模块功能的文件中导入模块,通过import关键字导入模块名 2、优点:从文件级别组织代码,是 同特性的功能能统一管理 可以使用系统或第三方模块(拿来主义),来提高开发效率 3、import导入模块:会编译执行成一个pyc文件,该pyc文件就是该模块的执行文件 再次导入该模块不会再执行,只会编译执行一次,将其加载到内存,之后的都是直接对名字的引用 该模块会产生自己的全局名称空间,且跟其他文件产生的全局名称空间互不影响 在任何地方都可以导入模块 4、from导入:from 模块名 import 需要导入的名字 可以指名道姓导入模块中所有想导入的名字 5、from 模块名 import *:导入的是模块中__all__这个列表 系统默认该列表不会收录_(下划线)开头的名字 可以自定义__all__列表来规定外界通过*可以导入的名字 不建议直接导入*,因为可读性差,且极易出现变量重名 6、起别名:通过as关键字可以给模块起别名 import 模块名 as 别名: 可以简化模块名字
import mmmmmmmmmmmmmmmmmm3 as my_m3
print(my_m3.num)
可以统一功能:
cmd = input('数据库选择 1:mysql | 2:oracle:')
if cmd == '1':
import mysql as db
# mysql.excuse()
else:
import oracle as db
# oracle.excuse()
db.excuse()
from 函数名 import 名字 as 别名 模块名一旦起别名,原模块名就不能再使用 三、 自执行与模块区别
__name__:
1.在py文件作为模块被使用时,__name__为模块名
2.在py文件自执行时,__name__为字符串 '__main__'
print("共有逻辑")
if __name__ == '__main__':
# 所有自执行的逻辑
print("m6: 我是自执行的")
a = 10 # 产生的是全局的名字
else:
# 所有模块的逻辑
print("m6: 我被导入执行的")
print(a) # 会报错:走else就不可能走if,所以a压根没产生