一、列表生成式与生成表达式
1、列表生成式(数据量小)
要求:在列表内造100个元素
示例:
1 l=[] 2 for i in range(100): 3 l.append('egg%s'%i) 4 print(l) 5 6 #可简化如下格式: 7 l=['egg%s'%i for i in range(100)] 8 print(l)
1.2、常用列表生成式
示例:
l=['egg%s'%i for i in range(100) if i > 10]
print(l)
注:此处不能写else,因为无法判断else输入for 还是 if
2、生成器表达式(数据量大)
l=('egg%s'%i for i in range(100) if i > 10) #1. res=l.__iter__() print(res.__next__()) print(res.__next__()) #2. print(next(l)) print(next(l)) #3. for i in l: print(i)
3、练习题
3.1、把列表内元素都变成大写
names=['egon','alex','wupeiqi','yuanhao','lxx_sb'] names=[i.upper() for i in names] print(names)
3.2、把结尾带sb的过滤掉
names=['egon','alex','wupeiqi','yuanhao','lxx_sb'] names=[i for i in names if not i.endswith('sb')] print(names)
3.3、保存剩下的名字的长度
names=['egon','alex','wupeiqi','yuanhao','lxx_sb'] names=[len(i) for i in names ] print(names)
3.4、求a.txt中最长的行的长度,需要使用max函数
a.txt文件内容如下:
sdfsdfsdgffsdgfdshfdgfh 12231321311321 132132 321 321 321 32 sdaflkjsdlkfs sdflkjsdlkfjlsdjf sdlkfjlsddjflk
1.
with open('a.txt','r',encoding='utf-8')as f: nums=[len(line) for line in f] print(nums) print(max(nums))
2.
with open('a.txt','r',encoding='utf-8')as f: nums=(len(line) for line in f) # print(nums)#内存地址 # print(next(nums))#取出一个值 # print(max(nums))#取出最大值 print(max(len(line) for line in f)) #取出最大值
二、模块
1、什么是模块?
模块就是系统功能的结合体,在python中一个py文件就是一个模块,比如module.py其中模块名是module。
2、使用模块
2.1、import导入模块
首次导入模块发生三件事:
1、创建一个模块的名称空间
2、执行模块对应的文件,将产生的名字存放于1中的名称空间
提示:from ... import ... 与import 前两件事是一模一样
3、在当前执行文件中拿到一个模块名,该模块名指向1的名称空间
执行:
import time import time import time
time.sleep(2)
强调:之后的导入会直接引用第一次导入的结果,不会重复执行文件
模块中功能的执行始终以模块自己的名称空间为准
3、为模块起别名
import time as sm sm.sleep(2) import time as mysql mysql.sleep(4)
功能升级示例:
如果两个模块有类似功能,用户可以选择执行
engine=input('>>:').strip() if engine == 'sm': import sm as db elif engine == 'mysql': import mysql as db #执行db模块中的函数:db.xxx(),输入什么调什么功能
4、一行导入多个模块
不推荐使用
import time , requests , _mysql
推荐成多行
import time import requests import json
5、模块的使用之from ... import ...
首次导入模块发生三件事:
1、创建一个模块的名称空间;
2、执行模块对应的文件,将产生的名字存放于1中名称空间
提示:from ... import ... 与import 前两件是一模一样
3、在当前名称空间中直接拿到模块中的名字,可以直接使用,不用加任何前缀
from ... import...名字,拿到的名字可以不加前缀直接使用,使用起来更加方便,
但问题是容易与当前执行文件中相同的名字冲突
注意:同import,执行模块中的功能,始终以模块的名称空间为准
6、起别名
from requests import get as m print(m)
可以在一行导入多个,'*'代表所有,如果在模块中存在__all__=['get',....],那么'*'代表列表内的一些功能
from requests import *
7、模块的设计者__name__的使用
spam.py文件内容:
# -*- coding:utf-8 -*- #spam.py print('from the spam.py') __all__=['money','read1']#from ... import * money=1000 def read1(): print('spam模块:',money) def read2(): print('spam模块') read1() def change(): global money money=0 # print(__name__) #__name__的值 #1、在文件被直接执行的情况下,等于'__main__' #2、在文件被导入的情况下,等于模块名 if __name__ == '__main__': # print('文件被当做脚本执行了') read1() else: print('文件被导入了')
8、模块的搜索路径
import sys print(sys.path)
查看内存中被导入的模块
import sys print(sys.modules)
获取到文件路径列表:
['D:\\mypython\\projects\\函数\\day14', 'D:\\mypython',
'D:\\Python\\Python36\\python36.zip', 'D:\\Python\\Python36\\DLLs',
'D:\\Python\\Python36\\lib', 'D:\\Python\\Python36',
'D:\\Python\\Python36\\lib\\site-packages']
第一条路径是:此文件的执行路径
可以看做python文件
因此模块的查找顺序是:
1、 内存中已经加载的模块
2、 内置模块
3、 sys.path路径中包含的模块
import sys sys.path.append(r'D:\mypython\projects\函数\day14') import spam read1()
强调:sys.path的第一路径就是当前执行文件所在的文件夹