目录
Python基础(二)--数据类型,运算符与流程控制
1 数据类型
1.1 Python中的数据类型
1.2 整数类型(int)
1.3 布尔类型
1.4 浮点类型
1.5 复数类型
1.6 类型转换
2 运算符
2.1 算术运算符
2.2 布尔运算符
2.3 比较运算符
2.4 位运算符
2.5 赋值运算符
2.6 运算符优先级
3 流程控制
3.1 选择结构
3.2 循环结构
Python基础(二)--数据类型,运算符与流程控制
1 数据类型
1.1 Python中的数据类型
在Python中,数据可以分为如下类型:
数值类型 | 整数类型:int 浮点类型:float 复数类型:complex |
布尔类型:bool | |
序列类型 | 列表:list 元组:tuple 字符串:str 字节:bytes |
映射类型:dict | |
集合类型:set | |
其他内置类型 |
注意:①变量本身严格来说是没有类型的,其所关联的对象类型,这与其他语言的差别较大(C,Java等)。因此,我们常习惯的成Python的类型为“鸭子类型”,这是一种动态类型的体现;②由于变量必须要关联一个具体的对象,才能确定变量的值,所以在定义变量时,不能只给出变量的名字,必须同时要给出变量多关联的对象;③Python2中还支持长整数类型(long),在Python3中取消。
1.2 整数类型(int)
我们数学上使用的整数,例如,3,-50等,这些都是整数类型。整数类型支持四种进制表示:①二进制(使用0b或0B前缀)②八进制(使用0o或0O前缀)③十进制(无前缀)④十六进制(使用0x或0X前缀,10 ~ 15使用a ~ f或A ~ F表示)
# 二进制
x = 0b10111
print(x)
# 八进制
x = 0o666
print(x)
# 十进制
x = 6
print(x)
# 十六进制
x = 0x1f66
print(x)
结果为:,以十进制的形式显示
进制转换:①bin其他进制转换为二进制②oct其他进制转换为八进制③int其他进制转换为十进制④hex其他进制转换为十六进制
x = 666
print(bin(x))
print(oct(x))
print(int(x))
print(hex(x))
结果为:
注意:返回的不是数值,是字符串
分割符_:当数值较大时(尤其是二进制),对程序的可读性会造成影响,此时,我们可以在数值之间使用一个_进行分隔,从而提高程序的可读性(Python3.6)。
number = 1234_5665_4321
1.3 布尔类型
布尔类型(bool)表示的是一种条件的判断,具有两个值:True与False。其中,True表示条件成立,即为“真”,而False表示条件不成立,即为“假”。
布尔类型是整数类型的子类型。实际上,True就是1,False就是0。因而,我们也可以使用布尔类型参与数学上的运算,与使用1与0参与运算的结果是一样的。
1.4 浮点类型
浮点类型(float)就是数学上的小数类型。例如:6.0,-6.6等,都是浮点类型。在进制表示上,浮点类型仅支持十进制表示(这点不同于整数类型)。除了常规的表示方式外,浮点类型也可以使用数学上科学计数法的形式表示,例如:6.6e30
注意:①十进制的整数类型不能使用0开头,但是,浮点类型可以以0开头。②浮点类型具有两个特殊值:NaN(Not A Number)与Infinity(无穷大),其中无穷大又可分为正无穷(+Infinity)与负无穷(-Infinity)。我们可以通过float函数来获得这些值。NaN有一个特征,就是自己不等于自己,因此,我们不能通过==来判断一个数值是不是NaN。
import sys
# 浮点类型的范围与实现有关,通常使用程序中的double类型来实现
f = 6.6e666
print(f)
print(sys.float_info)
print(sys.float_info.max)
print(sys.float_info.min)
结果为:
# float类型的特殊值
print(float("NaN"))
print(float("Infinity"))
n = float("NaN")
# NaN是特殊的值,不等于任何值,包括自身
print(n == n)
# 因为NaN不等于任何值,所以不能用==进行判断,而是使用math提供的函数isnan进行判断,如果参数是nan,则返回true,否则返回False
import math
print(math.isnan(n))
结果为:
浮点类型的不精确性:
在使用浮点类型时,我们需要留意,浮点类型在计算机中仅是近似的存储,浮点类型是不精确的。因此,我们要避免进行如下的操作:①避免数量级相差很大的浮点值之间进行运算②避免进行等量的比较。
# 避免数量级相差很大的两个浮点数进行计算
f1 = 6e20
f2 = 6
print(f1 + f2)
# 避免进行等量的判断
f1 = 0.1
f2 = 0.2
print(f1 + f2)
print(f1 + f2 == 0.3)
考虑到浮点类型的不精确性,因此,如果我们需要进行精确计算时,我们可以使用decimal模块中的Decimal类来实现,该类提供精确的浮点计算。此外,我们也可以指定Decimal的计算精度,即计算结果最多保留的有效数字位数,默认为28位有效数字。
但是Decimal要慎用,因为非常消耗性能
# Decimal类型进行精确的浮点计算
import decimal
x = decimal.Decimal(0.1)
y = decimal.Decimal(0.2)
print(x)
print(y)
# Decimal计算,默认有28位有效数字
# 获取decimal计算上下文环境后,即可设置有效位数
context = decimal.getcontext()
context.prec = 10
x = decimal.Decimal(0.1)
y = decimal.Decimal(0.2)
print(x + y)
1.5 复数类型
复数类型(complex)类似于数学上的复数。含有虚部(使用j或J后缀)的数值为复数类型。例如:3 + 5j,-2 - 3j(数学中虚部后缀为i)。复数分为实部与虚部两个部分,我们可以通过real与imag属性分别获取复数的实部与虚部的值。
x = 6 + 8j
print(x.real)
print(x.imag)
1.6 类型转换
(1)获取数据类型
我们可以通过type函数获取变量的类型,准确的讲,应该是变量所关联的对象的类型。
a = 6
b = 6.6
c = 6 + 8j
# int,float,complex可以进行混合运算,结果类型为参与运算的数据类型中较高的一个:int<float<complex
print(type(a + b))
print(type(a + c))
print(type(b + c))
(2)类型转换函数
Python中为我们提供了如下的转换函数:
①int(value):将数值类型或字符串转换为整数(int)类型。如果没有参数,返回0
②float(value):将数值类型或字符串转换为浮点(float)类型。如果没有参数,返回0
③complex(real,imag):根据实部与虚部(可选)创建一个复数。如果没有参数,返回0j
④bool(value):参数为真值时,返回True,否则返回False
a = 6
b = 6.6
c = True
d = 6 + 8j
# float类型转换为int类型时,去掉小数点后面的内容,取整数部分,int,float转换成complex时,虚部为0
print(int(b))
print(complex(a))
print(complex(b))
# 注意:复数类型就不能够通过int或float转换为整数或浮点类型。
# print(int(d)) 这是不合法的# 在Python中任何类型都能转换成bool类型。True就是1,False就是0
print(bool(0),bool(6),bool(6.6),bool(6+6j))
print(int(True),int(False),float(True),float(False),complex(True),complex(False))
其他:①int函数还可以提供第二个参数,指定解析转换时,使用的进制。此时,第一个参数需要是字符串类型(或字节等类型),不能是数值类型。例如:int(“600”, 16),则会根据16进制来解析600。如果没有指定第二个参数,则默认为十进制。
2 运算符
运算符,即具有特殊计算规则的符号。运算符涉及到的,参与运算的数据,称为操作数。不同的运算符,涉及的操作数也不相同。由运算符与操作数结合起来的计算式,称为“表达式”。
运算符可分为:算术运算符;布尔运算符;比较运算符;位运算符;赋值运算符
2.1 算术运算符
用来进行类似数学上的加减乘除运算
符号 | 说明 |
x + y | 加法运算,返回x与y的和。 |
x – y | 减法运算,返回x与y的差。 |
x * y | 乘法运算,返回x与y的积。 |
x / y | 除法运算,返回x与y的商(浮点类型)。 |
x // y | 除法运算,返回x与y的商(向下取整)。 |
x % y | 取模运算,返回x模y的结果。 |
x ** y | 乘方运算,返回x的y次方。 |
+x | 正号,x的值不会改变,该符号可以省略。 |
-x | 负号,取x的相反数。 |
在除法运算时,除数不能为0,否则会产生错误(ZeroDivisionError)。
取模运算(“Module Operation”)和取余运算(“Complementation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。
取余与取模的差别:取余向0取整(余数符号与被除数相同),取模向下取整(余数符号与除数相同)。
被除数 - 除数 * 商 = 余数,被除数 = 除数 * 商 + 余数
# 正数的取余运算与取模运算结果一样
print(7 % 4)
# 负数的取模运算:
# 被除数为-7,除数为4,商为-1.75,向下取整为-2(取模),向0取整为-1(取余)
# 根据公式:被除数 - 除数 * 商 = 余数 得 -7 - 4*(-2)=1
print(-7 % 4)
2.2 布尔运算符
布尔运算符也称逻辑运算符
符号 | 说明 |
x and y | 如果x为True,返回y,否则返回x。 |
x or y | 如果x为True,返回x,否则返回y。 |
not x | 如果x为True,返回False,否则返回True。 |
x与y可以是任意类型,因为在Python中,任意类型都可以转换为布尔类型。
# and连接两个表达书,表示并且。两个表达式都为True,整个表达式才为True
print(6 == 8 and 6 ==6)
# or连接两个表达式,表示或。两个表达式中有一个为True,整个表达式为True
print(6 == 8 or 6 ==6)
# not表示对条件的否定。True-》False。False-》True
print(not True)
注意:and与的表达式未必一定是bool类型,可以是任意类型,因为任何类型都可以转换成bool类型
# and,如果如果第一个表达式为False,第二个表达式不是True或False,则返回第一个表达式;如果第一个表达式为True,则返回第二个表达式
# or,与and相反,如果第一个表达式为True,返回第一个表达式,否则返回第二个表达式
print(6 and "a")
print(6 or "a")
#and与or的短路操作,当and的第一个表达式为False,或者or的第一个表达式为True,此时就可以确定整个表达式的值,第二个表达式会直接跳过,不会执行
print(0 and print("不执行"))
2.3 比较运算符
比较运算符执行的是比较运算,如果表达式成立,返回True,否则返回False。
符号 | 说明 |
x > y | 如果x大于y,返回True,否则返回False。 |
x >= y | 如果x大于等于y,返回True,否则返回False。 |
x < y | 如果x小于y,返回True,否则返回False。 |
x <= y | 如果x小于等于y,返回True,否则返回False。 |
x == y | 如果x等于y,返回True,否则返回False。 |
x != y | 如果x不等于y,返回True,否则返回False。 |
x is y | 如果x与y是同一个对象,返回True,否则返回False。 |
x is not y | 如果x与y是不同的对象,返回True,否则返回False。 |
在Python语言中,比较运算符支持链式比较,在java语言中是不支持的。x < y < z相当于x < y and y < z,不同之处仅在于,后者中y只会计算一次。链式比较与拆分成and或or连接的表达式一样,也会进行短路操作。
is与==,is not与!=的区别在于,==与!=比较的是对象内部的值是否相等,而is与is not比较的是两个对象是否为同一个对象。
2.4 位运算符
位运算符提供的是对位(bit)进行的操作。位运算符的操作数要求是整数类型(布尔类型)。位运算符如下表所示
符号 | 说明 |
x & y | x与y按位与运算,如果两个位都是1,结果为1,否则结果为0(有0则结果为0)。 |
x | y | x与y按位或运算,如果两个位都是0,结果为0,否则结果为1(有1则结果为1)。 |
x ^ y | x与y按位异或运算,如果两个位相同,则结果为0,如果两个位不同,则结果为1(有1则为1,但又不同时为1)。 |
x << y | 将x向左移动y位,右侧以0进行填充。y不能为负值,否则会产生ValueError。 |
x >> y | 将x向右移动y位,左侧以符号位进行填充。y不能为负值,否则会产生ValueError。 |
~x | 对x进行按位取反,即1变为0,0变为1。 |
注意:布尔类型作为整数类型的子类型,也可以参与位运算,但是,最好不要这样,因为布尔类型的作用是进行逻辑上的判断,而不是当成数值1与0参与数学运算。
2.5 赋值运算符
赋值运算符包括简单赋值运算符与复合赋值运算符。
符号 | 说明 |
x = y | 简单赋值运算。即x关联y所关联的对象。 |
x op= y | 复合赋值运算。op可以是任意二元算术运算符与二元位运算符。 x op= y相当于x = x op y。例如x += y相当于x = x + y。 |
2.6 运算符优先级
同一行的运算符具有相同的优先级从高到低进行排列。如下:
运算符优先级 |
. () [] |
** |
+(正号) -(负号) ~ |
* / // % |
+ - |
<< >> |
& |
^ |
| |
in not in is is not < <= > >= == != |
not |
and |
or |
= op=(+ - * / // % ** >> << & ^ |) |
当我们在使用表达式,无法确定优先级时,我们可以使用小括号()来调整表达式的结合性,小括号()的优先级是最高的。
3 流程控制
流程:即程序执行的过程。程序的三种结构:顺序结构(按部就班,自顶而下的去执行的);选择结构;循环结构
3.1 选择结构
(1)if
缩进的语法:缩进大小随意,但是要保持一致。按照惯例,使用4个空格。
if 表达式:
if语句体
如果表达式为True,或者可以转换为True则执行语句体,否则不执行
age = 20
if age >18:print("成年了")
print("没有缩进,不是if的语句体")
(2)if-else
提供两条分支。
age = 16
if age >18:print("成年了")
else:print("未成年")
(3)if-elif
可以实现多分支判断,if-else只能实现两分支判断
if 表达式:
语句体
elif 表达式:
语句体
更多的elif 表达式:
语句体
# 注意:多分支选择条件有包含关系,需要将范围小的放在前面,范围大的放在后面
number = int(input("输入数字"))
if number > 90:print("A")
elif number > 80:print("B")
elif number > 70:print("C")
elif number > 60:print("D")
(4)if-elif-else
if 表达式:
语句体
elif 表达式:
语句体
...
else:
语句体
# 注意:多分支选择条件有包含关系,需要将范围小的放在前面,范围大的放在后面
number = int(input("输入数字"))
if number > 90:print("A")
elif number > 80:print("B")
elif number > 70:print("C")
elif number > 60:print("D")
else:print("E")
(5)if-else的简化
类似于其他语言中的三元运算符。格式为:
表达式1 if 条件表达式 else 表达式2
其中,条件表达式执行条件判断,如果条件表达式的值为True,则返回表达式1的值,否则返回表达式2的值。
number = int(input("输入数字"))
print("小" if 1<= number <3 else ("大" if 3<= number<6 else "输入有误"))
(6)if嵌套
if是嵌套使用的,用来多层选择分支的判断。
gender = "男"
age = 20
if gender == "男":print("男性")if age >= 18:print("做苦力")else:print("玩耍")
else:print("女性")if age >= 18:print("做饭")else:print("玩耍")
(7)断言
断言:判断某些语句是否正确。通过断言,我们可以为应用程序加入调试信息,从而检测程序关键点位置的准确性。
断言使用assert关键字,语法格式为:
assert 表达式 或 assert 表达式,错误信息
在执行断言语句时,会对表达式1进行求值,如果该值转换为布尔类型后为False,则会产生错误信息。其中,第二种形式的错误信息是可选的,如果给出错误信息,则会在表达式为False的时候,输出我们指定的错误信息。
断言有什么用处呢?我们可以自行通过if语句,使用raise抛出异常来实现啊。其实断言底层其实就是通过if语句判断与异常来实现的。
断言是通过__debug__来控制的,如果该变量为True,则会开启断言,进行判断,一旦断言表达式为False,就会产生异常。如果该变量为False,则不会开启断言,就算断言表达式为False,也不会产生异常(因为根本没有执行)。__debug__是Python中的内置常量值,该常量值默认为True,如果在运行Python时,命令行指定了-O选项,则该常量值为False。因此,我们可以方便的开启与关闭断言(通过-O选项)。这比使用if语句要灵活,因为使用if语句,程序会无条件的判断,无法进行控制。
password1 = input("请输入密码")
password2 = input("请再次输入密码")
# 设下断言,当两次密码一致才进行后续的操作
assert password1 == password2
print("继续执行")
3.2 循环结构
循环就是重复性的执行一件相同或相似的事情
(1)while
while 表达式:
循环体
如果表达式为true则重复执行语句体
x = 0
y = 10
sum = 0
while x <= 10:sum += xx += 1
print(sum)
(2)for
for 变量 in 可迭代对象:
循环体
对可迭代对象的每个值,依次赋值给变量,然后执行一次循环体
# range函数,能够产生一个区间的整数值,是一个可迭代对象
# range(end) 产生0-end区间的整数值,包括0,不包括end
# range(start,end) 产生start-end区间的整数值,包括start,不包括end
# range(start,end,step) 产生start-end区间的整数值,包括start,不包括end,step指定步长,默认为1
for x in range(2,10,2):print(x,end=" ")
(3)循环嵌套
循环嵌套,是指外层循环的内部,还有内层循环,即内层循环作为外层循环的循环体。当循环嵌套时,外层循环每执行一次,内层循环都会完整的执行一轮。如果外层循环会执行m次,内层循环会执行n次,则总共会执行m * n次。
for i in range(1,5):for j in range(1,i+1):print("*",end= "")print()
(4)break与else
break只能在循环中使用。else可以跟随在for或while循环之后,当循环正常执行完毕,会执行else语句,如果循环非正常执行完毕,而是通过break跳出循环,则else语句块不会得到执行。else语句是可选的。
# break用于提前完成任务,结束循环
for i in range(1,10):if i == 5:print("i为5")break
# for 与 while循环可以加上一个可选的else,如果循环没有因为break提前结束,则执行else语句体,否则不执行
num = 6
for i in range(1,10):if i == num:print("存在num")break
else:print("不存在num")
(5)continue
continue只能用在循环语句中。用来结束本次循环,开启下一次循环,对后续的循环没有影响
注意:break与continue基本只会用在选择判断中。无条件的break与continue虽然语法上没有错误,但从实际的角度来说是没有意义的。
# continue用来表示当前循环已经不满足条件时,可以使用continue提前结束本次循环,开启对下一个值进行判读。
for i in range(1,10):if i == 5:continueprint(i,end=" ")