模块

函数回调:提前写出函数的调用,在考虑函数体的实现

怎样提前写出函数的调用:再另一个函数中写出函数的调用
再去考虑函数体的实现:根据实际的需求

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压根没产生

 

posted @ 2019-04-09 21:56  为此努力  阅读(143)  评论(0编辑  收藏  举报