Python学习笔记

关于设计模式(一)

设计模式是面向对象语言特有的内容,是我们在面临某一问题时固定的做法

class CarFactory:
    def carName(self,name):
        if name == "benchi":
            return Benchi()
        elif name == "BiYardi":
            return BiYardi()
        elif name == "BaoMa":
            return BaoMa()
        elif name == "FEi":
            return FEi()
        else: return "输入错误"

class Benchi:
    pass
class BiYardi:
    pass
class BaoMa:
    pass
class FEi:
    pass
a = CarFactory()
b=a.carName("BaoMa")
print(b)

#输出
<__main__.BaoMa object at 0x000002C53FBDFF10>

工厂和单例的整合

class CarFactory:
    __obj=None
    __init__flag=True


    def carName(self,name):
        if name == "benchi":
            return Benchi()
        elif name == "BiYardi":
            return BiYardi()
        elif name == "BaoMa":
            return BaoMa()
        elif name == "FEi":
            return FEi()
        else: return "输入错误"

    def __new__(cls,*args, **kwargs):
        if cls.__obj==None:
            cls.__obj=object.__new__(cls)
        return cls.__obj
    def __init__(self):
        if CarFactory.__init__flag:
            print("int******")
            CarFactory.__init__flag=False

class Benchi:
    pass
class BiYardi:
    pass
class BaoMa:
    pass
class FEi:
    pass
a = CarFactory()
b=a.carName("BaoMa")
c=a.carName("FEi")
print(b)
print(c)

int******
<__main__.BaoMa object at 0x00000211536CFE80>
<__main__.FEi object at 0x00000211536CFE50>

try__except  基本结构

print("step0")
try:
    print("step1")
    a=3/0
    print(step2)
except BaseException as e:
    print(e)
    print(type(e))
    print("stept3")

step0
step1
division by zero
<class 'ZeroDivisionError'>
stept3

while True:
    try:
        a = int(input("please input number"))
        if a == 888:
            print("end", a)
            break
        else:
            print(a)
    except BaseException as e:
        print(e)
        print("it is error,please re-enter")

print("it is ending")

常见异常:

SyntaxError: 语法错误
NameError 尝试访问一个没有申明的变量
ZeroDivisionError 除数为0的错误
ValueError 数值错误
TypeError 类型错误
AttributeError 访问对象不存在的属性
IndexError: 索引越界异常
KeyError: 字典的关键字不存在
ArithmeticError 所有数值计算错误的基类
AssertionError 断言语句失败
AttributeError 对象没有这个属性
BaseException  所有异常的基类
DeprecationWarning 关于被弃用的特征的警告
EnvionmentError 操作系统错误的基类
EOFError  没有内建输入 到达EOF标记
Exception  常规错误的基类

trackback模块的使用  异常写入文件

try:
    print("step0")
    a=3/0
    print(a)
except:
    with open("文件地址","")  as f:
        traceback.print_exc(file=f)

自定义异常类

class  AgeError(Exception):
    def __init__(self,age):
        Exception.__init__(self)
        self.age=age

    def __str__(self):
        return str(self.age) + "  input age is error"

if __name__=="__main__":
    age = int(input("please input age:"))
    if age<1 or age>150:
        raise AgeError(age)
    else:
        print("normal age:",age)

Traceback (most recent call last):
  File "D:\python\pc\01\try except.py", line 12, in <module>
    raise AgeError(age)
__main__.AgeError: 999  input age is error

创建文件对象open()

open()函数用于创建文本对象  语法格式如下:
open(文件名[打开方式])
r  读模式
w  写模式  如果文件不存在则创建 文件存在  则重写新内容
a  追加模式  如果文件不存在则创建  文件存在,则在文件末尾追加内容
b  二进制模式  (可与其他模式组合使用)
+    读、写模式(可与其他模式组合使用)
f = open("a.txt",a)
a = "feichanghao\n"
f.write(a)
f.close()


文件对象的常用方法

raed([size])  从文件中读取size个字符,并作为结果返回。如果没有size参数,则读取整个文件
读取到文件末尾,会返回空字符
readline()读取一行内容作为结果返回。读取到文件末尾,会返回空字符
readlines() 读取文件中,每一行作为一个字符串存入列表 
write(str)  将字符串str内容写入文件
writelines(s)  将字符串列表s写入文件中,不添加换行字符
seek(offset[,whence])   把文件指针移动到新的位置,offset表示相对于whence的多少个字节的偏移量;
offset:
        off为正忘结束方向移动,为负方向开始方向移动
whence不同的值代表不同的含义:
0  从文件头开始计算(默认值)
1  从当前位置开始计算
2  从文件尾开始计算

tell()  返回文件指针的当前位置
truncate([size])  不论指针在什么位置,只留下指针前size个字节的内容,其余全部删除;
如果没有传入size,则指针当前那位置到文件末尾内容全部删除
flush()    把缓冲区的内容写入文件,但不关闭文件
close()   把缓冲区内容写入文件,同时关闭文件,释放文件对象相关资源

with open("e.txt","r",encoding="utf-8") as f:
    print("文件名:{0}".format(f.name))
    print(f.tell())
    print("读取的内容是:{0}".format(str(f.readline())))
    print(f.tell())
    f.seek(3)            #中文在utf-8中占三个字节
    print("读取的内容是:{0}".format(str(f.readline())))

文件名:e.txt
0
读取的内容是:我love study

15
读取的内容是:love study

enumerate()函数和推导式生成列表

a = ["I love program!\n","I love English!\n","I love study\n"]
b = enumerate(a)
print(a)
print(list(b))

#rstrip  用来去除\n字符   temp指列表中的元素
c = [temp.rstrip()+" #"+str(index) for index,temp in enumerate(a)]
print(c)

['I love program!\n', 'I love English!\n', 'I love study\n']
[(0, 'I love program!\n'), (1, 'I love English!\n'), (2, 'I love study\n')]
['I love program! #0', 'I love English! #1', 'I love study #2']

f=open(r"d:\a.txt",'wb')    #可写的、重写模式的二进制文件对象
f=open(r"d:\a.txt",'ab')     #可写的、追加模式的二进制文件对象
f=open(r"d:\a.txt",'rb')      #可读的二进制文件对象

上一篇:LeeCode 217.存在重复元素


下一篇:Python学习---py14 函数参数