Day 16 python学习笔记

静态方法

静态方法,只需要在方法前添加 @staticmethod, 方法就可以不写形参self,可以通过实例对象.方法名调用,也可以通过类名.方法名调用

例:
class Test:
    @staticmethod
    def test1():
        print("你好")

    def nums(self):
        self.test1()
        self.num1 = 2
        self.num2 = 4

    def sums(self):
        print(self.num1+self.num2)



a = Test()
a.test1()     #实例对象.方法名调用
Test.test1()  #类名.方法名调用

结果:
你好
你好

类属性

类属性:让实例对象共用一个属性---类属性

使用方法:

  1. 对象名.属性
  2. 类名.属性名   (在类里面一定是这个)

实例属性: 

class Test:
    def __init__(self,name,age):
        self.nums = 0    #因为是实例属性,每次都是重新创建
        self.name = name
        self.age = age
        self.nums += 1
        # Test.nums += 1



a1 = Test("张三",21)
a2 = Test("李四",22)
a3 = Test("李四",22)
a4 = Test("李四",22)
a5 = Test("李四",22)

print(a1.nums)
print(a5.nums)

结果:
1
1

类属性:

class Test:
    nums = 0   #类属性:公用的
    def __init__(self,name,age):
        # self.nums = 0
        self.name = name
        self.age = age
        # self.nums += 1
        Test.nums += 1   #类属性进行操作



a1 = Test("张三",21)
a2 = Test("李四",22)
a3 = Test("李四",22)
a4 = Test("李四",22)
a5 = Test("李四",22)

print(a1.nums)
print(a5.nums)

print(Test.nums)

结果:
5
5
5

类方法

