Python面向对象编程五步曲
- 基础阶段
- 01-Python的注释
- 02 乱码原因
- 02-Python变量
- 03-数据类型
- 04-数据类型转换
- 05-Python运算符
- 06-Python输入
- 07-Python输出
- 08-占位格式符(补充)
- 09-Python分支
- 10-Python循环(while)
- 11-Python循环(for)
- 12-Python循环打断
- 待更新
基础阶段
01-Python的注释
- 什么是注释?
一段文字性的描述 - 注释的特性?
(1)、当程序被处理的时候,这些注释会被自动忽略。
(2)、不会被当做代码处理 - 注释应用场景:
(1)、帮助我们自己理清楚代码逻辑
(2)、与别人合作开发时,添加注释,可以减少沟通成本
(3)、开发模块的时候添加注释可以减少他人使用成本
(4)、可以临时注释一段代码, 方便调试 - 注释的分类:
#单行注释
'''
多行注释
'''
"""
多行注释
"""
特殊注释1:为了能够在linux下以./+文件名.py方式运行代码,需要在py文件中添加
#!/usr/bin/python
#!/usr/bin/env python
特殊注释2:以什么编码方式解析文件,python2默认不支持中文,需要加上;python3直接中文支持,不需要加
# encoding=utf-8
# coding=utf-8
正规的Python推荐写法:# _*_ coding:utf-8 _*_
02 乱码原因
字符编码规定了:
(1)按照怎样的规范把字符转换成数字?
(2)按照怎样的方式存储数字(如: 用多少个字节?)
在将字符存储到内存时就会面临两个问题:
(1)编码:按照什么规范将字符转换成0-1二进制进行存储
(2)解码:按照什么规范将存储的0-1二进制转换成字符
正是解码和编码这两个过程不统一,才会导致读取的文件发生乱码。
为什么有这么多字符码?
- 一开始英语主要包括26个字母(大小写)、10个数字、标点符号、控制符等等的编码关系,最终就制定了ASCII字符编码, 映射了字符和字符码的关系, 并使用一个字节的后七位(0 - 127)来存储
- 随着计算机的普及,对ASCII码进行了扩展,叫 EASCII编码; 还是一个字节, 从128 – 255;
- 后来, 由国际标准化组织(ISO) 以及国际电工委员会(IEC)联合制定了一个标准 ISO/8859-1(Latin-1), 继承了CP437的128-159; 重新定义了160-255;
- 到了中国,自己搞了一个GB2312来存储中文, 6763个汉字;(双字节, 兼容ASCII);GB2312之上的扩充即GBK,包含了繁体字, 藏文, 蒙文等等。
- 为了统一各国编码,统一联盟国际组织, 提出了Unicode编码; 涵盖了世界上所有的文字, 每一个字符都有对应的唯一一个字符码
02-Python变量
1. 怎样定义变量:
- 方式1:
变量名 = 值
a = 2
print(a)#输出 2
- 方式2:
变量名1,变量名2 = 值1,值2
a,b = 1,2
print(a,b) #输出:1 2
- 方式3:
变量名1 = 变量名2 = 值
a = b = 2
print(a,b)输出:2 2
2. 为什么要产生变量
- 方便维护,使用变量来维护一系列值
- 节省空间,缩小源码文件占比,节省磁盘空间
03-数据类型
1. 为什么要区分数据类型?
- 区分存储空间,为不同的数据类型分配不同大小的存储空间
- 赋值语句a=2,该赋值语句会开辟一段存储空间,并将该存储空间的唯一标识返回给 a a a,以后就可以通过 a a a来找到这一段存储空间。
- 赋值语句将 2 2 2赋值给 a a a,那么会分配 4 4 4字节的空间去存储该数字,可以有效的避免存储空间的浪费。
- 根据不同数据类型的特性,做不同的数据处理
#例如,根据不通的数据类型进行不同的+操作
print(6+6)#输出:12
print("6"+"6")#输出:66
2.数据类型:
常用数据类型 | 例子 |
---|---|
Numbers(数值类型) | i n t 、 l o n g 、 f l o a t 、 c o m p l e x int、long、float、complex int、long、float、complex |
Bool(布尔类型) | T r u e 、 F a l s e True、False True、False |
String(字符串) | ′ s t r ′ 、 ′ ′ ′ s t r ′ ′ ′ 、 " s t r " 、 " " " s t r " " " 'str'、'''str'''、"str"、"""str""" ′str′、′′′str′′′、"str"、"""str""" |
List(列表) | [ 1 , 2 , 3 ] [1,2,3] [1,2,3] |
Set(集合) | [ s e t ( [ 1 , 2 ] ) [set([1, 2]) [set([1,2]) |
Tuple(元组) | ( " 小 王 " , 18 ) ) ("小王", 18)) ("小王",18)) |
Dictory(字典) | n a m e : " 王 顺 子 " , a g e : 18 {name: "王顺子", age: 18} name:"王顺子",age:18 |
NoneType(空类型) | N o n e None None |
P y t h o n 3 Python3 Python3无 l o n g long long类型,会自动根据数值大小,调整 i n t int int字节长度
3. 查看类型:
t
y
p
e
(
)
type()
type()
num = 6
print(type(num))#<class 'int'>
这个类型是属于数值的,不是属于变量的。type会根据num的引用找到数值所在地,然后输出该数值的类型。
04-数据类型转换
1. 概念:
将一个数据转换成指定的类型, 方便处理
2.应用场景举例:
银行存钱:
money = input("输入你要存储的金额")
total_money = 20+ money
此时就会报错:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
因为 i n t int int类型的20不能和 S t r i n g String String类型的 m o n e y money money进行相加。
因此,需要进行数据转换。
3.方式:
将
m
o
n
e
y
money
money改成
i
n
t
int
int类型:
i
n
t
(
)
int()
int()方法
money = input("输入你要存储的金额")
total_money = 20+ int(money)
其余类型转化函数如下:
4. 面 试 补 充 \color{red}{4.面试补充} 4.面试补充
- 动态类型/静态类型:
- 静态类型:类型是编译的时候确定的,后期无法修改
- 如 J A V A JAVA JAVA中的数据类型, i n t a = 2 int a=2 inta=2,在编译时就已经确定 a a a的类型是 i n t int int了;
- 动态类型:类型是运行时进行判定的, 可以动态修改
- 如 P y t h o n Python Python中的数据类型, a = 2 a=2 a=2,在运行时才会确定 a a a的类型是 i n t int int;且可以在后续运行中进行修改;
- 静态类型:类型是编译的时候确定的,后期无法修改
- 强类型/弱类型
- 强类型:类型比较强势, 不轻易随着环境的变化而变化。
- P y t h o n Python Python就是强类型语言,如 p r i n t ( " a " + 1 ) print("a"+1) print("a"+1)在运行时会报错, P y t h o n Python Python不会将 1 1 1转为 s t r i n g string string类型;
- 弱类型:类型比较柔弱, 不同的环境下, 很容易被改变。
- J a v a Java Java就是弱类型语言,如 S y s t e m . o u t . p r i n t ( " a " + 1 ) System.out.print("a"+1) System.out.print("a"+1)在运行时不会报错,输出 " a 1 " "a1" "a1", J a v a Java Java会将 1 1 1转为 s t r i n g string string类型再进行运算;
- 强类型:类型比较强势, 不轻易随着环境的变化而变化。
05-Python运算符
1.算数运算符:
算数运算符 | 名称 |
---|---|
+ | 加法运算符 |
- | 减法运算符 |
* | 乘法运算符 |
** | 幂运算符 |
/ | 除法运算符 |
// | 整除运算符 |
% | 求模运算符 |
= | 赋值运算符 |
扩展:
整除和求余的应用场景:
假设存在一个数组,序号如下所示。
以序号 9 9 9的元素为例子,
获取 9 9 9的行号:9//4=2,即第2行
获取 9 9 9的列号:9%4=1,即第1列
2.复合运算符:
复合运算符 | |
---|---|
+= | a + = b → a = a + b a+=b→a=a+b a+=b→a=a+b |
-= | a − = b → a = a − b a-=b→a=a-b a−=b→a=a−b |
*= | a ∗ = b → a = a ∗ b a*=b→a=a*b a∗=b→a=a∗b |
**= | a ∗ ∗ = b → a = a ∗ ∗ b a**=b→a=a**b a∗∗=b→a=a∗∗b |
/= | a / = b → a = a / b a/=b→a=a/b a/=b→a=a/b |
//= | a / / = b → a = a / / b a//=b→a=a//b a//=b→a=a//b |
%= | a % = b → a = a % b a\%=b→a=a\%b a%=b→a=a%b |
3.比较运算符:
比较运算符 | |
---|---|
> | 是否大于 |
< | 是否小于 |
!= | 是否不等于 |
<> | P y t h o n 2. Python 2. Python2.的不等于, 3.0 3.0 3.0版本不支持 |
>= | 是否大于等于 |
<= | 是否小于等于 |
== | 是否等于 |
is | 对比唯一标识 |
链状比较运算符 | 10 < a < = 66 10<a<=66 10<a<=66 |
关于 i s : is: is:
这里对比的是唯一标识,
如,赋值语句 a = 10 a=10 a=10,此时会开辟一段存储空间,并将存储空间的唯一标识返回给 a a a。
i s is is比较的就是上述的唯一标识,可以理解为存储地址。
如下图:
这里 a a a和 b b b相等的原因是,它们值相等,为了提高性能, P y t h o n Python Python将这两个变量分配了相同的唯一标识
==比较的是只,is比较的是唯一标识
4.逻辑运算符:
逻辑运算符 | |
---|---|
not | 非,取反 |
and | 与(二元运算符) |
or | 是否不等于 |
-
非布尔类型的值, 如果作为真假来判定, 一般都是非零即真, 非空即真。
-
整个逻辑表达式的结果不一定只是 T r u e True True和 F a l s e False False。
print(3 and 0) #输出 0
#上式bool值为False,输出为0标识走到0这才判断为False的
if 3 or 1:
print(3 or 1)#输出为3
#上式bool值为True,输出为3标识走到3这就能判断为True
#上面的3为非空,也不是0,所以布尔值为True
#为空,布尔值为False
print(bool(""))#输出为False
06-Python输入
1. python2中:
在
P
y
t
h
o
n
2
Python2
Python2中有两个输入函数:
-
r
a
w
_
i
n
p
u
t
(
)
raw\_input()
raw_input()
- 使用格式:
result = raw_input('提示信息')
- 功能:
- 会等待用户输入内容,直到用户按下 E n t e r Enter Enter
- 会将用户输入的内容当做"字符串",传递给接收的变量
- 使用格式:
-
i
n
p
u
t
(
)
input()
input()
- 使用格式:
result = input('提示信息')
- 功能:
- 会等待用户输入内容,直到用户按下 E n t e r Enter Enter
- 会将用户输入的内容当做“代码”进行处理!
- 使用格式:
例子:
# _*_ coding:utf-8 _*_
#Python2环境下
result = raw_input('提示信息')#输入:1+1
print type(result)#输出:<class 'str'>
print result #输出:1+1
result = input('提示信息')#输入:1+1
print type(result)#输出:<class 'int'>
print result #输出:2
#python2中会将输入的部分不做处理的赋值给左部变量
result = input('提示信息')#输入:a+b
print result #报错:name 'abc' is not defined
#报错的原因是:result = a+b了,不做处理赋值给左部
#想输入字符串:
result = raw_input('提示信息')#输入:"a+b"
print type(result)#输出:<class 'str'>
print result #输出:a+b
2. python3中
在
P
y
t
h
o
n
3
Python3
Python3中有一个输入函数:
-
i
n
p
u
t
(
)
input()
input()
- 相当于 P y t h o n 2 Python2 Python2中的 r a w _ i n p u t ( ) raw\_input() raw_input()
- 格式:
result = input('提示信息')
- 功能:
- 会等待用户输入内容,直到用户按下 E n t e r Enter Enter
- 会将用户输入的内容当做"字符串",传递给接收的变量
07-Python输出
Python2:
- print语句:
print xxx
print 123 #输出:123
Python3:
- printh函数:
print(values,sep,end,file,flush)
- values:需要输出的值;多个值之间使用","进行分割
- sep:分割符;多个值, 被输出出来之后, 值与值之间, 会添加指定的分隔符
- end:输出完毕之后, 以指定的字符, 结束;默认是换行 ‘\n’
- file:表示输出的目标;
- 默认是标准的输出(控制台):
file=sys.stdout
- 还可以是一个可写入的文件句柄:
f = open("xxx", "w");
file=f
- 默认是标准的输出(控制台):
- flush:表示立即输出的意思;
- 需要输出的内容, 是先存放在缓冲区, 然后再输出到目标
- flush, 就代表是否刷新缓冲区,让缓冲区的内容,立即输出到目标
- flush值为Bool类型,默认为False
使用场景:
-
输出一个值:
- Python2.x:
print 值
- Python3.x:
print(值)
- Python2.x:
-
输出一个变量:
- Python2.x:
print 变量名
- Python3.x:
print(变量名)
- Python2.x:
-
输出多个变量:
- Python2.x:
print 变量名1, 变量名2
- Python3.x:
print(变量名1, 变量名2)
- Python2.x:
-
格式化输出:
- Python2.x:
- %写法:
print "随意内容...占位符1, ... , 占位符2, ..."%(变量1, 变量2)
print "我的名字是%s,年龄是%d"%("小王",12)
- format写法:
- print “随意内容…{索引}, … , {索引}, …”.format(值1, 值2)
print "我的名字是{0},年龄是{1}".format("小王",12)
- %写法:
- Python3.x:
- %写法:
print("随意内容...占位符1, ... , 占位符2, ..."%(变量1, 变量2))
- format写法:
- print “随意内容…{索引}, … , {索引}, …”.format(值1, 值2)
- %写法:
- Python2.x:
-
输出到文件中:
- Python2.x:
file = open("test.txt","w")
print>>file,"who am i"
- Python3.x:
file = open("test.txt","w")
print("who am i",file=file)
- Python2.x:
-
输出不自动换行
- Python2.x:
print a.
- Python3.x:
print("hello",end="")
- Python2.x:
-
输出的各个数据,使用分割符分割
print("hello","world",sep="---")
08-占位格式符(补充)
格式:
%[(name)][flags][width][.precision]typecode
中括号[]包含的部分表示是可选的,即可省略的。
-
(name):用于选择指定的名称对应的值
即根据key获取具体值;print("数学分数是%(math)d,英语分数是%(Eng)d" % {"Eng":60,"math":59})
- 当使用(name)时,后面带的是一个字典。好处在于可以摆脱原来的按序赋值
-
width:表示显示宽度
print("%4d" % (59))
输出的宽度为4,前面带有两个空格。默认是右对齐
-
flags:
-
空:表示右对齐
-
- :表示左对齐
print("%-4d|" % (59))
-
空格:表示在左侧填充一个空格
- 应用场景:在正数的左侧填充一个空格,从而与负数对齐
print("|% d" % (59))
-
0:表示使用0填充
print("%04d" % (59))
-
-
.precision:表示小数点后精度
print("%.2f" % (59.99999))
typeCode:
-
i/d
将整数、浮点数转换成十进制表示,并将其格式化到指定位置
- 将二进制转成十进制输出:
print("%d" % (0b1001))
-
o
将整数转换成八进制表示,并将其格式化到指定位置 -
x
将整数转换成十六进制表示,并将其格式化到指定位置 -
e/E
将整数、浮点数转换成科学计数法,并将其格式化到指定位置(e/E输出的是小写/大写的e/E)print("%E" % (10000))
-
f/F
将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位) -
g/G
自动调整将整数、浮点数转换成浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e/E;)print("%g" % (100000)); print("%g" % 20)
-
c
将数字转换成其unicode对应的值,10进制范围为 0 < = i < = 1114111 0<=i<=1114111 0<=i<=1114111(py27则只支持0-255);print("%c" % 26666)
-
特殊:%
想输出90%之类的加载值时,需要输入两个%,第一个%充当转义符print("%d%%" % 30)
09-Python分支
单分支判断:
格式:
if 条件:
当条件满足,执行语句
实例:
age=int(input("请输入年龄"))
if age>=18:
print("你已成年")
双分支判断:
格式:
if 条件:
条件满足时,执行语句
else:
条件不满足时,执行语句
实例:
age=int(input("请输入年龄"))
if age>=18:
print("你已成年")
else:
print("未满18岁")
练习案例:
根据分数区间, 打印出对应的级别
- 大于等于90 并且 小于等于100
输出优秀 - 大于等于80 并且 小于90
输出良好 - 大于等于60 并且 小于80
输出及格 - 大于等于0 并且 小于60
输出不及格
score = int(input("请输入成绩"))
if 90<=score<=100:
print("优秀")
if 80<=score<90:
print("良好")
if 60<=score<80:
print("及格")
if 0<=score<60:
print("不及格")
上述案例中,输入的成绩只会满足其中一个分支条件。但是在实际运行时,每个分支都会进行判断,导致效率低下。
可以考虑使用if嵌套:
格式:
if 条件1:
条件满足时,执行语句
else:
#执行条件2判断
if 条件2:
条件满足时,执行语句
else:
……
实例:
score = int(input("请输入成绩"))
if 90<=score<=100:
print("优秀")
else:
if 80<=score<90:
print("良好")
else:
if 60<=score<80:
print("及格")
else:
print("不及格")
多分支判断:
格式:
if 条件1:
满足条件1,执行语句
elif 条件2:
满足条件2,执行语句
else:
都不满足,执行语句
案例:
score = int(input("请输入成绩"))
if 90<=score<=100:
print("优秀")
elif 80<=score<90:
print("良好")
elif 60<=score<80:
print("及格")
else:
print("不及格")
注意
-
t
a
b
缩
进
\color{red}{tab缩进}
tab缩进:
其他语言会根据大括号{}来识别代码块,但Python中没有{}语法。
Python会根据缩进来识别代码块
如下面的两个分支语句,其中的else处于不同的缩进状态;第一个分支语句的else属于分支2的if,第二个分支语句的else属于分支1的if。
if 分支1判断条件:
if 分支2判断条件:
执行语句
else:
执行语句
if 分支1判断条件:
if 分支2判断条件:
执行语句
else:
执行语句
- 不建议写嵌套层级太深的代码
- Python中没有类似于其他语言中的swith…case语法
10-Python循环(while)
使用场景:
- 想要多次重复执行某些操作的时候
- 想要遍历一个集合的时候
while循环
格式:
while 条件:
条件满足时执行代码
- 条件满足时, 才会执行循环体内部代码
- 循环体内部代码被执行完毕后, 会继续下次条件判断, 确定是否需要继续执行循环体代码
- 直到条件不满足时, 才会结束这次循环, 继续往下执行后续代码
流程图:
实例:
打印某句话10遍:
num = 0
while num<10:
num+=1
print(num,"打印10遍")
计算1-10数值的总和
num = ans = 0
while num<10:
num+=1
ans+=num
print(ans)
while else
格式:
while 条件:
满足条件时
else :
条件不满足时,执行的代码
- 能够顺利执行完毕, 才会执行else
- 否则不会(使用了break)
流程图:
实例:
num = ans = 0
while num<10:
num+=1
ans+=num
else:
print(ans)#输出55
注意
- 一定注意循环结束条件, 防止死循环
- 在Python中, 没有类似于其他语言的do…while循环
11-Python循环(for)
使用场景:
- 重复性的执行一些操作
- 更多的是遍历一个集合(字符串、列表)
语法:
for x in xxx:
循环语句
- xxx通常是一个集合
- x:
- 会取出集合中的每个元素,赋值给x
- 在循环体中, 可以直接使用x的值
- 当集合中的元素被遍历完毕,循环 就会结束
通常搭配range(n)函数使用,range(n)会生成0~n-1的整数列表
案例:
str = "abcdefg"
for s in str:
print(s)
'''
输出:
a
b
c
d
e
f
g
'''
for i in range(10):
print(i)
'''
输出:
0
1
2
3
4
5
6
7
8
9
'''
for与else连用:
格式:
for x in xxx:
条件满足时的执行代码
else:
条件不满足时执行的语句
- 如果for循环可以顺利的执行完毕,则会执行else
- 反之,使用了break则不会
案例:字符串反转:
str1 = "abcdefg"
str2 = ""
for s in str:
str2 = s+str2
else:
print(str2)#输出:gfedcba
12-Python循环打断
循环打断,会对while和for与else的连用产生影响:
- 如果循环正常执行完毕, 则会执行else部分
- 如果中途是因为打断而退出循环, 则不会执行else部分
break:
打断本次循环, 跳出整个循环
如下,当i==2时执行break语句;break语句中断本次循环并跳出当前循环
for i in range(10):
if i==2:
break;
print(i)
'''
0
1
'''
注意:break只会跳出一层循环
for j in range(2):
for i in range(10):
if i==2:
break;
print(i)
'''
输出:
0
1
0
1
'''
continue:
结束本次循环, 继续执行下次循环
for i in range(10):
if i==2:
continue
print(i)
'''
输出:(没有2了)
0
1
3
4
5
6
7
8
9
'''