zoukankan      html  css  js  c++  java
  • 模块

    . 上周内容回顾
    函数的总结
    装饰器
    标准装饰器
    def wrapper(f):
    def inner(*args, **kwargs):
    # 执行被装饰函数之前的操作
    ret = f(*args, **kwargs)
    # 执行被装饰函数之后的操作
    print(ret)
    return inner

    @wrapper
    def func(a, b):
    print(a, b)

    func(1, 2) # inner(1, 2)

    装饰器在不改变原函数的调用(结构)下,为原函数增加额外的功能

    遵循开放封闭的原则
    对代码拓展开放
    对代码修改封闭

    装饰器本质是闭包

    内置函数:
    l1 = [("a", 1), ("b", 4), ("c", 2)]
    min(l1, key=lambda x:x[1])
    max(l1, key=lambda x:x[1])

    zip(拉链方法)
    eval()
    exec()
    map:生成器表示式的循环模式
    filter:生成器表达式筛选模式
    reduce: 可以key
    divmod(10, 3)
    type()
    abs()
    sorted() 排序
    sum()
    reversed()
    callable()
    all()
    any()

    . 模块
    what:一个py文件就是一个模块,一个模块是一些相似功能的集合体
    why:
    1. 减少重复代码,提高开发效率
    2. 代码的组织结构更清晰,更有条理性

    模块的划分:
    1.内置模块。 time os sys
    2.扩展模块,也叫第三方模块,需要使用pip下载安装
    beautiful soup request gevent等
    itchat 与微信相关的模块
    注意要是问起使用过哪些内置模块或者扩展模块,一定要分清楚,不要搞混了
    3.自定义模块
    
    
    # 自定义模块
    
    # a.py
    print('from the tbjx.py')
    name = '太白金星'  # 全局变量
    def read1():
        print('tbjx模块:', name)
    
    def read2():
        print('tbjx模块')
        read1()
    
    def change():
        global name
        name = 'barry'
    
    # tbjx.py
    # import 的使用
    # 注意这与上面的三个函数不在同一个文件
    # import tbjx  # 引用模块相当于执行这个模块
    
    # 重复导入会直接引用内存中已经加载的结果
    
    # 模块被执行时发生了三件事:
    # 1. 创建一个以被导入模块的名字命名的名称空间
    # 2. 自动执行模块中的代码,即将模块中的所有内容加载到内存中
    # 3. 要想执行模块中的代码,必须通过模块名.的方式执行获取
    import tbjx
    
    print(tbjx.name)  # 太白金星
    
    tbjx.read1()  # tbjx模块:太白金星
    
    name = "asda"
    print(tbjx.name)  # 太白金星
    # 因为通过模块名.的方式就会执行模块中的代码
    
    def read1():
        print(666)
    tajx.change()  # 这个也是一样
    
    name = "abc"
    tbjx.change()
    print(name)  # abc
    # 为什么不是 barry? 原因是模块 tbjx 总的 change() 的 global 的使用只适用于该 tbjx 文件中对全局变量的改变
    # 而现在的 name = "abc" 是另一个文件中的变量,跟 change() 的没关系
    # 即 global 全局仅限于当前文件!
    
    # 这里要想到用 change() 里面内容,就必须在 change() 设置返回值 return
    # 然后再 print(tbjx.change())
    
    # 模块是导入进来使用的,不能修改,因为改了别人要是再用就会出问题
    
    
    
    # 模块改名
    # 1. 有的模块名字太长,可以改名,便于操作
    import abcdpythonuser as ab
    print(ab.age)
    ab.func()
    
    # 内置模块也可以改
    # import time
    # print(time.time())
    
    import time as t
    print(t.time())
    
    # 2. 便于代码的拓展和优化
    #mysql.py
    def sqlparse():
        print('from mysql sqlparse')
    
    #oracle.py
    def sqlparse():
        print('from oracle sqlparse')
    
    #test.py
    db_type=input('>>: ')
    if db_type == 'mysql':
        import mysql as db
    elif db_type == 'oracle':
        import oracle as db
    
    db.sqlparse()
    # 统一结构化设计
    # 引用多个模块
    # 官方推荐下面的写法
    import mysql
    import time
    import sys
    
    # from...import...
    # from tbjx import name,read1
    # 这里直接写明了,因此下面可以直接print这个变量及调用函数
    # print(name)
    # read1()
    
    # from...import... 与import...相比的优缺点
    # 优点:使用简单
    # 缺点:容易与本文件的变量、函数名发生冲突
    # 如果被导入的文件与导入的文件的变量重名,结果会受影响
    # 因此最好使用 import 模块
    
    name = "abc"
    from tbjx import name, read1
    print(name)  # 太白金星
    print(globals())  # barry
    # 这里导入的文件的变量 name 覆盖掉了前面 name = "abc" 的值
    
    # 如果下面这样,结果又不一样了
    from tbjx import name, read1
    name = "abc"
    print(name)  # abc
    # 由此看出,谁在下面打印的就是它对应的值
    
    # 不管是 import... 还是 from...import...
    # 都会把要导入的文件的所有内容加载进来
    
    # from tbjx import name,read1
    # 这行代码执行以下两点:
    # 1. 执行一遍tbjx的所有代码,加载到内存
    # 2. 将 name, read1() 实际引用过来的变量函数在本文件中复制一份
    #    可以通过 globals() 查看
    # 所有在文本中有两个内存地址
    
    from tbjx import name,read1, change
    name = "alex"
    change()
    print(name)  # alex
    # 注意还是和之前说的一样,global只适用于当前文件
    
    from tbjx import name,read1, change
    print(name)  # 太白金星
    name = "alex"
    print(name)  # alex
    
    from tbjx import name,read1, change
    change()
    print(name)  # 太白金星
    name = "alex"
    print(name)  # alex
    
    # 上面一开始导入的时候就将 name,read1,change复制到了现在这个文件的全局名称空间中
    # 因此上面这段相当于:
    from tbjx import name,read1, change
    name = "太白金星"
    change()
    # 这里只是把 tbjx 文件里的 name 变量改变了指向的值,跟本文件没有关系
    print(name)  # 太白金星
    name = "alex"
    # 这里是将本文件中的全局变量 name 指向的值由 太白金星 改为 alex
    print(name)  # alex
    # from...import...也可以改名
    from tbjx import read1 as r
    
    from...import name # 这里只是把 name 导入到本文件中
    from...import *  # 导入所有到本文件中
    # 一般不要使用这个,会与本文件的变量名一致时起冲突
    
    # import tbjx
    # 文件有两个作用:
    # 1. 作为脚本,直接运行
    # 2. 作为模块供别人使用
    # 3. __name__ == "__main__" 可以作为一个项目的启动文件作用
    
    print('from the tbjx.py')
    name = '太白金星'
    def read1():
        print('tbjx模块:', name)
    
    def read2():
        print('tbjx模块')
        read1()
    
    def change():
        global name
        name = 'barry'
    
    print(__name__)  # __main__  表示在本文件中运行
    # # 在别的文件中打印就是 这个文件名
    #
    if __name__ == "__main__":
        read2()
    # 这个的作用是不想让 tbjx 这个模块在别的文件被调用的时候不想让 read2() 被执行
    
    # 模块的搜索路径:
    import tbjx
    print(tbjx.name)  # 可执行
    
    import tbjx1
    print(tbjx1.name)  # 报错
    
    import time
    print(time)
    time.func()
    # 内存———>built-in 内置模块———>sys.path
    # 模块搜索路径的验证方法:
    
    import sys
    print(sys.path)  # 返回一个列表,该列表的第一个参数就是当前目录
    # ['G:\day12 视频以及笔记', 'G:\day12 视频以及笔记', 'D:\Python36\python36.zip', 'D:\Python36\DLLs', 'D:\Python36\lib', 'D:\Python36', 'D:\Python36\lib\site-packages', 'E:\PyCharm 2018.3.1\helpers\pycharm_matplotlib_backend']
  • 相关阅读:
    PHP中字符串和正则表达式的常用函数
    PHP基础语法
    vscode新手心得
    socket数据通讯
    PHP 登录类
    PHP Session 封装类
    php 邮箱验证函数
    PHP MySql 分页实例
    Bootstrap
    projact mail
  • 原文地址:https://www.cnblogs.com/shawnhuang/p/10233450.html
Copyright © 2011-2022 走看看