赞
踩
将一组具有相同性质的数据的集合统称为一种数据类型,在Pyhton中定义了很多种数据类型,每种数据类型以一个类(class)来定义,在类中定义每种数据类型的属性和方法。
我们可以使用内置函数type()来返回一个变量的数据类型,或者使用内置函数isinstance()来判断变量的数据类型,如下图
那这里为什么bool类型的变量,用isinstance()函数判断为int类型呢?我们按住ctrl键,点击int跳转到数据类型定义模块文件中,搜索bool类,可以看到bool类继承了int类,也就是说bool类是int类的子类,所以bool类型的数据也是int类型
几乎所有数据类型的对象都能进行真值测试,布尔运算和比较运算,这几个操作最终返回的都是布尔值,也就是返回真True或者假False
任何对象都可以进行真值测试,一个对象在默认情况下被视为真值,除非当该对象被调用时其所属类定义了 __bool__方法且返回 False 或是定义了 __len__方法且返回零才会被视为假值。会被视为假值的内置对象如下:
假设我们自定义了一个类,这个类的实例对象可以进行真值测试,那什么情况下这个对象进行真值测试会返回False呢?
第一种情况是在这个类中定义了__bool__方法且该方法return False,那么真值测试会返回False;
第二种情况是在这个类中定义了__len__方法且该方法return 0,那么真值测试会返回False。
如果一个类中即定义了__bool__方法,又定义了__len__方法,那么会先查看__bool__方法的返回值,如果返回值为False,那么直接是False,如果返回值是True,那么接着看__len__方法的返回值,返回值为0,那么就是False,返回值是非0,那么就是True
除上面两种情况之外,任何对象进行真值测试都默认返回True
任何对象在进行真值测试之后,都能作为布尔运算的操作数,布尔运算的运算规则如下:
在Python中有八种比较运算符,他们的优先级相等(比布尔运算符的优先级高)。比较运算可以任意串联,比如:x<y<=z等价于x<y and y<=z,这两种方式相同点在于当x<y为假时,z不会被求值直接返回False;不同点在于前者y只需要做一次求值,而后者y需要做两次求值。包含的比较运算符有:
运算符 | 含义 | 备注 |
---|---|---|
< | 严格小于 | x<y,比较x和y的值,如果x<y则返回True,否则返回False |
<= | 小于或等于 | x<=y,比较x和y的值,如果x<=y则返回True,否则返回False |
> | 严格大于 | 同上 |
>= | 大于或等于 | 同上 |
== | 等于 | 同上,但注意除了不同类型的两个数字对象之外,其他不同类型的两个对象不能进行相等比较 |
!= | 不等于 | 同上 |
is | 对象标识 | 判断两个标识符是不是引用同一对象,x is y相当于id(x) == id(y) |
is not | 否定的对象标识 | 判断两个标识符是不是引用不同对象,x is y相当于id(x) != id(y) |
is和is not属于身份运算符,跟其他运算符不同的是,其他运算符比较的是对象的值,而身份运算符比较的是对象的内存地址。身份运算符两边都应该是一个对象的标识符,而不应该是一个具体的对象
在Python 3中定义了以下八种标准的数据类型:
不可变和可变指的是这种数据类型的变量值是否能被改变
其余数据类型还有:
其中字符串、元组、字节串、列表又被称为序列类型,这些数据类型都有的共同特征是都存在索引,都可以做切片操作,以及其他序列类型操作等
其中字符串、字节串、元组、列表、字典、集合又被称为迭代器类型,这些数据类型都能通过调用iter()函数返回一个迭代器,并通过迭代器调用next()函数进行迭代操作
其中字典又被称为映射类型,是Python中唯一一种标准的映射类型
Python 3的数字类型包括:
#定义单个变量
a = 11
#连续定义多个变量
a = b = c = 22
#交互式赋值定义变量
a,b,c = 1,2,3
print(a,b,c) #1 2 3
print(type(a)) #<class 'int'>
函数定义:class int(x,base=10)
使用int()函数转换时要注意以下几点:
#使用int()生成整型变量
a = int()
print(a,type(a)) #0 <class 'int'>
#将字符串转换为整型
b = int('-11')
print(b,type(b)) #-11 <class 'int'>
b = int('00001010')
print(b,type(b)) #1010 <class 'int'>
#将浮点数转换为整型,会直接去掉小数点后面的数
c = int(0.52)
print(c,type(c)) #0 <class 'int'>
d = int(-32)
print(d,type(d)) #-32 <class 'int'>
由于bool类属于int类的子类,所以bool值也相当于一个整数
#将bool类型转换为整型
f1 = int(False)
print(f1,type(f1)) #0 <class 'int'>
f2 = int(True)
print(f2,type(f2)) #1 <class 'int'>
bb = int('-111',0)
print(bb,type(bb)) #-111 <class 'int'>
bb = int('+41',0)
print(bb,type(bb)) #41 <class 'int'>
bb = int('101',0)
print(bb,type(bb)) #101 <class 'int'>
#不能是不合法的有符号整数
bb = int('012',0)
print(bb,type(bb)) #ValueError: invalid literal for int() with base 0: '012'
aa = int('15',8)
print(aa,type(aa)) #13 <class 'int'>
bb = int('0101',2)
print(bb,type(bb)) #5 <class 'int'>
cc = int('a',16)
print(cc,type(cc)) #10 <class 'int'>
按位运算只对整数有意义,将两个整数先转换为二进制数,然后依次按位运算,得到的结果再转换为整数输出,包含的位运算有:
x = 1 #001
y = 3 #011
z = x & y
print(z,type(z)) #1 <class 'int'>
print(x|y) #3
print(x^y) #2
print(x<<2) #4
print(y>>2) #0
print(~y) #-4
在计算机中,一个数字或者一个字符占一个字节(byte),一个字节(byte)等于8比特(bit)也就是8位,每一位用一个二进制数(0或者1)来表示,所以1在计算机中被存储为00000001(最高位代表符号位,0代表正号,1代表负号)
按位取反运算得到的是一个补码,一个正数的原码、反码和补码是相等的,而一个负数的补码等于符号位不变,反码+1,反码又等于符号位不变,原码取反
所以当我们对一个数进行逐位取反时,一个正数会变成负数,一个负数会变成正数,那么取反之后的数该怎么计算呢?比如上面的对3逐位取反,首先3的二进制数是00000011,逐位取反得到11111100,得到的这个数是个补码,由于补码等于符号位不变,反码+1,那么这个数的反码等于1111100-1=1111011,那么这个数的原码等于0000100,加上符号位就是-4
通过规律我们可以发现
- 左移n位相当于乘以pow(2,n),始终得到一个偶数
- 右移n位相当于除以pow(2,n),再做向下取整
- 对整数x做~运算的结果等于-(x+1)
#定义浮点型变量
a = 1.23
a = b = c = 2.1314
a,b = 11.0000,22.0
print(a,type(a)) #11.0 <class 'int'>
函数定义:class float(x)
使用float()函数转换时要注意以下几点:
#使用float生成浮点型变量 a = float() print(a,type(a)) #0.0 <class 'float'> #将整型转换为浮点型 b = float(320) print(b,type(b)) #320.0 <class 'float'> #将字符串转换为浮点型 c = float('-0012.0') print(c,type(c)) #-12.0 <class 'float'> c = float('-.36') print(c,type(c)) #-0.36 <class 'float'> c = float('-5.') print(c,type(c)) #-5.0 <class 'float'> #此时inf表示一个正无穷大的浮点数 c = float('inf') #inf print(c,type(c)) #inf <class 'float'>
#将bool类型转换为浮点型
f1 = float(False)
print(f1,type(f1)) #0.0 <class 'float'>
f2 = float(True)
print(f2,type(f2)) #1.0 <class 'float'>
ff = 1.28+1.0
print(ff,type(ff)) #2.2800000000000002 <class 'float'>
ff = 1.6-1.0
print(ff,type(ff)) #0.6000000000000001 <class 'float'>
复数是由一个实数和一个虚数组合构成的数,表示为x+yj或x+yJ,其中:
#定义复数变量
a = 1.5+3.4j
print(a,type(a)) #(1.5+3.4j) <class 'complex'>
print(a.real,a.imag) #1.5 3.4
b = 1-2j
print(b,type(b)) #(1-2j) <class 'complex'>
print(b.real,b.imag) #1.0 -2.0
c = 4J #当实数部分为0时可以不写
print(c,type(c)) #4j <class 'complex'>
print(c.real,c.imag) #0.0 4.0
#j前面一定要有数字,也就是虚数部分一定要写出来
a = 1.5+j
print(a,type(a)) #NameError: name 'j' is not defined
函数定义:class complex(real[,imag])
使用complex()函数转换时要注意以下几点:
#使用complex()生成一个复数 a = complex() print(a,type(a)) #0j <class 'complex'> print(a.real,a.imag) #0.0 0.0 #将整型转换为复数 b = complex(-241) print(b,type(b)) #(-241+0j) <class 'complex'> print(b.real,b.imag) #-241.0 0.0 b = complex(-2,1) print(b,type(b)) #(-2+1j) <class 'complex'> print(b.real,b.imag) #-2.0 1.0 #将浮点型转换为复数 c = complex(1.) print(c,type(c)) #(1+0j) <class 'complex'> print(c.real,c.imag) #1.0 0.0 b = complex(-2.6,) print(b,type(b)) #(-2.6+0j) <class 'complex'> print(b.real,b.imag) #-2.6 0.0 #将复数转换为复数 com = complex(3+2j) print(com,type(com)) #(3+2j) <class 'complex'> print(com.real,com.imag) #3.0 2.0 b = complex(-2+6j,1) print(b,type(b)) #(-2+7j) <class 'complex'> print(b.real,b.imag) #-2.0 7.0 #将字符串转换为复数 d = complex('1') print(d,type(d)) #(1+0j) <class 'complex'> print(d.real,d.imag) #1.0 0.0 #比较特殊的是定义复数时虚数部分必须写,但字符串转复数时,这个“复数”字符串的虚部不要求必须写 d = complex('1.3+j') print(d,type(d)) #(1.3+1j) <class 'complex'> print(d.real,d.imag) #1.3 1.0 #将bool值转换为复数 a = complex(True) print(a,type(a)) #(1+0j) <class 'complex'> print(a.real,a.imag) #1.0 0.0 b = complex(False) print(b,type(b)) #0j <class 'complex'> print(b.real,b.imag) #0.0 0.0
所有的数字类型(除复数之外)都支持下列运算:
运算 | 含义 | 备注 |
---|---|---|
x + y | 求x加y | |
x - y | 求x减y | |
x * y | 求x乘以y | |
x / y | 求x除以y | |
x // y | 求x整除y | 整除法:将商取整,如果商是个正小数那么直接取整数部分,如果商是个负小数,取-(整数部分+1) |
x % y | 求x/y的余数 | 求余法:x和y的余数总是等于x-y*(x//y) |
-x | 求(-1)*x | |
+x | x本身 | |
x ** y | 求x的y次幂 | 等同于内置函数power(x,y),规定power(0,0)=1或0**0 = 1 |
内置函数abs(x) | 返回一个数的绝对值 | 如果参数为复数则返回它的模 |
内置函数divmod(x,y) | 返回(x//y,x%y) | 返回的是一个元组类型的对象 |
内置函数pow(x,y,mod=None) | 返回x的y次幂 | 如果指定mod,那么返回(x^y)%mod |
内置函数round(x,n=None) | 返回浮点数x四舍五入的值 | 如果指定n,那么返回x舍入到小数点后n位的值 |
x = 12.3
y = 5
print(abs(x)) #12.3
print(divmod(x,y),type(divmod(x,y))) #(2.0, 2.3000000000000007) <class 'tuple'>
print(pow(y,5,8)) #5
#round(x,n) n=None和n=0的结果是不一样的,n=0始终要保留一位小数0
print(round(x,0)) #12.0
print(round(8.502,0)) #9.0
print(round(8.502)) #9
math是Python内置的数学类函数库,这个库只适用于整数和浮点数,不适用于复数。math模块在使用之前必须先import导入,下图可以看到math模块包含了很多属性,下面我们来逐一介绍
math里的常量表示的是数学常数,比如数学里面的π,所有常量如下
常量 | 描述 | 备注 |
---|---|---|
math.pi | 表示圆周率π | math.pi = 3.141592653589793 |
math.e | 表示自然底数e | math.e = 2.718281828459045 |
math.tau | 表示圆的周长与半径之比T=2π | math.tau = 6.283185307179586 |
math.inf | 表示正无穷大的浮点数,-math.inf表示负无穷大浮点数 | math.inf = inf,type(math.inf) = <class ‘float’> |
math.nan | 表示浮点数nan,仅代表一个“非数字的”浮点值 | math.nan = nan,type(math.nan)=float |
函数 | 描述 | 备注 |
---|---|---|
math.ceil(x) | 返回大于或等于x的最小整数 | 正小数,小数点后面只要有大于0的数,那么就向上取整(负小数直接取整) |
math.floor(x) | 返回小于或等于x的最大整数 | 负小数,小数点后面只要有大于0的数,那么就向下取整(正小数直接取整) |
math.comb(n,k) | 返回从n项中取k项的可能组合数 | n,k必须是正整数,如果k>n那么返回0,如果k=0那么返回1 |
math.perm(n,k) | 返回不重复且有顺序的从n项中取k项的可能组合数 | 同math.comb(n,k) |
math.copysign(x,y) | 返回一个新的浮点数x,这个x的正负取决于y | y=-0时取+,y=-0.0时取- |
math.fabs(x) | 返回x的绝对值 | 总是返回一个浮点数 |
math.fmod(x,y) | 返回x%y,总是返回一个浮点数 | 一般整数首选x%y运算符,浮点数首选math.fmod(x,y) |
math.frexp(x) | 以(m,e)的形式返回x的指数和尾数,总是返回一个元组对象 | x=m*2**e(0.5<=m<1),如果x为0则返回(0.0,0) |
math.ldexp(m,e) | 返回m*2**e的值,总是返回浮点数 | 相当于math.frexp(x)的反函数 |
math.fsum(iterable) | 返回一个可迭代对象的元素总和,跟sum()相比他总是返回一个精确的浮点数 | 要求可迭代对象里面的元素必须是整数或浮点数 |
math.gcd(*int) | 返回给定整数的最大公约数,总是返回正整数 | 可以有0个或多个整数参数,参数为空时返回0 |
math.lcm(*int) | 返回给定整数的最小公倍数,总是返回正整数 | 可以有0个或多个整数参数,参数为空时返回1 |
math.isclose(x,y) | 判断x和y是否接近,是返回True,否返回False | |
math.isfinite(x) | 如果x既不是无穷大也不是nan,那么返回True,否则返回False | |
math.isinf(x) | 如果x是无穷大,那么返回True,否则返回False | |
math.isnan(x) | 如果x是nan,那么返回True,否则返回False | |
math.isqrt(x) | 返回x的整数平方根 | x必须是非负整数,平方根向下取整 |
math.modf(x) | 返回元组(f,i),f属于x的小数部分,i属于x的整数部分 | f不一定准确,f和i都是浮点数 |
math.prod(iterable,start=1) | 返回可迭代对象所有元素的乘积,乘积的默认初始值为1 | |
math.trunc(x) | 返回去除x小数部分的整数 |
import math a = math.fsum([1.0,1.2,2,3]) print(a,type(a)) #7.2 <class 'float'> a1 = math.gcd() print(a1,type(a1)) #0 <class 'int'> a2 = math.lcm(12,8) print(a2,type(a2)) #24 <class 'int'> a3 = math.modf(8.52) print(a3,type(a3)) #(0.5199999999999996, 8.0) <class 'tuple'> a4 = math.ceil(-5.2) print(a4,type(a4)) #-5 <class 'int'> a5 = math.floor(-6.4) print(a5,type(a5)) #-7 <class 'int'> a6 = math.comb(5,2) print(a6,type(a6)) #10 <class 'int'> a7 = math.perm(5,2) print(a7,type(a7)) #20 <class 'int'> a8 = math.copysign(5.6,-0) print(a8,type(a8)) #5.6 <class 'float'> a9 = math.fmod
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。