类方法:操作类属性(只需要在方法前添加 @classmothod

使用方法:

  1. 对象.类方法()
  2. 类名.类方法() 推荐

class Test:
    nums = 0
    def __init__(self,name,age):
        # self.nums = 0
        self.name = name
        self.age = age
        # self.nums += 1
        Test.nums += 1

    @classmethod
    def test_01(cls):   #cls可以为其他形参
        print(cls)
        cls.nums += 3
        print(cls.nums)


Test.test_01()
a1 = Test("张三",21)
print(a1.test_01)
print(Test.test_01)


结果:
  #指向类
3
>
>

__slots__

__slots__:限制实例的属性

class Test:
    __slots__ = ("name","age","dcd")#限制实例的属性
    def test_01(self):
        pass


a = Test()
a.name = "zhangsan"
a.age = 21
a.dcd = "sksoc"
a.jineng = "python"  #这个报错

Day 16 python学习笔记_第1张图片

python异常

异常:检测到错误,解释器无法继续执行,出现错误提示,即为异常(BUG 小虫子)

异常捕获

即为异常处理(捕获异常)

防止异常出现导致代码直接终止(异常一般不会影响后面的代码)

容错机制:程序一旦出现异常,直接处理异常,程序不直接终止,继续向下执行

  1.  整个程序因为BUG停止运行
  2. 对BUG进行提醒,整个程序继续运行

捕获异常作用:提前假设某处会出现异常,提前做好准备,当真的出现异常时,有后续手段

基本语法:

try:
        可能发生错误的代码
except:
        如果出现异常的代码

例1:

try:
    file1 = open('D:\yfile.txt', 'r', encoding="UTF-8")
except:
    print("出错了!!!,文件不存在,请以w模式打开文件")

结果:
出错了!!!,文件不存在,请以w模式打开文件

例2:

def devid_by(x,y):
    return x/y



if __name__ == '__main__':
    a = int(input("请输入一个整数a:"))
    b = int(input("请输入一个整数b:"))
    c = devid_by(a,b)
    print(c)
    print("我是后面的代码")



结果:
请输入一个整数a:4
请输入一个整数b:2
2.0
我是后面的代码
请输入一个整数a:4
请输入一个整数b:0   #报错因为除数不能为0
Traceback (most recent call last):
  File "D:\edge下载\桌面美化\桌面文件夹\云计算\python\Day13\代码\04-__slots__.py", line 9, in 
    c = devid_by(a,b)
  File "D:\edge下载\桌面美化\桌面文件夹\云计算\python\Day13\代码\04-__slots__.py", line 2, in devid_by
    return x/y
ZeroDivisionError: division by zero

解决方法:

def devid_by(x,y):
    res = 0
    try:
        res = x/y
    except:
        return "除数不能为0"
    return res


if __name__ == '__main__':
    a = int(input("请输入一个整数a:"))
    b = int(input("请输入一个整数b:"))
    c = devid_by(a,b)
    print(c)
    print("我是后面的代码")



结果:
请输入一个整数a:4
请输入一个整数b:0
除数不能为0
我是后面的代码

优化:

def devid_by(x,y):
    res = 0
    try:
        res = x/y
        num3 = int(input("请输入num3:"))
        print(x + y + num3)
    except ZeroDivisionError as e:  #ZeroDivisionError:除0错误(精准捕获)
        return "除数不能为0"         #as e:起个别名e
    except ValueError as e:         #ValueError:值错误
        return "你输入的不是整数哦"

    return res


if __name__ == '__main__':
    a = int(input("请输入一个整数a:"))
    b = int(input("请输入一个整数b:"))
    c = devid_by(a,b)
    print(c)
    print("我是后面的代码")

结果:
请输入一个整数a:4
请输入一个整数b:2
请输入num3:3
9
2.0
我是后面的代码

请输入一个整数a:4
请输入一个整数b:0   #捕获到错误就不进行执行下去(num3)
除数不能为0     
我是后面的代码

请输入一个整数a:4
请输入一个整数b:2
请输入num3:3.14
你输入的不是整数哦
我是后面的代码

扩展:

try:

        可能出现异常的代码

except:

        出现错误时执行的代码

else:

        没有异常的时候执行的代码

finally:

         不论是否会有异常都会执行  (目的:借助特性执行一些必须执行的代码)

finally

例:

def test():
    a = 10
    return a
    print("111111111111")  #不执行


a = test()
print(a)
test()

结果:
10

解决方法:

def test():
    try:
        a = 10
        return a
    except Exception as e:
        pass
    finally:
        print("111111111111")


a = test()
print(a)
test()


结果:
111111111111
10
111111111111

扩展:

  • BaseException 超类  (错误的总基类 如object)
  • Exception 常规的错误的异常超类    (对于我们一般这个就够了)

查询异常的方法:

  1. win + r
  2. cmd + 回车(进入终端)
  3. python + 回车 (进入python解释器)
  4. import builtins (导入模块)
  5. dir(builtins)

Day 16 python学习笔记_第2张图片

捕获全部异常

异常的传递

异常具有传递性

Day 16 python学习笔记_第3张图片

自定义异常

自己定义没有的异常类

class My_error(Exception):  # 继承常规的错误的异常超类
    def __init__(self,msg):
        Exception.__init__(self,msg)


def login(username,pwd):
    if username != "admin":
        raise My_error("用户名不存在") #raise:抛出异常
    if pwd != "123456":
        raise My_error("密码错误")



if __name__ == '__main__':
    try:
        login("ad","123")
    except My_error as e:
        print(e)

if __name__ == '__main__':
    try:
        login("admin","123")
    except My_error as e:
        print(e)

结果:
用户名不存在  #第一个错误后面就不判断了
密码错误

python的文件操作

i/o流(input output stream):输入输出流

内存数据和磁盘这种可以永久存储数据的设备间的数据流动问题。
完整流动顺序:磁盘---内存----cpu----内存---磁盘            :输入流        :输出流 
包括网络上的数据请求……
内存是最重要的缓冲设备

I/O流分类:

数据的流动方向:(站在内存角度)
输入流:磁盘上的文件读取到内存中,是输入流
输出流:将数据从内存存储在磁盘中,输出流

数据的类型分类:

字节流(01010101):媒体文件等
字符流:效率较高,但字节流是根本

python通过open函数操作io流
 

文件的编码

计算机只认识0-1,使用编码技术(密码本)将内容翻译成0和1存入硬盘

Day 16 python学习笔记_第4张图片

计算机有很多的可用编码(不同的密码本):

Day 16 python学习笔记_第5张图片

读写文件编码必须一致
utf-8:目前全球通用的编码格式
gbk;`````

文件的操作

文件:

操作:打开、读、写、关闭

open( )

open( )为全局方法,无需导入模块

常用:

open(file,mode="r",encoding ="UTF-8")  

file:文件路径(目标文件名的字符串)  (同一路径直接写文件名)   
mode="r":可读 (打开文件的模式 只读 r、写入、追加)  (默认为可读)
encoding ="UTF-8":编码格式

返回一个数字,标识文件

Day 16 python学习笔记_第6张图片

Day 16 python学习笔记_第7张图片

Day 16 python学习笔记_第8张图片

例:

f = open("test.txt")
print(f)

结果:
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>
>>> f = open("test.txt","r",encoding="UTF-8")
>>> f
<_io.TextIOWrapper name='test.txt' mode='r' encoding='UTF-8'>
>>>

f的方法

Day 16 python学习笔记_第9张图片

文件读取

read( )

文件对象.read(读取的数据的长度)

读取的数据的长度为空:读取全部内容 默认是-1,即读取到最后一位

>>> f.read()
'1\n2\n3\n4'
>>> f.read(1)  #因为之前读完了,读的指针就指向最后了
''
>>> f = open("test.txt","r",encoding="UTF-8")
>>> f.read(1)
'1'
>>> f.read(1)
'\n'
>>> f.read(1)
'2'
>>> f.read(1)
'\n'
>>> f.read(1)
'3'
>>> f.read(1)
'\n'
>>> f.read(1)
'4'
>>> f.read(1)  #读完后就读不到了
''
>>> f.read(1)
''
>>>

Day 16 python学习笔记_第10张图片

seek(0)

文件对象.seek(光标的位置):重新指定指针的位置

指针,第一次读取数据之后,指针移动到最后边,无法再读取

>>> f.read(1)
'4'
>>> f.read(1)  #读完后就读不到了
''
>>> f.read(1)
''
>>> f.seek(0)
0
>>> f.read(1)
'1'
>>>

readable()

文件对象.readable( ):判断文件是否可读

>>> f.readable()
True
>>>

writable()

文件对象.writable( ):判断文件是否可写

>>> f.writable()
False
>>>

close()

文件对象.close( ):   关闭文件

如果不将文件关闭,关机时或删除文件时都会显示运行

>>> f.close()
>>> f.closed
True
>>>

closed

文件对象.closed      判断文件是否关闭

>>> f.closed
False
>>>

readline()

文件对象.readline() :    读取行(针对字符数据的)

>>> f.readline()
'1\n'
>>>

readlines()

文件对象.readlines() :    将每一行作为一个元素,最后以列表的形式返回

>>> f.readlines()
['1\n', '2\n', '3\n', '4']
>>>

for i in 文件对象:

for i in 文件对象:  遍历循环文件对象(i为文件对象里每行的数据,以字符串格式返回)

f1 = open("1.txt","r",encoding="UTF-8")
print(f1)  #返回的这是基础信息,不是文件里的数据
print(f1.readlines())
f1.seek(0)    #因为上面进行readlines操作,指针已经到最后,需重新归0

for i in f1: #遍历循环f1
    print(i, type(i))




结果:
<_io.TextIOWrapper name='1.txt' mode='r' encoding='UTF-8'>
['张三,1000r,出差,测试\n', '李四,200r,吃饭,正式\n', '王五,1200r,出差,正式\n',
 '蔡,200r,打游戏,正式\n', '孙2,1000r,买东西,测试\n', '张飞,200r,吃饭,正式']
张三,1000r,出差,测试
 
李四,200r,吃饭,正式
 
王五,1200r,出差,正式
 
蔡,200r,打游戏,正式
 
孙2,1000r,买东西,测试
 
张飞,200r,吃饭,正式 

文件写入

>>> f = open("test.txt","w",encoding="UTF-8")
>>> f.writable()
True
>>>

write( )

文件对象.write(写入的数据 ) :      写入的数据积攒在程序的内存中(相当于写入未保存)

                                                    注意:并且会删除文件里原本的数据(相当于覆盖)

文件的追加,将w模式替换称a模式即可,不会把原来内容进行覆盖

>>> f.write("hh")
2
>>>

Day 16 python学习笔记_第11张图片

flush( )

文件对象.flush():      内容刷新(内容真正写入文件)

>>> f.flush()
>>>

Day 16 python学习笔记_第12张图片

你可能感兴趣的:(python,学习,笔记,算法,python,开发语言,青少年编程,汇编)