python学习笔记10

一、上堂回顾

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)

 

你可能感兴趣的:(python)