zoukankan      html  css  js  c++  java
  • 模块

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

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

    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压根没产生
  • 相关阅读:
    WIKI·常用数据库默认端口
    .Net·VS·三板斧解决断点无法命中的多种情况
    异常处理·EF·准备命令定义时发生错误。有关详细信息,请参阅内部异常
    H.264的三种开源编码器比较
    Color Basics
    重建Windows 7的图标缓存
    Prebuilt binaries of PCL (point cloud library) for Linux
    清除ubuntu内核列表中的旧内核
    H.264开源解码器评测
    MATLAB中设置figure的边框
  • 原文地址:https://www.cnblogs.com/wangtenghui/p/10673317.html
Copyright © 2011-2022 走看看