python基础知识点
'''
1.类的继承 重写 数据类型
'''
class Animal(object):
def run(self):
print('Animal is running')
class Dog(Animal):
#将父类的run方法重写
def run(self):
#super调用父类run方法
super().run()
print('Dog is running')
def eat(self):
print('Dog eat meat')
class Taidi(Dog):
#重写了Dog父类的run方法
def run(self):
print('Cat is running')
pass
实际上animal此时为函数的必选参数
def run_t(animal):
animal.run()
继承测试1重写
dog=Dog()
dog.run()
继承测试2重写 taidi 的文件格式 属于taidi类
taidi=Taidi()
taidi.run()
print(type(taidi))
继承测试3
run_t(Dog())
'''
#2.列表生成式
'''
生成[x=A..]列表
d={'x':'A','y':'B','z':'C'}
print([k+'='+v for k,v in d.items()])
#生成1...10
print(list(range(1,11)))
#生成1,4,9,16列表
print([x*x for x in range(1,11)])
#'abc'与'123'生成a1,a2....
print([m+n for m in 'abc' for n in '123'])
#'a.b.c' 与’123‘生成a1,a2...
print([m+n for m in 'a.b.c' for n in '123' if m!='.'])
#生成器在调用时产生下一个数据列表数据依次抛出列表内无数据时报错
g=(x*x for x in range(1,11))#注意括号不是[]
print(g)
#得到对象 <generator object <genexpr> at 0x000001BE03DAB8C8>
print(next(g))
yield
斐波那契数列 后一个数永远是前两个数的和
def fib(max):
n,a,b = 0,0,1#定义了三个变量
while n<=max:
print(b)
a,b=b,a+b
n=n+1
return 'done'
'''
#3.os系统文件复制
'''
import os
def copy_file(file1,file2):
f1=open(file1,'rb')#读文件1
f2=open(file2,'wb')#写文件2
content=f1.readline()#按行读取1
while len(content)>0:#当行数大于0
f2.write(content)#往f2写入
content=f1.readline()#再读取直到循环结束
f1.close()
f2.close()
测试1 copy_file('./生产力和生产关系.txt','./c.txt')
def copy_path(dir1,dir2):
old_list=os.listdir(dir1)
os.mkdir(dir2)
for f in old_list:
file1=os.path.join(dir1,f)#路径1
file2=os.path.join(dir2,f)#路径2
if os.path.isfile(file1):#文件是文件
copy_file(file1,file2)#复制引用上次的copy函数
if os.path.isdir(file1):#文件是文件夹
copy_path(file1,file2)#调用函数本身 递归调用
测试2 copy_path('./work','./Newfile')
'''
4.os中的绝对路径与相对路径
'''
1、绝对路径
绝对路径有三种使用方法:
#1.反斜杠 ‘\’:由于反斜杠 ‘\’ 要用作转义符, 所以如果要使用反斜杠表示路径,则必须使用双反斜杠。
‘C:\Users\Administrator\Desktop\image\cork.jpg’
#2.原始字符串 r’’:可以使用原始字符串+单反斜杠‘\’的方式表示路径
r’C:\Users\Administrator\Desktop\image\cork.jpg’
#3.斜杠‘/’:为了避免转义符 ‘\’ 和 原始字符串的麻烦,可以直接用 斜杠‘/’,python中是承认‘/’用于路径分割符号的。
‘C:/Users/Administrator/Desktop/image/cork.jpg’
2、相对路径
./Images 表示当前目录下的 Images文件夹
…/Images 表示当前目录的上一层目录下的Images文件夹
/Images 表示,项目根目录
../ 表示当前文件所在的目录的上一级目录
./ 表示当前文件所在的目录(可以省略)
/ 表示当前站点的根目录(域名映射的硬盘目录)
import os
path1=os.path.abspath('.') # 表示当前所处的文件夹的绝对路径
print(path1)
path2=os.path.abspath('..') # 表示当前所处的文件夹上一级文件夹的绝对路径
print(path2)
'''
5.可迭代和生成器 很多的系统参数要求是Iterable或Iterator
'''
#判断是否是迭代对象 123不是可迭代对象
from collections.abc import Iterable
print(isinstance([],Iterable))
print(isinstance({},Iterable))
print(isinstance('abc',Iterable))
print(isinstance(123,Iterable))
#判断是否是生成器对象 全不是生成器对象
from collections.abc import Iterator
print(isinstance([],Iterator))
print(isinstance({},Iterator))
print(isinstance('abc',Iterator))
#可转化以上非生成器为生成器 通过iter(对象)来转化
#用于项目中列表和字典非常大 占用资源多 转化为生成器进行优化
from collections.abc import Iterator
print(isinstance(iter([]),Iterator))
print(isinstance(iter({}),Iterator))
print(isinstance(iter('abc'),Iterator))
'''
#6.输出杨辉三角生成器
'''
def triangles():
p = [1]
while True:
yield p #generator函数与普通函数的差别:在执行过程中,遇到yield就中断,下次又继续执行
p = [1] + [p[i] + p[i+1] for i in range(len(p)-1)] + [1]
n = 0
results=[]
for t in triangles():
print(t)
results.append(t)
n = n + 1
if n == 5:
break
if results==[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1],
]:
print('测试通过')
else:
print('测试失败')'''
'''
#输出关键字换成yield 得到一个fib的生成器
def fib(max):
n,a,b = 0,0,1#定义了三个变量
while n<=max:
yield(b)#输出关键字不是return而是print
a,b=b,a+b
n=n+1
return 'done'
#得到结果就可以next()得到下一个数.
g=fib(8)
while True:
try:
print(next(g))
except StopIteration as e:#起个名标识指向
print('没有数据了',e.value)#把e的值输出
break
'''
7.lambda,reduce,map三种函数
函数可以作为参数传递
函数内的函数 匿名函数
'''
from functools import reduce
DIGITS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}#常量一般全大写定义表示不要更改
def num_int(s):
def num_get(s):
return DIGITS[s]#返回
return reduce(lambda x, y: x * 10 + y,map(num_get,s))
# map与reduce
# lambda函数 相当于定义x,y为变量:返回x*10+y值的函数
# map(函数,生成器或元素) map函数将a中的每个元素带入num_get中得到结果 map类 可遍历同时是生成器和可迭代
# reduce(函数,至少有2个元素的生成器或元素) 相当于前两个函数返回值与第三个再带入函数
# 生成器是可迭代对象
s1='67446'
num_int(s1)
print(num_int(s1))
'''
#8.装饰器的调用及PY内部装饰器 @property @setter
'''
import datetime
#def now():
#print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
#now()
#装饰器 以一个函数作为参数,并返回一个函数
def log(f):#定义log装饰器 f为传入函数
def write_log(*args,**kw):
#匿名函数 定义目的返回函数
with open('./a.txt','w') as f1:
f1.write(f.__name__)
#传入函数.__name__返回当前函数自己的名字
#执行本函数写日志方法
print('写入成功,函数名:%s'%f.__name__)
return f(*args,**kw)
#执行传入函数的方法
return write_log
#返回函数不是执行函数
#调用方式1
#ff=log(now)#装饰器(传入函数)
#ff()# 调用
#调用方式2
@log #先装饰器 后被调用函数定义
def now():
print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
now()
#py内置装饰器 @property @setter
class Student(object):
def __init__(self,score):
self.__score=score
@property
def score(self):
return self.__score
@score.setter#对属性赋值
def score(self,value):
if not isinstance(value,int):
raise ValueError ('格式不是整数')
if value <0 or value>100:
raise ValueError ('分数0-100')
self.__score=value
调用
stu1=Student(90)
print(stu1.set_score(85))
print(stu1.get_score())
加上装饰器方法变属性能通过属性访问
stu2=Student('67')
stu2.score=59
print(stu2.score)'''
#9.flush 变字占位调用
'''
for t in range(task_time, 0, -1):
info = '请专注任务,还要保持专注 ' + str(t) + ' 秒哦!'
#设置字段
print(info, end="")
print("\b" * (len(info) * 2), end="", flush=True)
#用此句段使计时能够变化而文字不变
time.sleep(1)'''
#10.csv储存文件
''''
with open('timelog4.txt', 'a', encoding='utf-8') as f:
f.write(task_name + ' 的预计时长为:' + str(task_time) + '分钟\n')
f.write(task_name + ' 的实际时长为:' + str(actual_time) + '分钟,具体时间为:' + start_end)
again = input('建立一个新任务请按 y, 退出时间日志记录器请按 q:')
if again == 'q':
break
'''
11.时间模块用法
'''
import time
print (time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))
#格式化localtime为2020-03-02 22:13:58
print(time.localtime(time.time()))
#元组化time.time
print(time.time())
#得到当前时间戳1583158093.9126196
print(time.mktime(time_t))
格式化元组为时间戳1583158093.9126196
'''
# 12.round()保留小数位数 与int取整
'''
end_time=time.time()
# 生成当前的时间戳1552665631.370535
use_time=end_time-start_time
time_e = round(use_time,2)
#round(时间,保留小数后几位)
print('计时结束')
print('程序用时{}分{}秒'.format(int(time_e/60),time_e))
int取整'''
错误产生的三种原因
.程式编写问题try except
.用户输入信息格式不正确程式报错
.发生磁盘满了,断网,硬件问题等意外情况
'''
13.字符编码与编码的转化
'''
print(ord('A'))#转换字符为编码
print(ord('我'))
print(chr(65))#转换编码为字符串unicode
print(chr(25105))
#传输保存 对字符编解码utf-8通用
#x=b'ABC'#b用ASCII转化为字节数组中文不能转化
print('你好'.encode('utf-8'))#转化为utf-8编码16位2进制
print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8'))#将编码转化为字符
#查看字符占用的字节数
print(len('你好'))
print(len('你好'.encode('utf-8')))
print(len('你好'.encode('gbk')))
print(len('你好'.encode('unicode')))