函数回调:提前写出函数的调用,在考虑函数体的实现
怎样提前写出函数的调用:再另一个函数中写出函数的调用
再去考虑函数体的实现:根据实际的需求
def my_sleep(sec): inport tinme current_time = time.time() while time.time() - current_time < sec: pass 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 # 没有外界具体操作下载结果的功能代码,就将下载结果直接返回 # res = download() # print(res) 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) # 补充: # 自定义sleep # def my_sleep(sec): # import time # current_time = time.time() # while time.time() - current_time < sec: # pass # print(000)
模块的四种存在方式:
1.使用python编写的.py文件(任何一个py文件都可以作为模块)
2.包:一堆py文件的集合体
3.使用C编写并连接到python解释器的内置模块
4.已被编译为共享库或DLL的C或C++拓展
模块:一系列功能的集合体
使用模块:在使用该模块功能的文件中导入模块,通过import关键字导入模块名
aaaaa = module import module a = 888 module.b() module.c() print(aaaaa.a) print(a) # 注: # 1.每一个文件都会产生自己的全局名称空间,且相互不影响 # 2.多次导入,只会编译执行模块一次,将其加载到内存,之后的都是直接对名字的引用
起别名:
num = 20 print(num) # 在任何地方都可以导入模块 # def fn(): # global m3 # import m3 # 就是普通的名字,只是该名字执行的是一个py文件(全局名称空间) # print('>>>', m3.num) # fn() # print(m3.num) # 通过as关键字可以给模块起别名: 模块名一旦起别名,原模块名就不能再使用 # 1.可以简化模块名字 import mmmmmmmmmmmmmmmmmm3 as my_m3 print(my_m3.num) # 2.可以统一功能 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 m3, m4 # import m3 # import m4 # 在import后的名字才会在该文件的名称空间中产生 # from m4 import a, b, _c # 指名道姓的可以导入_开头的名字 # 通过*导入: 可以将导入模块中的(除了以_开头的)名字一并导入 from m4 import * # 通常不建议导入*,当需要使用模块中绝大部分名字时,才考虑导入* print(a) a() # 两个py文件中的名字a都合理存在, # 但import后的名字a和a=20,在一个名称空间中,只会保留最后一次值 a = 20 # a() b() print(a) # _c() print(_c) # print(c)
from导入起别名
# 一旦起别名,原名字就不能再用 from m5 import aaaaa as a, bbbbb as b, ccccc as c print(a) print(b) print(c) 自执行文件与模块的区别 # print("m6: 我被导入执行的") # __name__: # 1.在py文件作为模块被使用时,__name__为模块名 # 2.在py文件自执行时,__name__为字符串 '__main__' # print(__name__) print("共有逻辑") if __name__ == '__main__': # 所有自执行的逻辑 print("m6: 我是自执行的") a = 10 # 产生的是全局的名字 else: # 所有模块的逻辑 print("m6: 我被导入执行的") # print(a) # 走else就不可能走if,所以a压根没产生