day12笔记 系统模块 类和对象

一、系统模块

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值