1.默写题目
1.简述可迭代对象和迭代器之间的区别和联系
""" 区别: a.可迭代对象:可以直接使用for循环遍历的对象,例如:list,tiple,dict,set,string,生成器 b.迭代器:可以使用for循环遍历,也可以使用next函数进行遍历,例如:生成器【直接使用()创建,函数和yield】 联系: a.可迭代对象不一定是迭代器,迭代器一定是可迭代对象 b.虽然list,tuple,dict,set,string都是可迭代对象,但不是迭代器,可以通过iter()将其的类型转换为迭代器 """
2.已知如下函数,使用装饰器给原函数增加新的功能,并调用原函数
""" def show(): print("abc") def wrapper(fun): def inner(*args,**kargs): fun() #添加新功能 return inner f = wrapper(show) f() """ def wrapper(fun): def inner(*args,**kargs): fun() #添加新功能 return inner @wrapper def show(): print("abc") show()
2.知识点回顾
变量的作用域
global和nonlocal:不同作用域的变量重名的情况下
全局变量和局部变量
可迭代对象和迭代器
装饰器
作用:给一个已有的函数添加新的功能,前提是不改变原有的函数
注意;参数
函数递归:
隐式的循环
特点:效率低
1.概念
相同点:线性表,存储数据
a.插入操作都是限定在表尾进行
b.栈和队列的管理模式是相同的
c.都可以通过顺序结构和链式结构实现
不同点:
栈:【Stack】,限定只能在表的一端进行插入和删除操作的线性表
队列:【Queue】,限定只能在表的一端进行插入,在表的另一端进行删除的线性表
a.删除数据的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行
b.应用场景不同,栈:表达式的转换和求值,函数的递归和调用【函数入栈和出栈】
队列:计算机系统中各种资源的管理
2.栈
特点:先进后出,后进先出【可以抽象为一个开头向上的容器,举例:羽毛球筒】
代码演示:
myStack = [] #压栈或者入栈【向栈中插入数据】:append:在栈的尾部添加数据 myStack.append(10) print(myStack) myStack.append(20) print(myStack) myStack.append(30) print(myStack) myStack.append(40) print(myStack) #出栈【从栈中取出数据,删除操作】;pop:在栈的尾部删除数据 myStack.pop() print(myStack) myStack.pop() print(myStack) myStack.pop() print(myStack) myStack.pop() print(myStack)
3.队列
特点:先进先出【可以抽象成一个水平放置的水管】
代码演示:
import collections #创建 queue = collections.deque([10,20]) print(queue) #入队【添加数据】:append:在表的末尾进行 queue.append(30) print(queue) queue.append(40) print(queue) queue.append(50) print(queue) #出队【删除数据】:popleft:在表的头部进行 queue.popleft() print(queue) queue.popleft() print(queue) queue.popleft() print(queue)
1.概念
包:初期理解为文件夹
包是一种管理Python文件【模块】命名冲突的形式,采用“点模块名称”
特点:不需要担心不同的文件或者模块之间命名冲突【主要是根据同名文件的不同路径】
注意:普通的文件夹【目录】不能值Python中真正意义上的包,需要在文件夹或者目录下出现一个init.py,前期该文件是空的,后期会添加一个配置数据,作用:只是告诉编译器该目录是个包
注意:包的命名:全小写
2.使用
代码演示:
#需求:在当前文件中调用aaa和bbb下面checkDemo01中show函数 #思路:告诉编译器:show函数的位置【路径】 #在python中,如果要在另外的文件中使用一个文件的数据,则采用导入的方式 #点语法:包1.包2.....模块名【相对路径】 #注意:import的作用:相当于将指定文件中的代码加载到内存中 import aaa.checkDemo01 import bbb.checkDemo01 #调用函数的时候,需要指明函数所在的位置【路径】 #格式:包1.包2.....模块名.函数名(参数列表) aaa.checkDemo01.show() bbb.checkDemo01.show() #show()
1.概述
1.1概念
封装思想
工具
为了解决代码难维护的问题,可以将很多相似的功能的函数进行分组,分别放到不同的包下,这样每个包下的内容较少,寻找不同的功能相对较快,提高工作效率
注意:其实,一个.py文件就是一个模块
一个标准的模块中包含的内容:变量,函数,类
1.2优点
a.提高代码的可维护性
b.提高了代码的复用性【当一个模块完成之后,可以在不同的位置使用】
c.引用系统模块和其他第三方的模块
d.避免变量,函数,类的命名冲突
2.系统常用的模块
2.1time时间模块
采用的标准:格林威治时间,世界标准时间
时间的表示形式:
a.时间戳
以整型或者浮点型表示的一个以秒为单位的时间间隔,这个事件的基础值是1970.1.1 00:00:00
b.元组格式
9个整型数据
c.格式化的时间字符串
%Y;年
%m:月
%d:日
%H:24小时制 %h:12小时制
%M:分
%S:秒
代码演示:
import time #1.time():返回当前时间戳,浮点型 c = time.time() print(c) #1533525111.4794018 #2.gmtime() 将时间戳转换为标准时间【元组形式】 g = time.gmtime(c) print(g) #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=3, tm_min=11, tm_sec=51, tm_wday=0, tm_yday=218, tm_isdst=0) #3.localtime() 将时间戳转换为本地时间【元组形式】 #注意:本地时间和世界标准时间相差8个小时 l = time.localtime(c) print(l) #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=11, tm_min=18, tm_sec=36, tm_wday=0, tm_yday=218, tm_isdst=0) #4.mktime() 将元组形式转换为时间戳 m = time.mktime(l) print(m) #1533525516.0 print(time.mktime((2018,8,6,11,16,53,0,218,0))) #1533525413.0 #5.asctime() 将时间元组表示形式转换为字符串【根据时间元组,生成一个人类可读时间】 a = time.asctime(l) print(a) #Mon Aug 6 11:33:33 2018 #6.ctime() 将时间戳转换为字符串 c1 = time.ctime(c) print(c1) #Mon Aug 6 11:35:30 2018 #7.strptime() 将时间格式化字符串转换为时间元组 time1 = "2018-8-6 10:30:30" #参数:需要被解析的时间字符串 格式化字符串 s1 = time.strptime(time1,"%Y-%m-%d %H:%M:%S") print(s1) #time.struct_time(tm_year=2018, tm_mon=8, tm_mday=6, tm_hour=10, tm_min=30, tm_sec=30, tm_wday=0, tm_yday=218, tm_isdst=-1) #8.strftime() 将时间元组转换为格式化字符串 #参数:格式化字符串 时间元组 s2 = time.strftime("%Y.%m.%d",l) print(s2) print("~~~~~~~~~") #9.休眠 #参数:秒数 #作用:将当前程序阻塞,在多线程中使用较多 time.sleep(2) print("~~~~~~~~~") #练习:已知字符串“2017-05-20”,输出“2017-05-23” time1 = "2017-05-20" #将时间字符串解析为时间时间元组 time2 = time.strptime(time1,"%Y-%m-%d") print(time2) #将时间元组转换为时间戳 time3 = time.mktime(time2) print(time3) #计算三天之后的日期的时间戳 time31 = time3 + 3 * 24 * 3600 #将时间戳转换为时间元组 time4 = time.localtime(time31) #将时间元组转换为时间字符串 time5 = time.strftime("%Y-%m-%d",time4) print(time5) #2017-05-23
2.2datetime日期模块
基于time模块的再次封装
代码演示:
import datetime #1.now() 获取当前时间 d1 = datetime.datetime.now() #包名.模块名.函数名 print(d1) #2018-08-06 14:04:02.682539 #2.datetime():获取指定时间 d2 = datetime.datetime(2018,8,6,14,4,2,68435) print(d2) #3.strftime() 格式化时间字符串 d3 = d1.strftime("%Y.%m.%d") print(d3) print(type(d3)) #4.strptime() # 参数: 字符串 格式字符串 d4 = datetime.datetime.strptime(d3,"%Y.%m.%d") print(d4) print(type(d4)) #5.时间相减,得到的是时间间隔 datetime1 = datetime.datetime(2018,8,6,14,0,0,0) datetime2 = datetime.datetime(2018,8,8,15,0,0,0) newTime = datetime2 - datetime1 print(newTime) #间隔天数 print(newTime.days) #将天数之外的时间转化为秒 print(newTime.seconds)
2.3calendar日历模块
作用:处理万年历
代码演示:
import calendar #返回指定年的某月 print(calendar.month(2018,8)) #返回一个二维列表,仍然是一个万年历 print(calendar.monthcalendar(2018,8)) #返回指定年的日历 print(calendar.calendar(2018)) #判断某年是否为闰年,返回的结果为布尔值 print(calendar.isleap(2010)) #返回两个年份之间的闰年总数 print(calendar.leapdays(2000,2020)) #返回的周的日期码 ,0【星期一】~6【星期日】 月份:1~12 print(calendar.weekday(2018,8,7))
2.4os系统模块
包含普通的操作文件或者文件夹功能
代码演示:
import os #一、属性 #获取操作系统的名称 nt---->Windows posix--->Linux,Unix,或者mac os print(os.name) #获取环境变量 print(os.environ) #dict print(os.environ.get("APPDATA")) #获取当前目录 print(os.curdir) #. #二、函数 #1.获取指定目录下所有的文件以及文件夹 #返回的结果为一个列表,列表中的元素是文件或者文件夹的名称的字符串 print(os.listdir(r"C:\Users\Administrator\Desktop\XA-Python1804\Day10")) #2.在指定的目录下创建目录 #os.mkdir("abc111") #相对路径 #os.mkdir(r"C:\Users\Administrator\Desktop\XA-Python1804\Day10\aaa") #绝对路径 #3.删除目录 #os.rmdir("abc111") #4.获取文件属性 print(os.stat("testDemo01.py")) #5.给文件或者文件夹重命名 #注意:在文件进行重命名之前,一定要确保文件处于关闭状态 #参数:old new #os.rename("abc111","python") #6.删除文件 #os.remove("aaa.py") #os.path #1.拼接路径 path1 = r"C:\Users\Administrator\Desktop\XA-Python1804" path2 = r"Day10\代码" print(os.path.join(path1,path2)) #C:\Users\Administrator\Desktop\XA-Python1804\Day10\代码 #print(path1 + path2) #C:\Users\Administrator\Desktop\XA-Python1804Day10\代码 #2.拆分,返回的结果为元组,默认情况下只拆分一级目录 path3 = r"C:\Users\Administrator\Desktop\XA-Python1804\Day10Code\testDemo01.py" print(os.path.split(path3)) #('C:\\Users\\Administrator\\Desktop\\XA-Python1804\\Day10', '代码') #获取扩展名,如果没有扩展名,则获取的是一个元组,元组中的第1个元素为空 print(os.path.splitext(path3)) #'C:\\Users\\Administrator\\Desktop\\XA-Python1804\\Day10Code\\testDemo01', '.py') #3.判断一个指定的路径是否是目录 print(os.path.isdir(path3)) #判断一个指定的路径是否是文件 print(os.path.isfile(path3)) #4.判断指定的路径是否存在 print(os.path.exists(path3)) #5.获取文件的大小[字节] print(os.path.getsize(path3)) #6.文件的目录 path4 = r"C:\Users\Administrator\Desktop\XA-Python1804\Day10Code" #dirname:父路径 basename:子路径 print(os.path.dirname(path4)) print(os.path.basename(path4))
练习:
import os #练习:获取指定目录下所有的.py或者.txt文件 """ 思路 a.判断指定目录是否存在 b.获取指定目录下所有的文件和文件夹 c.拼接路径 d.判断拼接之后的路径是否是文件 e.筛选出.py和.txt文件 """ def getFile(path): #a if os.path.exists(path): #b. fileList = os.listdir(path) #c #遍历列表 for fileName in fileList: filePath = os.path.join(path,fileName) #d if os.path.isfile(filePath): #e if fileName.endswith(".py") or fileName.endswith(".txt"): print(fileName) else: print(fileName,"不是文件") else: print("该路径不存在") getFile(r"C:\Users\Administrator\Desktop\XA-Python1804\Day10Code")
2.5目录遍历
a.递归遍历
#递归遍历目录 import os def getAll(path,treeShow): #1.获取指路径下所有的文件以及文件夹 fileList = os.listdir(path) #用来进行区分不同的层级关系 treeShow += "\t" #2.遍历列表 for fileName in fileList: #3.拼接路径 filePath = os.path.join(path,fileName) #4.判断拼接后的路径是否是目录,如果是,则继续上面的操作,C:\Users\Administrator\Desktop\如果不是,则打印文件名 if os.path.isdir(filePath): print(treeShow, "目录:", fileName) #递归 getAll(filePath,treeShow) else: print(treeShow,"文件:",fileName) getAll(r"C:\Users\Administrator\Desktop\XA-Python1804","")
b.栈模拟递归遍历
#栈模拟递归遍历目录【深度遍历】 import os #思路:将路径添加到栈中,然后又从栈中取出路径,判断,如果是目录,则再次添加到栈中 def getAll(path): #定义一个空栈 stack = [] #将初始的指定路径添加到栈中 stack.append(path) while len(stack) != 0: #从栈中取出路径 dirPath = stack.pop() #获取该目录下所有的内容【文件夹和文件】 fileList = os.listdir(dirPath) #遍历 for fileName in fileList: #拼接路径 filePath = os.path.join(dirPath,fileName) #判断是否是目录 if os.path.isdir(filePath): print("目录:", fileName) #如果是目录,则将路径添加到栈中 stack.append(filePath) else: print("文件:",fileName) getAll(r"C:\Users\Administrator\Desktop\XA-Python1804")
c.队列模拟递归遍历
#队列模拟递归遍历目录
#广度遍历
import os
import collections
def getAll(path):
#创建一个空的队列
queue = collections.deque()
#进队
queue.append(path)
while len(queue) != 0:
#出队数据
dirPath = queue.popleft()
#获取当前路径下所有的数据
fileList = os.listdir(dirPath)
#遍历列表
for fileName in fileList:
#拼接路径
filePath = os.path.join(dirPath,fileName)
#判断是否是目录
if os.path.isdir(filePath):
print("目录",fileName)
#将目录的路径添加到队列中
queue.append(filePath)
else:
print("文件:",fileName)