模块介绍
1.生成器表达式
g=(i for i in range(10) if i > 5) print(g) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) #上述代码便是生成器表达式
小练习:利用生成器表达式,求出文件中的字符个数
with open('a.txt',mode='rt',encoding='utf-8') as f: res = sum(len(line) for line in f) print(res)
2.模块
2.1定义:模块就是一系列功能的集合体
2.2模块分为四个通用的类别:1.使用Python编写的.py文件
2.已被编译为共享库或DLL的C或C++扩展
3.把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹被称之为包)
4.使用C编写并链接到Python解释器的内置模块
2.3模块有三种来源:1.内置模块 2.第三方模块 3.自定义模块
2.4为何要用模块:1.使用内置或者第三方的模块的好处是:拿来主义,极大的提升开发效率
2.使用自定义的模块的好处是:将程序各部分组件公用的功能提取取出放到一个模块里,其他的组件通过导入的方式使用该模块,该模块即自定义模块,好处是可以减少代码冗余。
如何用模块:
1.用import首次导入模块会发生三件事:#1会产生一个模块的名称空间
#2执行模块(.py文件)的内容,将产生的名字丢到模块的名称空间里。
#3在当前执行文件中拿到一个名字spam,该名字指向模块的名称空间 看图
#模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 #test.py import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果. import spam import spam import spam ''' 执行结果: from the spam.py '''
2.用from xxx import aaa 首次导入模块会发生的三件事:#1会产生一个模块的名称空间
#2执行模块(.py文件)的内容,将产生的名字丢到模块的名称空里。
#3在当前执行文件中拿到功能函数或者变量的名字,该名字指向模块的名称空间中的功能函数或者变量的名字对应的内存地址 看图
3.模块的搜索路径
查找模块路径的优先级:内存中的模块>内置模块>sys.path(以执行文件为准)
sys.path值的是环境变量,它是以当前执行文件的文件夹为根目录,然后往下寻找。
4.区分python文件的两种用途
def f1(): print('f1') def f2(): print('f2') if __name__ == '__main__': f1() f2() # print(__name__) # 当文件被当作执行文件执行时__name__的值为__main__ # 当文件被当作模块导入时__name__的值为模块名mmm