眼镜企业网站建设方案,安徽公司网站建设,wordpress 评论 验证码,做校园网站 怎么备案引言
做任何事情都要脚踏实地#xff0c;虽然大一上已经学习了python的基础语法#xff0c;大一下也学习了C加加中的类与对象#xff0c;但是自我觉得基础还不太扎实#xff0c;又害怕有什么遗漏#xff0c;所以就花时间重新学习了python的基础#xff0c;学习Python的基…引言
做任何事情都要脚踏实地虽然大一上已经学习了python的基础语法大一下也学习了C加加中的类与对象但是自我觉得基础还不太扎实又害怕有什么遗漏所以就花时间重新学习了python的基础学习Python的基本语法如变量、数据类型如列表、字典、元组、控制结构如if语句、for和while循环和函数。掌握Python的面向对象编程包括类的定义、对象的创建以及继承和多态的概念。除此之外还有文件和文件夹以及批量化处理文件以及外包和装饰器
1.python基本语法
#输出
#python第一个程序
print(你好世界)#输出字符串中的内容
#输出语句中的常见的参数及转义字符
print(hello world,end\t)#尾部默认的是end\n
#当多个字符串连接在一起的时候#多对象字符串分隔符
print(你好,世界)#默认是以空格隔开sep
print(你好,世界,sep,)
print(你好,世界*3)#字符串的复制
print(5201314)#字符串的拼接,字符串不能进行运算
#转义字符
print(C:\abc\def\ndad)#会乱码需要使用转义字符
print(C:\\abc\def\\ndad)#第一种方法\\\ 并不建议
print(rC:\abc\def\ndad)#第二种方法在字符串前面加小写r 建议
#单行注释
#多行注释注释是不会被输出的1.
2.
3.变量 变量名规则支持汉字并且可以由字母数字下划线构成但是不能以数字开头而且区分大小写。
#给变量赋值
a5
print(a)#打印出a的值来
#给多个变量赋值
a1,b1,c17,3,0
print(a1)#7
print(b1)#3
print(c1)#0
b,c,d2,2,2
print(b)#2
print(c)#2
print(d)#2
a2b2c22;
print(a2)#2
print(b2)#2
print(c2)#2
#两个变量的值进行交换
x5
y2
print(x)#5
print(y)#2
x,yy,x#两个变量互相交换赋值
print(x)#2
print(y)#5
#变量名字
姓名陈惠婷
年龄17
#格式化字符串
#print(fxxx{变量名})
print(f我的名字叫{姓名},今年的年龄是{年龄}岁)
print(f我的名字叫{姓名},明年的年龄是{年龄1}岁)输入
输入是用户手动输入键盘用的是input(),返回的是以字符串的形式来返回在使用的时候注意记得把用户输入的内容赋值给一个变量。
#输入
#注意:被用户输入的内容默认都是字符串格式
#字符串是不能进行运算的
#输入的内容默认是字符串格式
#姓名input()#输入用户的姓名
#年龄input()#输入用户的年龄
姓名陈惠婷
年龄17
print(type(年龄))
print(f我的名字叫{姓名},今年的年龄是{年龄}岁)
#数据类型转换
#int()转整型
年龄1float(年龄)
print(年龄1)#17.0
print(type(年龄1))#float
年龄2str(年龄)
print(年龄2)
print(type(年龄2))#str
#float()转浮点型
#str()转字符型
数学运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fbglc4Ag-1690385710664)(C:\Users\86185\Desktop\python\图片1.png)]
复合运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utw7Az8y-1690385710666)(C:\Users\86185\Desktop\python\图片2.png)]
比较运算符(注意他返回的值是逻辑值True或False)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UkLs4lY-1690385710666)(C:\Users\86185\Desktop\python\图片3.png)]
逻辑运算符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3p30Hz0F-1690385710667)(C:\Users\86185\Desktop\python\图片4.png)]
and运算符只要有一个是0那么就返回0否则结果为最后一个非0数字
or运算符:只有所有值为0否则就返回第一个非0数字
#数学运算符
#运算符---加 运算符- 减 *乘 /除
#整除// %取余 **指数 ()小括号,用来提高运算优先级
#复合运算符
#a1,相当于aa1
#a-1相当于aa-1
#a12 相当于a(12)相当于aa3
#比较运算符
#,!,,,,返回的值是True和False
#逻辑运算符
#and运算符:只要有一个值为0,则结果为0,否则结果为最后一个非0数字
#or运算符只有所有值为0则结果为0否则结果为第一个非0数字
print(1 and 2)#2
print(0 and 1)#0
print(1 and 0)#0
print(1 or 1)#1
print(1 or 0)#1
print(0 or 0)#0
#优先级顺序
#幂运算 正负号 算术运算 比较运算 逻辑运算
2.字符串列表元组字典集合
序列序列是一个存放多个值的连续内存空间。
有序序列有序意味着有下标可以进行下标操作、切片操作列表、元组、字符串…
无序序列字典、集合…
可变类型与不可变类型
可变类型列表、字典、集合
不可变类型整型、浮点型、字符串、元组
所谓可变与不可变数据能直接进行修改就是可变否则就是不可变。
科学解释可变类型当变量值改变id内存地址不变。不可变类型当变量值改变id内存地址就改变了。**使用****id(变量名)可以查询id内存地址**也就是说可变类型就是当变量值改变的时候他的变量名没有变。但是如果是不可变类型的话当变量值发生了改变那么他的变量名就不是原来的那个变量名了
字符串
字符串是python中最常用的数据类型使用引号来创建字符串,单引双引三引号都可以 1.单和双引在单独使用上没有区别区别在于配合使用 2.三引号字符串支持换行
#转义字符\‘’创建字符串I‘m bigtom
print(I\m bigtom)#’I‘m bigtom
#1.下标
姓名你好我叫陈惠婷#创建一个变量
print(姓名[0])#你
print(姓名[2])#,下标特点
#1.从0开始 #2.标点算一位 #3.英文字母也算一位 #4.一个汉字也算一位
切片特点
语法可以暂时理解为变量名(序列)开始位置下标结束位置下标步长
开始位置下标注意:如果省略起始值那么默认从0开始
结束位置下标不包括结束位置下标对应的数据正负数均可默认是最后
也就是左闭右开
步长步长是选取间隔默认是1
#2.切片
a0123456
print(a[1:4:1])#123
print(a[:6])#012345
#步长加了负号就要从尾部开始数倒着数
print(a[::-1])#6543210
print(a[::-2])#6 4 2 0字符串的常用操作方法(查找修改判断)
查找find()
find是从左向右查找而rfind()是从右向左查找
查询某个子串是否包含在这个字符串中如果在那么就返回这个子串开始的位置下标否则返回-1如果有重复的就返回第一个的最开始的下标
语法字符串序列.find(子串开始位置下标结束位置下标
注意开始和结束位置下标可以省略表示在整个字符串串序列列中查找。
*计数count()
count():返回某个子串在字符串中出现的次数
语法字符串序列.count(子串开始位置下标结束位置下标
**注意**开始和结束位置下标可以省略表示在整个字符串串序列列中查找。
ado you hope to further future
print(a.find(o))#1
print(a.find(z))#-1
print(a.count(d))#1
print(a.count(z))#0替换replace()
语法字符串序列.replace(旧子串新子串替换次数
注意替换数次如果超过了子串的出现次数就替换所有子串。省略替换次数就是全部替换。
a do you hope a further future
print(a.replace(further,promised))#do you have a promised futuresplit()分割
语法字符串序列.split(分割字符分割次数
注意返回的是一个列表
a do you hope a further future
print(a.split( ,2))#[do, you, hope a further future]
print(a.split( ))#[do, you, hope, a, further, future]
join():合并
语法字符或者子串.join(字符串1字符串2字符串3)#以什么样子的形式连接字符串
a do you hope a further future
print(a.split( ,2))#[do, you, hope a further future]
ba.split()
print(a.split( ))#[do, you, hope, a, further, future]
print(-.join(b))
print(a)#值没有变说明字符串的确是一个不可变序列判断
检查字符串是否以子串开头startswith()
检查字符串是否以子串结尾endswith()
语法变量名.startswith子串开始位置下标结束位置下标
语法变量名.endswith子串开始位置下标结束位置下标返回的是True或False
注意如果省略位置那么就是判断全部位置
awhat is your name?
print(a.startswith(w))#T
print(a.startswith(ss))#F
print(a.endswith(?))#T
print(a.endswith(e))#F
以下可迭代对象就不一一说明他的增删查改了了只是给个总结
列表可变序列)
创建列表中括号
a[],列表可以一次性存储多个数据
1、列表格式用中括号存数据每个数据用逗号隔开 [数据1,数据2,数据3]2、常用操作方法1Index() 查找数据在列表中第一次出现的位置
2len() 返回列表的数据个数
3append 在列表末尾追加单个数据
4extend 在列表末尾追加多个数据
5insert 在指定位置增加数据
6del 删除列表或删除列表指定下标
7remove 删除列表第一个指定的数据
8sort 列表排序
元组不可变序列
a111
b
元组的常见操作因为他不可以被修改所以他的操作方法就只有查询了变量名 孙悟空,猪八戒,沙和尚,白龙马,孙悟空print(变量名[1]) # 使用下标查找数据返回猪八戒print(变量名[开始位置下标结束位置下标步长]) # 切片的方式print(变量名.index(沙和尚)) # 查找某个数据在元组中的下标与字符串和列表使用方法相同print(变量名.count(孙悟空)) # 统计某个数据在元组中出现的次数print(len(变量名) # 统计元组数据的个数del 变量名元组只可读取里面的数据不能修改所以不支持清空元组数据的操作
字符串列表元组统称为序列
list(序列名) # 将序列转为列表tuple(序列名) # 将序列转为元组 字典
创建空字典
adict() b{}
字典不支持下标字典是数据以键值对的方式来创建字典
1.增加和修改数据语法 字典序列名[键] 值如果键存在则修改对应的值如果键不存在新增这个键和值
2.删数据删除字典内数据语法del字典序列名[键] # 只需要写键它会把键和值一起删除 删除整个字典的语法del 字典序列名清空字典clear( ) 字典序列名.clear( )
3.查数据注意只能用键查值不能用值查键因为键是唯一的值可能是重复的。字典序列名 {华为:520,小米:520,苹果:14,三星:24}print(字典序列名[小米]) 返回520print(字典序列名[诺基亚]) 返回报错 总结如果键存在我们返回值否则报错。
4.字典的查询方法1get( ) 语法 字典序列名.get(键随便写)
如果键存在返回值。如果键不存在返回默认值默认值是你随便写的内容如果省略了这个参数返回None。2values( ) 语法 字典序列名.values( ) # 返回字典中所有的值3items( ) 语法字典序列名.items( ) #可迭代对象里面的数据是元组,迭代就是重复反馈过程
集合
创建集合可以用{ } 或 set( )创建集合但是创建空集合必需用set( )因为{ }创建的是空字典集合的特点
(1)自动去除重复数据
(2)顺序是随机的所以不支持下标
增加数据集合名.add(数据) # 因为集合自动去重复所以增加重复内容时不进行任何操作追加数据序列集合名.update(数据序列) # 数据序列列表字符串元组删除数据集合名.remove(数据) # 如果数据不存在报错集合名.discard(数据) # 如果数据不存在不报错集合名.pop( ) # 随机删除集合中某个数据并返回这个数据
查看返回数据 变量名 集合名.pop( )
查看被删除的数据 print(变量名)
查看集合还剩下什么 print(集合名) 查找数据in: 判断数据是否在集合序列中not in: 判断数据不在集合序列中print( 数据 in 集合名 ) # 返回 True 或 False print( 数据 not in 集合名 ) # 返回 True 或 False set(序列名) # 将某个序列转换成集合注意集合自动去重复但不支持下标没有顺序
一些常用的可迭代对象的特点总结和区别
1、字符串不能修改的字符序列。除了不能修改可把字符串当成列表一样处理。
2、列表我觉得列表就是我们日常生活中经常见到的清单。比如统计过去一周我们买过的东西把这些东西列出来就是清单。由于我们买一种东西可能不止一次所以清单中是允许有重复项的。
3、元组用来存放不能被轻易修改的数据例如身份证号
4、字典是除列表外python中最灵活的内置数据结构类型。列表是有序的对象结合字典是无序的对象集合。两者之间的区别在于字典当中的元素是通过键来存取的而不是通过偏移存取。
5、集合目的就是去重复。
3.分支语句和循环语句
分支语句
if 条件: 、
条件成立执行的代码1
条件成立执行的代码2
条件是否成立都执行的代码
如果条件成立就执行缩进后的代码否则不执行但是未缩进的代码与条件无关。怎么样都会执行
if 条件:
条件成立执行的代码1
条件成立执行的代码2
else:
条件不成立执行的代码1
条件不成立执行的代码2
如果条件成立就执行if下方的代码如果条件不成立就执行else下方的代码
if 条件1:
条件1成立执行的代码1
条件1成立执行的代码2 …
elif 条件2
条件2成立执行的代码1
条件2成立执行的代码2 …
else:
以上条件都不成立执行的代码 ……
ageint(input(请输入您的年龄:))
if(age18):{print(f您的年龄是{age}岁你不能考驾照还需要等{18-age}年)}
elif(age70):{print(f您的年龄是{age}岁,您再也不能考驾照了)}
else:{print(f您的年龄是{age}岁,可以考驾照了)}
分支语句的嵌套
if 条件1:
条件1成立执行的代码
if 条件2
条件2成立执行的代码
else:
如果条件2不成立执行的代码
else:
如果条件1不成立执行的代码
三目运算符
a 3
b 5
c a if a b else b如果ab是真的那么就返回a如果ab是假的那么就返回b
print©#5
循环语句for循环
在这里for循环的语法以及break还有continue就不一一说明了
for 临时变量 in 序列重复执行的代码……..
else:循环正常结束之后要执行的代码#如果有break的话循环不能正常结束所以不能执行else缩进下的代码#如果是continue的话循环就可以正常结束所以可以执行else缩进下的代码while循环()类似
j1
while j5:
#打一行i1while i5:print(*,end)ii1print()#换行jj1 *************************j1
while j5:
#打一行i1while ij:print(*,end)ii1print()#换行jj1 ***************公共操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HTHaE65L-1690385710669)(C:\Users\86185\Desktop\python\图片1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNjfHS7D-1690385710669)(C:\Users\86185\Desktop\python\图片2.png)]
fruits[apple,orange,bananna]
for i,j in enumerate(fruits):print(f下标是{i},所对应的元素是{j})#下标是0, 所对应的元素是apple#下标是1, 所对应的元素是orange#下标是2, 所对应的元素是bananna
for i, j in enumerate(fruits,start8):print(f下标是{i},所对应的元素是{j})#下标是8, 所对应的元素是apple#下标是9, 所对应的元素是orange#下标是10, 所对应的元素是bananna推导式
什么是推导式推导式是用来简化代码的
列表推导式
一、列表推导式列表名 [ i for i in range(0,11) ]得到0-10内只有偶数的列表
1.[ i for i in range(0,11,2) ]
2.[i for i in range(0,11)if i %20]
二.字典推导式 【作用:快速合并列表为字典或提取字典中目标数据】将两个列表快速合并成一个字典
列表1 [ 华为 , 小米 , 苹果 , 三星 ]
列表2 [ 520 , 520 , 14 , 24 ]
字典名 { 列表1[i]列表2[i] for i in range(len(列表1)) }(指的是最短的长度的那个列表一般是键值)提取字典中的目标数据
字典名 { 华为 : 520, 小米 : 520, 苹果 : 14三星 : 24 }
# 提取销售数量大于100台的字典数据
新字典名 { ij for ij in 字典名.items( ) if j 100 }print(新字典名)
4.文件和文件夹
一、文件的3种操作打开读写关闭
1、文件打开 注意不带路径的文件名默认去找该文件夹文件对象open( ‘文件名’ , ‘访问模式’)
1访问模式三个主访问模式‘r’ 只读如果文件不存在报错不支持写’w’ 写入如果文件不存在新建文件写入时覆盖原有内容’a’ 追加如果文件不存在新建文件写入时在原有内容基础上追加新内容总结访问模式可以省略默认为’r’模式
2访问模式特点‘b’ 二进制、‘’ 可读可写r、rb、r、rb只要文件不存在都报错文件指针光标的位置放在文件开头w、wb、w、wb只要文件不存在就新建文件文件指针在开头用新内容覆盖原内容a、ab、a、ab只要文件不存在新建文件文件指针在结尾
2.文件对象.write(‘内容’)文件对象.
read(num) # num表示要从文件中读取数据的长度单位是字节【换行\n占一个字节】省略就表示读取所有数据文件对象.
readlines( ) # 需要赋值给一个变量# 将整个文件中的内容一次性读取并返回一个列表原文件中每一行的数据为一个元素例如[‘aaa\n’,‘bbb\n’,ccc]# 每一行都有换行自带\n最后一行没有换行不带\n文件对象
readline( ) # 需要赋值给一个变量# 一次性读取一行内容第一次调用读取第一行第二次调用读取第二行不带换行符\n
3、关闭文件对象.close( )
4、seek( )移动文件指针文件对象.seek(偏移量起始位置) # 起始位置0开头1当前位置2文件结尾# 偏移量假设起始位置是开头偏移量是5那文件指针就在第6个字节上# 偏移量和起始位置都为0时可以只写一个0
例如文件对象 open(‘文件名’,‘r’)
文件对象.seek(2,0)#第三个字节上
print(文件对象.read())
文件对象.close
5、文件备份
1用户输入目标文件文件名 input(‘请输入您要备份的文件名’)
2规划备份文件的名字
( 2.1提取后缀找到名字中最右侧的点名字和后缀分离点的位置 文件名.rfind(‘.’)
2.2组织新名字 原名字 [备份] 后缀
if 点的位置 0:#不能等于0 不能是.txt
后缀文件名[点的位置:]
else:
print(‘文件名输入错误’)
新名字 文件名[:点的位置]‘[备份]’ 后缀
3备份文件写入数据数据和原文件一样
3.1打开原文件和备份文件文件对像旧 open(文件名,‘rb’)文件对像新 open(新文件,‘wb’)
3.2原文件读取新文件写入如果不确定目标文件大小循环读取写入当读取出来的数据没有了终止循环while True:
读取数据文件对象旧.read(1024)
if len(读取数据) 0 # 读取完成
break
文件对象新.write(读取数据)
(3.3关闭文件文件对像旧.close( )
文件对像新.close( )
6、文件和文件夹操作
1os模块操作文件和文件夹import os # 导入模块os.函数名( ) # 使用os模块相关功能
2文件和文件夹重命名os.rename(‘旧文件名’‘新文件名’) # 目标文件名可以写路径否则默认当前文件夹下 面os.rename(‘旧文件夹名’,‘新文件夹名’)
3删除文件 没有指定文件会报错os.remove(目标文件名)
4创建文件夹 (重复创建相同名字的文件夹报错)os.mkdir(文件夹名字)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bV1Jrr6Q-1690385710670)(C:\Users\86185\Desktop\python\屏幕截图 2023-07-22 124828.png)]
5.闭包和装饰器
#闭包内部函数引入了外部函数的局部变量那么内部函数就被认为是闭包
#闭包的作用
#1、外部函数中定义了内部函数
#2、外部函数是有返回值的
#3、返回值是内部函数名
#4、内部函数使用了外部函数的变量值def fun1():a 1def fun2(b,c):print(abc)#代码一直到这指的都是fun1()的过程return fun2
fun1()#调用fun1(),返回的是fun2
fun1()(2,3)#123
#6语法糖也译为糖衣语法是由英国计算机科学家彼得·约翰·兰达发明的一个术语指计算机语言中添加的某种语法这种语法对语言的功能并没有影响但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性从而减少程序代码出错的机会
装饰器把被装饰的函数名当做参数传递给装饰器所对应的函数并且返回包装后被装饰的函数
def fun1(x):a 1def fun2(name):print(a)x(name)return fun2
fun1#将fun3作为形参传递到x中然后返回的是包装后被装饰的函数
def fun3(name):print(fun3()的调用)
fun3(陈惠婷)#当有多个装饰器和参数的时候
def fun1(x):a 1def fun2(*args,**kwargs):print(a)x(*args,**kwargs)#x是函数3的名字,要加参数所以fun2也要有参数return fun2
fun1#将fun3作为形参传递到x中然后返回的是包装后被装饰的函数
def fun3(name,age):print(f你的名字是{name},你的年龄是{age})
fun3(陈惠婷,17)#fun1
def fun4(sex):print(f你的性别是{sex})
fun4(女)fun1
def fun5(*args,**kwargs):print(args)print(kwargs)
fun5(陈惠婷,女,18,a1,b2,c3)
#1
#你的名字是陈惠婷,你的年龄是17
#1
#你的性别是女
#1
#(陈惠婷, 女, 18)
#{a: 1, b: 2, c: 3}6.函数
def 函数名(a,b) # 定义函数同时设置两个形参a和b用于接收用户数据
变量名 a b # 将a b赋值给一个变量
print(变量名) ## 打印这个变量
函数名(520,1314)# 调用函数时传入了真实数据520和1314真实数据是实参
【定义函数说明文档】
def 函数名(形参)
“”“说明文档位置”“” #一定要在定义函数的下一行写在别的位置写是没有任何效果的
代码 …….
【查看函数的说明文档】
help(函数名)
def fun(a,b):相加函数print(ab)#3
fun(1,2)
help(fun)#Help on function fun in module __main__:#fun(a, b)#相加函数#1.位置参数在定义函数时参数的名字和位置已被确定。def 函数名(姓名年龄性别)print(f您的姓名是{姓名},性别是{性别},年龄是{年龄})函数名(陈惠婷,17,女)#2.关键字参数传入实参时明确形参的变量名参数之间不存在先后顺序def 函数名(姓名年龄性别)print(f您的姓名是{姓名},性别是{性别},年龄是{年龄})函数名(孙兴华,性别男,年龄20)函数调用时通过“键值”的形式加以指定清除了参数的顺序问题。注意调用函数时如果有位置参数位置参数必需在关键字参数的前面否则会报错#默认参数缺省参数参数指定默认值调用时不传实参就用默认值。def 函数名(姓名年龄性别男)print(f您的姓名是{姓名},性别是{性别},年龄是{年龄})函数名(孙兴华,20)函数名(赵丽颖,33,性别女)注意调用函数时如果有位置参数位置参数必需在默认参数的前面否则会报错
可变参数
可变参数收集参数1、位置可变参数接收所有的位置参数返回一个元组def 函数名(*args):print(args)函数名()
2、关键字可变参数接收所有关键字返回一个字典def 函数名(**kwargs):print(kwargs)函数名(name陈惠婷,age17,sex女)def fun(*a):print(a)
fun(1,2,3,4)
#(1, 2, 3, 4)#{a: 1, b: 2}
def fun1(**b):print(b)
fun1(a1,b2)#关于拆包
a,b(520,1314)#元组拆包
print(a)
print(b)
x,y,za{姓名:陈惠婷,年龄:17,性别:女}#字典拆包
print(x)#这样打印出来的是每一个数据的键
print(y)
print(z)
print(a[x])#字典名加键返回的就是值
print(a[y])
print(a[z])函数的递归
函数的递归函数自己调用自己而且必须留有出口
lambda
print(lambda a,b:ab(1,2))#3
#lambda只是为了简化代码
#a,b都是形参
#ab都是return后面的表达式
#1和2都是实参
lambda a,b:ab相当于函数名字开始调用还学习了函数式编程的内置高阶函数filter(),map(),functools的reduce()
7.面向对象
关于面向对象;
首先要定义一个类然后再创建对象最后将类进行一个实例化
类的定义中就是进行封装代码的类里面有类的特征就是属性就是变量行为即方法就是函数也就是说类和对象是通过实例化关联在一起的
在Python中xx( )的函数叫做魔法方法指的是具有特殊功能的函数。
魔法方法1构造函数__init__()构造函数是用来初始化变量的在创建一个对象的时候默认被调用不需要手动进行调用
1、在创建一个对象时默认被调用不需要手动调用
2、init(self )参数不需要开发者传递Python解释器会自动把当前的对象引用传递过去
3、一个类可创建多个对象对不同的对象设置不同的初始化属性需要传参数
self指的是调用该函数的对象 【self 对象名】由于打印对象名和打印self得到的内存地址相同所以self指的是调用该函数的对象
一个类可以创建多个对象但是self地址不相同因为不同的对象存储的地址不一样
对象名1 类名( )
对象名2 类名( )
魔法方法2
如果类定义了__str__方法那么就会打印在这个方法中的return的数据。
class student():name#直接和类关联在一起的叫做类变量也可以直接看做全局变量age0def __init__(self,name,age):self.namename#实例变量 #语法self.变量名self.ageage#在创建对象的时候对对象进行初始化def __str__(self):return f你的名字是{self.name},你的年龄是{self.age}
astudent(cht,17)#创建对象并进行初识化#对象名类名(参数)
print(a)class student():name#直接和类关联在一起的叫做类变量也可以直接看做全局变量age0def __init__(self,name,age):self.namename#实例变量 #语法self.变量名self.ageage#在创建对象的时候对对象进行初始化def __str__(self):return f你的名字是{self.name},你的年龄是{self.age}
astudent(cht,17)#创建对象并进行初识化#对象名类名(参数)
print(a)面向对象类的继承
继承的概念如果两个类存在父子级继承的关系子类即便没有任何的属性和方法那么用子类继承了某一个父类并且此子类创建了一个对象那么这个对象就拥有父类当中的所有属性和方法的使用权。
在Python中所有类默认继承object类object类是顶级类或基类其它子类叫做派生类。
所谓多继承就是一个类同时继承了多个父类。注意当一个类有多个父类的时候默认使用第一个父类的同名属性和方法。
利用__mro__进行手查找继承的顺序
print(类名.mro)#得出继承的顺序
class 叶问(object):#作为基类def __init__(self):self.功夫咏春def get(self):print(f使用{self.功夫})
class 李小龙(叶问):def __init__(self):self.功夫截拳道def get(self):print(f使用{self.功夫})
class 陈惠婷(李小龙,叶问):pass
a陈惠婷()#创建对象
a.get()#当子类有多个父类的时候一般是默认使用继承的第一个类的属性个方法
#使用截拳道
print(陈惠婷.__mro__)#(class __main__.陈惠婷, class __main__.李小龙, class __main__.叶问, class object)子类和父类具有同名属性和方法:
默认使用子类的同名属性和方法。
需求既能调用子类的也能调用父类的
class 叶问(object):#作为基类def __init__(self):self.功夫咏春def get(self):print(f使用{self.功夫})
class 李小龙(object):def __init__(self):self.功夫截拳道def get(self):print(f使用{self.功夫})
class 陈惠婷(李小龙,叶问):def __init__(self):self.功夫健身def get(self):self.__init__()print(f使用{self.功夫})def get1(self):叶问.__init__(self)叶问.get(self)def get2(self):李小龙.__init__(self)李小龙.get(self)
a陈惠婷()#创建对象
a.get()#当子类有多个父类的时候一般是默认使用继承的第一个类的属性个方法
a.get1()
a.get2()[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-85Rq8JHy-1690385710672)(C:\Users\86185\Desktop\python\图片1.png)]
1、私有权限的作用如果在继承关系中某些属性或方法不想继承给子类时我们把这些属性和方法添加私有权限。
2、设置私有权限的方法在属性名和方法名 前面 加上两个下划线__。
3、注意私有属性和方法只能在类里面访问和修改
4、在Python中一般定义函数名get_xx用来获取私有属性定义set_xx用来修改私有属性值。用get和set是工作习惯可以改名但是看到这两个单词大家都知道是获取和修改
5、先获取后修改
使用super()可以自动查找父类。调用顺序遵循mro类属性的顺序。比较适合单继承使用。
面向对象类的多态
多态调用不同子类对象的相同父类方法。步骤
1定义父类并提供公共方法
2定义子类并重写父类方法
3传递子类对象给调用者可以看到不同子类执行效果不同
class balls(object):def __init__(self):self.ball球def get(self):print(f走吧我们一起去打{self.ball})
class basketball(balls):def __init__(self):self.ball篮球def get(self):print(f走吧我们一起去打{self.ball})
class badminton(balls):def __init__(self):self.ball羽毛球def get(self):#函数重写print(f走吧我们一起去打{self.ball})
class volleyball(balls):def __init__(self):self.ball排球def get(self):print(f走吧我们一起去打{self.ball})def gogogo(x):#子类对象传进来print(x.get())#实现多态aballs()
bbasketball()
cbadminton()
dvolleyball()
gogogo(a)#打球
gogogo(b)#打篮球
gogogo(c)#打羽毛球
gogogo(d)#打排球结尾
子类时我们把这些属性和方法添加私有权限。
2、设置私有权限的方法在属性名和方法名 前面 加上两个下划线__。
3、注意私有属性和方法只能在类里面访问和修改
4、在Python中一般定义函数名get_xx用来获取私有属性定义set_xx用来修改私有属性值。用get和set是工作习惯可以改名但是看到这两个单词大家都知道是获取和修改
5、先获取后修改
使用super()可以自动查找父类。调用顺序遵循mro类属性的顺序。比较适合单继承使用。
面向对象类的多态
多态调用不同子类对象的相同父类方法。步骤
1定义父类并提供公共方法
2定义子类并重写父类方法
3传递子类对象给调用者可以看到不同子类执行效果不同
class balls(object):def __init__(self):self.ball球def get(self):print(f走吧我们一起去打{self.ball})
class basketball(balls):def __init__(self):self.ball篮球def get(self):print(f走吧我们一起去打{self.ball})
class badminton(balls):def __init__(self):self.ball羽毛球def get(self):#函数重写print(f走吧我们一起去打{self.ball})
class volleyball(balls):def __init__(self):self.ball排球def get(self):print(f走吧我们一起去打{self.ball})def gogogo(x):#子类对象传进来print(x.get())#实现多态aballs()
bbasketball()
cbadminton()
dvolleyball()
gogogo(a)#打球
gogogo(b)#打篮球
gogogo(c)#打羽毛球
gogogo(d)#打排球结尾
上面就是我这一周所有学习的内容也是相当于复习了吧学的时候发现东西是学不完的也是不可能都记住的只要我们做到学过了解过并且当要用到的时候回来查找的程度就可以了也不能死记硬背做到会用就可以了这也是很多初学者在学习编程中非常非常容易放弃学下去的一个原因。**下周计划:**重新系统地学习python三件套numpypandasmatplotlib。在github上找几个关于图像特征提取以及红外小目标检测的小项目不要着急循序渐进。