一、递归
1.概念
递归函数:一个函数调用它本身
递归调用:
代码演示:
def a(): print("aaa") a() #a() #问题:如果只是单纯的调用函数自身,则会形成一个死循环【隐式循环】 #解决方案:在合适的时机将循环停止下来 """ 思路: 1.找到一个临界条件【临界值】 2.找到相邻两次循环之间的关系 3.总结成一个公式 """
2.使用
代码演示:
#需求:报数,输出数列中对应的数 """ 1 2 3 4 5 6 7 8 9 10 11.。。。 斐波那契数列:1,1,2,3,5,8,13,21,34,55,89,。。。。 规律: 1.要求任何一个位置上的值,第一个位置和第二个位置上的是必须死固定的,都是1【临界值】 2.第n个位置上的数:第 n - 1 位置上的数 + 第 n - 2 位置上的数 需求;报数5,求5 func(5)----->return 5 func(5) ---->func(4) + func(3) func(3) ---->func(2) + func(1) -----> 1+ 1 = 2 func(4)---->func(3) + func(2) ----->2 + 1 = 3 func(5)---->2 + 3 = 5 .... n 是整数,并且大于等于3 func(n) = func(n - 1) + func(n - 2) """ def func(n): print("n的值:",n) #临界值:控制隐式循环可以在合适的时机停止下来 if n == 1 or n == 2: return 1 else: #递归:函数自己调用自己 result = func(n - 1) + func(n - 2) return result print(func(8)) #练习:计算1~某个数之间所有整数的和,用递归实现 #正常循环求和 def fun(num): total = 0 n = 1 while n <= num: total += n n += 1 return total print(fun(100)) #递归 """ fun(5):求1~5之间所有整数的和 fun(5) = fun(4) + 5 fun(4) = fun(3) + 4 fun(3) = fun(2) + 3 .... fun(1) = 1 fun(n) = fun(n - 1) + n """ def fun(num): if num == 1: return 1 else: result = fun(num - 1) + num return result print(fun(100))
二、栈和队列
栈:Stack,是限定只能在表的一端进行插入和删除的线性表【抽象:开口向上的容器,特点:先进后出,后进先出】
队列:Queue,是限定在表的一端进行插入,在表的另一端进行删除的线性表【抽象:水平放置的水管,特点:先进先出,后进后出】
线性表:是一种线性结构,它是一个含有n多个节点的有序序列,存储数据【特点:存储的元素和数据的类型存在一对一的关系】
栈和队列的区别和联系
相同点:
a.都是线性结构
b.插入操作都是表的尾部进行的
c.都可以通过顺序结构和链式结构实现
不同点:
a.删除元素的位置不同,栈的删除操作在表的尾部进行,队列的删除操作在表的头部进行
b.应用场景不同:常见栈的操作;表达式的求值和转换,函数的实现和调用,深度遍历
常见队列的操作:计算机中各种资源的分配,广度遍历
三、目录遍历
1.os模块
os:系统的模块,主要用来操作系统上的一些功能,最常用的就是操作系统目录和文件
2.递归遍历目录
代码演示:
import os #1.递归 #C:\Users\Administrator\Desktop\SZ-Python1811 #需求:获取指定路径下所有的文件以及子文件 def getAll(path): #获取当前路径下所有内容的列表 fileList = os.listdir(path) #print(fileList) #遍历文件列表 for fileName in fileList: #和初始路径进行拼接 filePath = os.path.join(path,fileName) #print(filePath) #判断子路径是否是目录 if os.path.isdir(filePath): #说明子路径的子路径仍然是一个目录,则需要重复前面的操作【获取所有内容,拼接,判断】 #递归调用函数本身 getAll(filePath) else: if fileName.endswith(".py"): print("文件:", filePath) p = r"C:\Users\Administrator\Desktop\SZ-Python1811" getAll(p)
3.栈模拟递归遍历目录
深度遍历
代码演示:
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("目录:", filePath) #如果是目录,则将目录的路径添加到栈中,然后重复前面的操作【获取内容,遍历,判断】 stack.append(filePath) else: print("文件:",filePath) p = r"C:\Users\Administrator\Desktop\SZ-Python1811" getAll(p)
4.队列模拟递归遍历目录
广度遍历
代码演示:
import os import collections #3.队列模拟递归遍历 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("目录:", filePath) queue.append(filePath) else: print("文件:",filePath) p = r"C:\Users\Administrator\Desktop\SZ-Python1811" getAll(p)
四、模块
1.包
包:初期理解为文件夹【目录】 包是一种管理Python代码命名空间的工具 包区别于普通文件夹:包下有一个文件,命名为__init__.py,目前没有任何意义,只是为了标记当前文件夹并不是一个普通的文件夹,而是一个包 用法:点模块名称 一个.py文件就是一个模块
2.模块的概述
将功能相似的函数分组,分别放到不同的包中,提高代码的可维护性
优点:
a.提高代码的可维护性
b.提高了代码的复用性【当一个具有某些功能性的模块完成之后,可以被多个地方引用】
c.避免函数和变量命名冲突
3.系统模块
3.1time模块
UTC;格林威治时间,世界标准时间,在中国,UTC + 8
时间的表示形式:
a.时间戳【从1970.1.1 00:00:00到指定时间的秒数 】
b.元组形式【结构体】
c.格式化的字符串
掌握:时间三种不同形式之间的相互转换
代码演示:
import time #格式:time.函数() #1.获取时间戳,结果为一个浮点数,单位是秒 c = time.time() print(c) #2.获取时间的元组形式,【将时间戳转换为UTC时间】 时间戳------》元组 g = time.gmtime(c) print(g) #3.获取的是当地时间 时间戳------》元组 l = time.localtime(c) print(l) #time.struct_time(tm_year=2018, tm_mon=11, tm_mday=19, tm_hour=15, tm_min=6, tm_sec=9, tm_wday=0, tm_yday=323, tm_isdst=0) #4.将元组形式转换为时间戳 m = time.mktime(l) print(m) #5.将时间戳转换为字符串 #s1 = time.ctime(时间戳) s1 = time.ctime() print(s1) #Mon Nov 19 15:06:09 2018 #6.将时间元组转换为字符串 s2 = time.strftime("%Y-%m-%d %H:%M:%S",l) print(s2) #7.将时间字符串转换为元组 s3 = "2018-11-19 15:09:20" p = time.strptime(s3,"%Y-%m-%d %H:%M:%S") print(p) #8.休眠,单位为秒 print("aaaaaaaa") time.sleep(3) #当代码执行到该函数的时候,程序会阻塞, print("bbbbbbb")
练习:
import time #1.书写一个装饰器,计算一个函数运行的时间 #time() def wrapper(func): def inner(*args,**kargs): time1 = time.time() #调用原函数 func(*args,**kargs) time2 = time.time() result = time2 - time1 print("相差:%f秒" % (result)) return inner @wrapper def test(): #time.sleep(2) pass test() #2.已知的字符串,得到该字符串3天之后的字符串 #2018-6-17----->2018-6-20 str1 = "2018-6-17" #1.将时间字符串转换为元组形式 time1 = time.strptime(str1,"%Y-%m-%d") print(time1) #2.将时间元组转换为时间戳 time2 = time.mktime(time1) print(time2) #3.指定的时间戳加上3天的秒数 time2 += 3 * 24 * 3600 #4.将时间戳转换为元组 time3 = time.localtime(time2) print(time3) #5.将元组转换为字符串 time4 = time.strftime("%Y-%m-%d",time3) print(time4)
3.2datetime模块
datetime是基于time模块做了新的封装
代码演示:
import datetime #1.获取当前时间 d1 = datetime.datetime.now() print(d1) print(type(d1)) #2.获取指定时间 d2 = datetime.datetime(2018,11,19,15,30,23,895404) print(d2) #3.将时间对象转换为字符串 d3 = d1.strftime("%Y.%m.%d") print(d3) print(type(d3)) #4.将字符串转换为时间对象 d4 = datetime.datetime.strptime(d3,"%Y.%m.%d") print(d4) print(type(d4)) #5.时间的减法运算 d5 = datetime.datetime(2018,11,19,15,30,23,895404) d6 = datetime.datetime(2018,11,23,15,40,26,895404) d7 = d6 - d5 print(d7) print(d7.days) print(d7.seconds)
3.3calendar模块
代码演示:
import calendar print(calendar.month(2018,11)) print(calendar.calendar(2018)) #是否是闰年 print(calendar.isleap(2018)) print(calendar.leapdays(2000,2020))
3.4os模块
代码演示:
import os path = r"C:\Users\Administrator\Desktop\SZ-Python1811\Day10" print(path) print(type(path)) #1.获取一个指定目录所有的文件以及子目录,返回一个列表 fileList = os.listdir(path) print(fileList) #2.通过初始路径拼接子文件或者子目录的路径 #print(fileList[2]) #print(path + "\\" + fileList[2]) #参数:父路径 子路径 filePath = os.path.join(path,fileList[2]) print(filePath) # fileList = os.listdir(filePath) # print(fileList) #3.判断一个路径是否为目录 #isdir() :判断一个指定的路径是否是目录 #isfile():判断一个指定的路径是否是文件 print(os.path.isdir(path)) print(os.path.isfile(path))
import os #一、属性 #1.获取当前操作系统类型,nt---->windows,posix---->Linux,Unix,mac os print(os.name) #2.获取当前操作系统中所有的环境变量 print(os.environ) #3.获取当前目录 print(os.curdir) #current directory .;当前路径 ..:上一级路径 #二、函数 #1.以列表的形式返回一个指定目录下所有的内容 【掌握】 print(os.listdir(r"C:\Users\Administrator\Desktop)) #2.在指定目录下创建目录 #os.mkdir(r"C:\Users\Administrator\Desktop\aaa") #绝对路径:路径的拼接使用\ #os.mkdir("good/text") #相对路径:路径的拼接使用/ #3.删除目录 #os.rmdir("good/text") #4.获取属性 #print(os.stat("good")) #5.重命名文件 #参数:old new #os.rename("good","hello") #6.删除普通文件 #os.remove("file1.txt") #三、os.path #1.拼接路径 【掌握】 #参数:父路径 子路径 print(os.path.join(r"C:\Users\Administrator\Desktop","Python")) #2.拆分路径 #结果为一个元组 print(os.path.split(r"C:\Users\Administrator\Desktop\Python\123")) #3.获取的是文件的扩展名 print(os.path.splitext(r"C:\Users\Administrator\Desktop\Python\123\123\123")) #4.判断指定的路径是否是目录 【掌握】 #print(os.path.isdir("")) #print(os.path.isfile("")) #5.获取文件的大小,单位为字节【掌握】 print(os.path.getsize(r"C:\Users\Administrator\Desktop\Python\99999")) #6.文件的目录 path = r"C:\Users\Administrator\Deskt......." print(os.path.dirname(path)) print(os.path.basename(path)) #练习:封装函数,获取指定目录下的.py或者.txt文件 def func(path): #判断路径是否存在 if not os.path.exists(path): return #判断路径是否是目录 if not os.path.isdir(path): return #获取指定目录下的所有的内容 fileList = os.listdir(path) #遍历列表, for fileName in fileList: #拼接路径 filePath = os.path.join(path,fileName) #判断 if os.path.isfile(filePath): if fileName.endswith("py") or fileName.endswith("txt"): print("文件:",filePath) p = r"" func(p)