python全栈开发- day14列表推导式、生成器表达式、模块基础
一、列表推导式
#1、示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2、优点:方便,改变了编程习惯,
二、 生成器表达式
#1、把列表推导式的[]换成()就是生成器表达式 #2、示例:生一筐鸡蛋变成给你一只老母鸡,用的时候就下蛋,这也是生成器的特性 chicken=('鸡蛋%s' %i for i in range(5)) print(chicken) <generator object <genexpr> at 0x10143f200> next(chicken) #'鸡蛋0' list(chicken) #因chicken可迭代,因而可以转成列表 #['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4',] #3、优点:省内存,一次只产生一个值在内存中,主要应用数据量大
三、 模块介绍
1、什么是模块?
常见的场景:
一个模块就是一个包含了一组功能的集合体,比如spam.py(任意的名字,但是前提是不要和内置函数一样),
模块名为spam,可以通过import spam使用。
在python中,模块的使用方式都是一样的,但其实细说的话,模块可以分为四个通用类别:
1、使用python编写的.py文件
2、已被编译为共享库或DLL的C或C++扩展
3、把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
4、使用C编写并链接到python解释器的内置模块
2、为何要使用模块?
1、从文件级别组织程序,更方便管理
2、拿来主义,提升开发效率
四、使用模块之import
1、import的使用
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行
import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,
python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句)
2、在第一次导入模块时会做三件事,重复导入会直接引用内存中已经加载好的结果
1、为源文件创建新的名称空间
2、执行模块对应文件,将产生的名字存放于1中的名称空间
3、在当前执行文件中拿到一个模块名,该模块名指向1的名称空间
3、被导入模块有独立的名称空间
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,
这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
4、为模块名起别名
为已经导入的模块起别名的方式对编写可扩展的代码很有用,在被导入函数后加as再加上新起的别名
五、 使用模块之from ... import...
1、from...import...的使用
from 模块名字 import 具体的函数名,或者变量名字
2、from...import 与import的对比
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀:spam.
from...import...的方式有好处也有坏处
好处:使用起来方便了
坏处:容易与当前执行文件中的名字冲突
3、也支持as,一行导入多个名字跟上一样
4、from...import *
#from 模块名字 import * 把模块中所有的不是以下划线(_)开头的名字都导入到当前位置
#大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
可以使用__all__来控制*(用来发布新版本)
__all__=[常用的函数名] #你自己的模块方法,想规定别人导入多少,就可以导入多少
六、 py文件区分两种用途:模块与脚本
编写好的一个python文件可以有两种用途:
一:脚本,一个文件就是整个程序,用来被执行
二:模块,文件中存放着一堆功能,用来被导入使用
python为我们内置了全局变量__name__,
当文件被当做脚本执行时:__name__ 等于'__main__'
当文件被当做模块导入时:__name__等于模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__':
七、模块搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
官网解释:
#官网链接:https://docs.python.org/3/tutorial/modules.html#the-module-search-path 搜索路径: 当模块被导入时 解释器首先会从内建模块中寻找该名字 找不到,则去sys.path中找该名字 sys.path从以下位置初始化 1 执行文件所在的当前目录 2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样) 3 依赖安装时默认指定的 注意:在支持软连接的文件系统中,执行脚本所在的目录是在软连接之后被计算的,换句话说,包含软连接的目录不会被添加到模块的搜索路径中 在初始化后,我们也可以在python程序中修改sys.path,执行文件所在的路径默认是sys.path的第一个目录,在所有标准库路径的前面。
这意味着,当前目录是优先于标准库目录的,需要强调的是:我们自定义的模块名不要跟python标准库的模块名重复。