一、系统模块
1.time
import time """ 时间的表示方式: a.时间戳:以整型或者浮点型表示的以秒为单位的时间间隔,时间基础知识 1970.1.1的零点开始算起 b.时间元组:(year,month,day,hour,minutes,seconds,weekday,dayinyear,DST) c.时间字符串:%Y %m %d %H %M %S UTC:格林尼治天文时间,世界标准时间, 中国UTC+8 DST:夏令时,0表示正常格式,1表示夏令时格式,-1表示自定义时间格式 """ #1.获取当前时间的时间戳 ***** c = time.time() print(c) #2.获取世界标准时间的元组 g = time.gmtime() print(g) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=31, tm_hour=2, tm_min=28, tm_sec=34, tm_wday=1, tm_yday=91, tm_isdst=0) #3.获取当地时间的元组 l = time.localtime() print(l) #time.struct_time(tm_year=2020, tm_mon=3, tm_mday=31, tm_hour=10, tm_min=30, tm_sec=39 #4.将时间元组形式转化为时间戳 c2 = time.mktime(l) print(c2) #5.将时间元组形式转化为字符串形式,固定格式 s1 = time.asctime(l) print(s1,type(s1)) #6.将时间戳转化为时间字符串形式,固定格式 s2 = time.ctime(c) print(s2) #7.将时间元组形式转化为字符串形式,自定义格式 s3 = time.strftime("%Y-%m-%d %H:%M:%S",l) print(s3) #8.将字符串形式转化为时间元组 #注意:一定要注意时间字符串和时间格式的完全匹配 t1 = "2020-03-31 11:00:24" l2 = time.strptime(t1,"%Y-%m-%d %H:%M:%S") print(l2) #9.休眠 #当程序执行遇到sleep,则阻塞指定的时间【秒数】,当指定的时间到达,会自动解除阻塞,代码继续向下执行 #使用场景:多线程,多进程 ****** # time.sleep(5) # print("over") #10.返回当前的cpu时间,用来衡量不同程序的耗时,可以采用clock()或者time() # print(time.clock()) #练习:书写装饰器,统计不同函数的执行时间【面试题】 def wrapper(func): def inner(*args,**kwargs): start = time.time() #时间戳 func(*args,**kwargs) end = time.time() return round(end - start,4) #round() return inner @wrapper def show(): for i in range(1000000): pass print("fsg") print(show())
2.datetime
import datetime #1.获取当前时间 d1 = datetime.datetime.now() print(d1) print(type(d1)) #2.获取指定时间 d2 = datetime.datetime(2016,10,3,1,10,10,666562) print(d2) #3.将datetime.datetime类型转化为字符串 d1 = datetime.datetime.now() d3 = d1.strftime("%Y/%m/%d") print(d3,type(d3)) #4.将字符串转换为datetime.datetime s1 = "2020/03/31" d31 = datetime.datetime.strptime(s1,"%Y/%m/%d") print(d31,type(d31)) #5.进行减法运算 d51 = datetime.datetime(2016,10,3,1,10,10,666562) d52 = datetime.datetime(2016,10,3,1,10,17,666562) d53 = d52 - d51 print(d53) print(d53.days) print(d53.seconds) #print(d52 + d51) #TypeError
3.calandar
import calendar # print(calendar.month(2020,3)) # # print(calendar.calendar(2020)) #判断闰年 ***** print(calendar.isleap(2020)) print(calendar.isleap(2019)) print(calendar.firstweekday())
4.os
import os #建议:在实际项目开发中,尽量采用相对路径 #1.获取一个指定路径下所有的内容,返回一个列表 ****** #Windows路径:c:\Users\xlg\Desktop r0 = os.listdir(r"/Users/yangyang/Desktop/NZ2002") print(r0) #2.创建新目录 #注意:如果要创建多级别的目录,需要保证上级目录已经存在 #os.mkdir(r"test") #os.mkdir(r"test/aaa") #os.mkdir(r"bbb/ccc") #FileNotFoundError #3.删除目录 #注意:rmdir只能删除空目录 #os.rmdir(r"test") #OSError: [Errno 66] Directory not empty: 'test' #os.rmdir(r"test/aaa") # os.rmdir(r"test") #4.重命名 #os.rename(r"test",r"aaa") #5.删除普通文件 #os.remove(r"file1.txt") #os.path.xxx() #6.拼接路径 ****** p1 = r"/Users/yangyang/Desktop/NZ2002" #父路径 p2 = r"Day4" #子路径 r6 = os.path.join(p1,p2) print(r6) #注意:建议进行路径拼接的时候,尽量使用join,哪怕换系统了代码不需要改变【Python的特点:跨平台】 #print(p1 + "/" + p2) #7.拆分路径 #a,split():返回一个元组,(父路径,子路径) path1 = r"/Users/yangyang/Desktop/NZ2002/Day4" print(os.path.split(path1)) #('/Users/yangyang/Desktop/NZ2002', 'Day4') #b.splitext():返回一个元组,(完整路径,文件扩展名) ******** # 注意:如果路径是目录,则元素中的下标为1的元素为"" path1 = r"/Users/yangyang/Desktop/NZ2002/问题补充.md" print(os.path.splitext(path1)) #('/Users/yangyang/Desktop/NZ2002/问题补充', '.md') path1 = r"/Users/yangyang/Desktop/NZ2002/Day3" print(os.path.splitext(path1)) #('/Users/yangyang/Desktop/NZ2002/Day3', '') #8.判断路径是否存在 ******* print(os.path.exists(path1)) #9.判断路径是否是文件或者目录 ******* print(os.path.isfile(path1)) print(os.path.isdir(path1)) #10.获取文件的大小 ******* path1 = r"/Users/yangyang/Desktop/NZ2002/问题补充.md" print(os.path.getsize(path1)) print("=" * 30) #练习:封装函数,获取指定路径及其子路径下所有的py文件或者md文件 def get_file(path): """ 获取指定路径及其子路径下所有的py文件或者md文件 :param path: 指定路径 :return: None """ #判断路径是否存在 if not os.path.exists(path): print("路径不存在,无法获取") return #判断路径是否是文件 if os.path.isfile(path): print("路径是一个文件") return #代码执行到这里,说明路径是存在的,是一个文件夹【目录】 #获取指定目录下所有的内容 filelist = os.listdir(path) #遍历列表,获取其中的文件名称, for filename in filelist: #拼接 subpath = os.path.join(path,filename) #判断子路径是否是文件 if os.path.isdir(subpath): #文件夹,递归 get_file(subpath) else: #文件 end = os.path.splitext(subpath)[1] if end == ".md" or end == ".py": print("文件:",subpath) get_file(r"/Users/yangyang/Desktop/NZ2002")
5.sys
import sys #1.传递给Python脚本的命令行参数列表 print(sys.argv) """ 在控制台, python 7.系统模块-sys.py ------》['7.系统模块-sys.py'] python 7.系统模块-sys.py 10 34 45 -----》['7.系统模块-sys.py', '10', '34', '45'] """ #2.sys.stdout 标准输出 #sys.stdin 标准输入 print(34,45,5,file=sys.stdout) #3.退出的code为0则表示程序正常结束的 #sys.exit(-1) # while True: # pass
二、面向对象
1.概念
1.1面向对象的设计思想
面向对象是基于万物皆对象这个哲学观点
举例说明:
案例一:我想要吃大盘鸡
面向过程 面向对象
1.自己去买菜 1.委托一个会砍价的人帮忙去买菜
2.自己择菜 2.委托一个临时工帮忙择菜
3.自己做菜 3.委托一个厨师帮忙做菜
4.自己开始吃 4.自己开始吃
案例二:小明是一个电脑小白,想要配一台电脑,买完零件后需要运到家里,组装完成后打开电脑玩游戏z
面向过程 面向对象
1.小明补充电脑知识 1.委托一个懂电脑的朋友(老王)去帮忙买零件
2.小明去买零件 2.委托一个能跑腿的人去买零件
3.小明把零件带回家里 3.委托一个会组装电脑的人帮小明组装电脑
4.小明组装电脑 4.小明自己打开电脑,开始玩游戏
5.小明开机玩电脑
案例三:一辆白色的奥迪Q5在京藏高速上行驶
这里的奥迪Q5就是一个对象,京藏高速也是一个对象
1.2面向过程和面向对象的区别
面向过程
在生活案例中:
一种看待问题的思维方式,在思考问题的时候,着眼于问题是怎样一步一步解决的,然后亲力亲为的去解决问题
在程序中:
代码从上而下顺序执行
各模块之间的关系尽可能简单,在功能上相对独立
每一模块内部均是由顺序、选择和循环三种基本结构组成
其模块化实现的具体方法是使用子程序
程序流程在写程序时就已决定
面向对象
在生活案例中:
也是一种看待问题的思维方式,着眼于找到一个具有特殊功能的具体个体,然后委托这个个体去做某件事情,我们把这个个体就叫做对象,一切皆对象
是一种更符合人类思考习惯的思想【懒人思想】,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者
在程序中:
把数据及对数据的操作方法放在一起,作为一个相互依存的整体——对象
1》对同类对象抽象出其共性,形成类
2》类中的大多数数据,只能用本类的方法进行处理
3》类通过一个简单的外部接口与外界发生关系,对象与对象之间通过消息进行通信
4》程序流程由用户在使用中决定
5》使用面向对象进行开发,先要去找具有所需功能的对象,如果该对象不存在,那么创建一个具有该功能的对象
注意:面向对象只是一种思想,并不是一门编程语言
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个一次调用就可以了
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为
面向过程和面向对象的优缺点
面向过程:
优点:性能比面向对象高,开销比较大,比较消耗资源,比如单片机、嵌入式开发等一般采用面向过程开发,因为性能是最重要的因素
缺点:没有面向对象易维护,易复用,易扩展
面向对象:
优点:易维护,易复用,易扩展,由于面向对象有封装,继承,多态的特性,可以设计出低耦合的系统,使得系统更加灵活,更加易于维护
缺点:性能比面向过程低
2.类和对象
2.1概念
类:一个具有特殊功能的实体的集合【群体】,是抽象的
对象:在一个类中,一个具有特殊功能的实体,能够帮忙解决特定的问题【对象也被称为实例】,是具体的
两者之间的关系:类用于描述某一类对象的共同特征,而对象则是类的具体存在(包含关系)
问题:先有对象还是先有类?
【不好说,但是,一般在程序中,都是先定义类,然后通过类创建对象】
举例:
类 对象
人 张三、李四、王麻子、杨阳。。。
SuperHero 蝙蝠侠、蜘蛛侠、美国队长。。。
快递 顺丰、圆通、申通、韵达。。。
帮助理解:类也是一种数据类型,只不过是自定义的,跟所学过number,string,boolean等类似。用类实例化对象
2.2类的定义
格式:
class 类名(): 类体
说明:
a.Python中使用class关键字定义类【和Java类似】
b.类名只要是一个合法的标识符即可,但是要求:首字母必须大写,遵循驼峰命名法 ,KeyError,ValueError,NameError
标识符的名字用全小写多个单词用下划线连接
但是很多程序员和公司更倾向于使用大驼峰命名法【不同单词的首字母大写】
c.尽量使用单个或多个有意义的单词连接而成
d.通过缩进来体现类体的存在
e.类体一般包含两部分内容:对类的特征描述和行为描述
2.3类的设计
只需要关心3样东西
事物名称(类名):人(Person)
特征:身高(height)、年龄(age)—————》名词【变量】
行为:跑(run)、打架(fight)———————》动词【函数】
初期学习,通过提炼动名词进行类的提取
3.类中的成员的定义和访问
""" class 类名(): 函数1 函数2 ... """ """ 需求:小猫 吃东西 喝水 """ #1.类的定义 class Cat(): #成员函数 #3.self:当前对象【实例】,哪个对象调动成员函数,此时self代表的是哪个对象 """ 注意:self不需要手动传参,当对象调用函数的时候,系统会完成自动传参 """ def eat(self): print("eat:",id(self)) print("小猫在吃东西") def drink(self): print("drink:",id(self)) print("小猫在喝水") #2.创建对象【通过类创建对象】 #说明:创建对象实际是定义了一个当前类的变量 #语法:变量名 = 类名() tom = Cat() print("tom:",id(tom)) hello_kitty = Cat() print("hello_kitty:",id(hello_kitty)) """ 注意: a.一般情况下,通过一个类可以创建无数个对象 b.一般情况下,但凡使用 类名() 则表示创建了一个新的对象 """ #4.调用成员函数【动词】:行为 #注意:调用类中的成员函数,通过对象调用,语法:对象.函数名(实参列表) tom.eat() tom.drink() print("=" * 30) hello_kitty.eat() hello_kitty.drink() #5.访问成员变量【名词】:特征 #语法:对象.变量 c = Cat() #注意1:在Python中,可以给对象动态绑定属性【成员变量】,理论上可以绑定无数个属性 c.name = "小白" c.age = 4 c.kind = "英短" print(c.name,c.age,c.kind) c.weight = 0.23 print(c.weight) #AttributeError: 'Cat' object对象 has no attribute属性 'weight' #注意2:属性的动态绑定仅仅是给当前对象绑定,其他对象仍然没有指定的属性 d = Cat() #print(d.name) #AttributeError: 'Cat' object has no attribute 'name'
4.练习
"""
需求:开学了,王老师让小明,小花,小丽做自我介绍
介绍姓名,年龄,爱好,然后一段才艺展示
"""
"""
分析:
老师类:
特征:姓名
行为:让 xxx 做自我介绍
学生类:
特征:姓名,年龄,爱好
行为:做自我介绍,才艺展示
"""
#1.定义类
class Teacher():
#stu表示需要做自我介绍的学生的对象,只是一个变量名,可以自定义
def let_stu_introduce(self,stu):
print(self.name + "让" + stu.name + "做自我介绍")
#学生执行自己的行为
stu.do_introduce()
stu.show()
class Student():
def do_introduce(self):
print("开始做自我介绍")
print("大家好,我是:%s,今年%d,爱好:%s" % (self.name,self.age,self.hobby))
def show(self):
print("做才艺展示")
#2.创建对象
wang = Teacher()
#给wang绑定属性
wang.name = "王老师"
xiaoming = Student()
#给xiaoming绑定属性
xiaoming.name = "小明"
xiaoming.age = 16
xiaoming.hobby = "唱歌"
# xiaohua = Student()
# xiaoli = Student()
#3.让对象执行自己的行为【程序员站在指挥者的角度】
wang.let_stu_introduce(xiaoming) #stu = xiaoming