今天真的动不动报错,后面有些烧脑但真的DNA动了
目录
12 输入和输出
'''输出'''
s='asdfgh\n'
print(str(s)) # 会转义
print(repr(s)) # 带''且不转义,为解释器易读的表达形式
# 括号内:
# 若表达式会运算
# 若seq内,参数则返回值,字符串不会转义
for x in range(5):
print(repr(x).rjust(2),repr(x*x).rjust(2)) #这里和用str()没差
# 等价于'{:2d} {:3d}'.format(x, x*x)
print('{!a:3},{!s:3},{!r}'.format(a,'a','a'))
#输出:10 ,a ,'a'
#为啥这不能加d:Unknown format code 'd' for object of type 'str'
print('{0[a]},{0[b]}'.format(dct)) #不要忘了加0否则IndexError~
print('{a},{b}'.format(**dct)) #效果一样不需要加0
'''输入'''
a,b,c=(input('input:').split()) # 以空格分割输入
'''读和写文件'''
# r 只读。文件指针放在文件开头。(默认)
# w 只写。已存在从头重新编辑,不存在创建。
# a 追加。已存在文件指针放在文件结尾,不存在创建。
# rb wb ab 以二进制格式
# r+ w+ a+ 读写
# rb+ wb+ ab+ 以二进制格式读写
f=open("foo.txt",'w')
print(f.write('111\n222')) #输出7,返回的是字符数
f.close()
f=open("foo.txt",'r')
#指针会后移,以下操作需要重新读的不复述了
#print(f.read()) #相当于直接输出'111\n222'
#print(f.readlines()) #输出['111\n', '222']
print(f.tell()) #输出0
print(f.readline()) #输出111加换行
print(f.tell()) #输出5,换行当成2个字符,要\t是当成一个
print(f.readline()) #输出222
print(f.tell()) #输出8
f.close()
# write()如果类型不是字符串需先转换
with open("foo.txt",'rb') as f: # with打开可以正确关闭
# seek必须二进制读入
print(f.seek(3,0)) #从头,返回位置3,第二个数默认0
print(f.seek(3,1)) #从当前,返回位置6
print(f.seek(-3,2)) #从结尾倒着,返回位置5
print(f.close) #这玩意有返回值hh,open就没有
'''pickle模块'''
import pickle
f=open("foo.pkl",'wb+') #注意文件类型!以及要是二进制
l1=[1,2,3]
l1.append(l1)
pickle.dump(l1,f) # 序列化操作,没有返回值
print(f.read()) #是有存进去但是读不出来悲
pickle.dump(l1,f,-1) #“从文件中创建上一次程序保存的对象”不懂
f.seek(0) #要不加Ran out of input
print(pickle.load(f)) # 反序列化操作,输出[1, 2, 3, [...]],append里面没了
13 文件方法
# open(file,mode='r')
#以及默认参数:
# buffering=-1 设置缓冲
# encoding=None 一般UTF-8
# errors=None 报错级别
# newline=None 区分换行符
# closefd=True 传入的file参数类型
# opener=None 设置自定义开启器,其返回值必须是一个打开的文件描述符
#mode参数有:
# t 文本模式(默认)
# x 写模式,新建文件,存在则报错
# b 二进制
# + 可读可写
# 其他的说过了
'''file对象'''
with open('fo.txt','w+') as f:
# flush() 刷新文件内部缓冲
# fileno() 返回一个整型的文件描述符,可以用在如os模块的read方法等一些底层操上
# isatty() 是否连接终端设备
# truncate() 无size从当前位置截断
f.write('123456789')
print(f.truncate(5))
f.seek(0)
print(f.read()) #输出:12345
# writelines(str) 把seq里(必str)元素全以str写入
f.writelines(['1','2','3'])
f.seek(0)
print(f.read()) #输出12345123
print(f.closed) #返回True,即用with会自动关闭
14 OS文件/目录方法
import os
#只写一些常用的
# chdir(path) 改变目录,返回是否允许访问
#用getcwd()查看修改后目录
# listdir(path) 返回该文件夹中所有文件名字的列表
print(os.listdir(r'D:\C_plate\Microsoft VS Code\folder')) #注意不要少r!!
# mkdir(path,mode=0777) 以数字权限模式创建目录(若存在触发异常)
os.mkdir(r'D:\C_plate\Microsoft VS Code\folder\hh') #啊目录就是文件夹
# makedirs(name,mode=511,exist_ok=False目录存在触发异常) 递归创建多层目录
os.makedirs(r'D:\C_plate\Microsoft VS Code\folder\h1\h2\h3')
# walk(top) 创建生成器查找文件
#含默认参数:
# topdown=True 目录自上而下
# onerror=None
# followlinks=False 通过软链接访问目录
for root,dirs,files in os.walk(".",topdown=False): #这里path用的相对路径
for name in files:
print(os.path.join(root,name))
for name in dirs:
print(os.path.join(root,name))
# rmdir(path) 删除目录
# sep
#以下用os.path调用
# exists()
# dirname()文件路径 basename()文件名
# join() 把目录和文件名合成一个路径
# split() 把路径分割成dirname和basename,返回元组
# isdir() isfile()
# getsize() 返回文件大小,不存在则报错
15 异常处理
'''
try:
except <> as err: 可以把err输出
else: 若无异常
finally: 无论有无异常,若有异常且未被except截住则执行完再抛出
'''
try:
os.mkdir(r'D:\C_plate\Microsoft VS Code\folder\hh')
except FileExistsError as err:
print('error:',err)
#raise Exception('') 抛出一个指定异常
'''用户自定义异常'''
class MyError(Exception): #MyError是Exception的派生类
def __init__(self,value):
self.v=value
def __str__(self):
return repr(self.v)
try:
MyError(5)
except MyError as e:
print("error:",e.v)
16 面向对象
'''类'''
# __开头的变量/方法为私有
class T:
def prt(self,val): #self是类的实例,不是关键字可以换~
self.v=val
print(self) #代表当前对象的地址
print(self.__class__) #指向类
t=T() #要改成__init__实参写里面
t.prt(5) #就不需要再写这步调用
#输出:
# <__main__.T object at 0x046A1928>
# <class '__main__.T'>
'''继承'''
# 继承可以调用、覆写父类方法
class T1(T):
def f(self,v1):
T.prt(self,v1) #这里v1对于T的函数是实参
print(self.v) #没有输出,所以不可以直接访问父类方法
#但是都改成构造函数__init__可以访问,这里v是T的方法
print(self.v1) #现在不会报错但没有输出
#都改成构造函数__init__会报错AttributeError
t=T1()
t.prt(5)
#输出:
# <__main__.T1 object at 0x04C51958>
# <class '__main__.T1'>
'''多继承'''
#调用方法找顺序:子类->父类(左->右)
# super(子类,self) 为避免^而代替类名调用父类方法
'''类的专有方法'''
# __init__构造函数 __del__析构函数
# __repr__ 打印,转换
# __call__ 函数调用
# __add__加 __sub__减 __mul__乘 __truediv__除
# __mod__取余 __pow__平方
# __len__获得长度 __cmp__比较运算
# __setitem__按照索引赋值 __getitem__按照索引获取值
'''运算符重载'''
class Vector:
def __init__(self,x,y):
self.x=x
self.y=y
def __add__(self,other): #必须是类的专有方法啊,否则感觉是不会调用这个方法
return Vector(self.x+other.x,self.y+other.y)
def __str__(self): #方法必须是这样写啊,以及要不写方法就没有输出了
return 'Vector(%d,%d)'%(self.x,self.y)
v1=Vector(2,10)
v2=Vector(5,-2)
print(v1+v2)
17 命名空间/作用域
和C差不多吧
# global 内部作用域修改外部作用域变量前声明
# nonlocal non-local修改non-global前声明
还差一些就把高级教程前的知识点看完了qwq但还是算了睡了