一:列表生成式和生成器表达式
1.1.用传统的方法创建一个列表
l=[] for i in range(100): l.append('egg%s' %i) print(l)
用传统的方法创建列表需要至少三行的代码,采用列表生成式:
l=['egg%s' %i for i in range(100)]
一行代码就已经搞定了列表的创建,大大简化了我们写代码的工作量,而且还可以在生成式里面添加一个判断。
l=['egg%s' %i for i in range(1000) if i > 10]
这样,列表生成的就是大于10的数字了。
1.2.生成器表达式
生成器的优势在于可以取得很多的数字,但是他并不像列表那样把所有的字符保存下来,提取时如果列表内含有的元素过多的话会爆掉内存。于是生成器就被需要了,把列表生成式的中括号换成小括号,得到的就是一个生成器,生成器又是迭代器,使用__next__方法一个个的取值,对内存占用极小。
l=('egg%s' %i for i in range(1000) if i > 10)#生成器表达式 print(next(l))#取值 print(next(l)) print(next(l))
二:模块
2.1.什么是模块?
模块就是一种系统功能的集合体,在python中一个.py文件就是一个模块,如modul.py文件,modul就是文件名。
2.2:使用模块
导入模块方法:
1:import 模块名:调用模块内的方法必须加上前缀,调用不会出错。
2:from...import...:调用模块内的方法不用加上前缀,但是有可能会和执行文件中的名字起冲突。
首次导入模块发生的三件事:
1、创建一个模块的名称空间。
2、执行模块对应文件,将产生的名字存放于1中的名称空间。
3、在当前执行文件中拿到一个模块名,该模块名指向1的名称空间。
注意:1、首次导入之后重复导入,后续的导入会直接引用第一次的导入结果,不会再次执行文件内容。
2、模块中功能的执行始终以模块自己的名称空间为准。
为模块起别名
模块的名称一般来说是描述性的,有的时候会很长,如果每次调用都要在前面加上前缀的话,非常不方便,这个时候我们就可以给模块在导入时另外取一个简洁的名字。另外一种场景则是导入多个模块,其执行内容一致,但是需要判断条件来执行,这时就可以把两个导入的模块另外取名,然后判断,做具体调用运算。
engine=input('>>: ').strip() if engine == 'mysql': import mysql as db elif engine == 'oracle': import oracle as db db.parse() if__name__ =="__main__" #如果文件是直接被执行 # 在文件被直接执行的情况下等于__main__ # 在文件被导入的情况下,等于文件名 # if __name__ == "__main__": # print("文件被当做脚本执行了") # else: # print("文件被导入啦")
常常可以在模块文件下看到这一行代码,这个代码的意思是,如果文件是直接被执行,那么会调用定义的函数如果是被当做模块导入的话,只会获取定义的名字,不会执行函数
三:模块中名字的查找顺序
内存中已经加载的名字》内置的名字》sys.path路径中包含的模块。
强调:sys.path的第一个路径是当前执行文件所在的文件夹