递归+栈和队列+目录遍历+模块(time模块+datetime模块+calendar模块+os模块)

一、递归

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值