数据类型

数据类型

我们人类可以很容易的分清数字与字符的区别,但是计算机并不能呀,计算机虽然很强大,但从某种角度上看又很傻,除非你明确的告诉它,1是数字,“汉”是文字,否则它是分不清1和‘汉’的区别的,因此,在每个编程语言里都会有一个叫数据类型的东东,其实就是对常用的各种数据类型进行了明确的划分,你想让计算机进行数值运算,你就传数字给它,你想让他处理文字,就传字符串类型给他。

Python数据类型分为:基本类型和数据集

基本类型:

数字:整数int、长整型long、浮点型float

字符串:文本str、字节byte

布尔:真true/假false

数据集:

列表list

元组tuple

字典dict:有序字典、无需字典

集合set:有序集合、无需集合


 

int(整型

Python中的整数属于int类型,默认用十进制表示,此外也支持二进制,八进制,十六进制表示方式。

在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647

在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807

进制转换

python中的数字默认是十进制。提供了一些方法来帮助我们做转换。比如是进制转换为二进制使用bin方法,在转换结果前面还会加上‘0b’表示是一个二进制书。

python也为我们提供了十进制转换成八进制和十六进制的方法,分别是octhex。八进制前面以‘0o’标示,十六进制以‘0x’标示

>>> bin(10)
'0b1010'
>>> oct(10)
'0o12'
>>> hex(10)
'0xa'

取余运算(%)

>>> 5%2
1
>>> 16%4
0
>>> 16%7
2

算术运算(+ - * / // divmod **)

>>> 2+3
5
>>> 2-3
-1
>>> 2*3
6
>>> 3/2
1.5
>>> 3//2
1
>>> divmod(16,3)
(5, 1)
>>> 2**3
8

long(长整型)

跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。

注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。

注意:在Python3里不再有long类型了,全都是int

>>> a= 2**64 >>> type(a) #type()是查看数据类型的方法

<type 'long'>

>>> b = 2**60 >>> type(b) <type 'int'>


浮点型

浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法

float是有限小数或无限循环小数。

在运算中,整数与浮点数运算的结果也是一个浮点数。

为什么要叫做float浮点型?

浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,
一个浮点数的小数点位置是可变的,比如,
1.23*109和12.3*108是相等的。
浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代:
1.23*109就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。
整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的而浮点数运算则可能会有四舍五入的误差。

关于小数不精准问题

Python默认的是17位精度,也就是小数点后16位,尽管有16位,但是这个精确度却是越往后越不准的。

首先,这个问题不是只存在在python中,其他语言也有同样的问题

其次,小数不精准是因为在转换成二进制的过程中会出现无限循环的情况,在约省的时候就会出现偏差。

比如:11.2的小数部分0.2转换为2进制则是无限循环的00110011001100110011...

单精度在存储的时候用23bit来存放这个尾数部分(前面9比特存储指数和符号);同样0.6也是无限循环的;

计算更高的精度(超过16位小数)

#借助decimal模块的“getcontext“和“Decimal“ 方法
>>> a = 3.141592653513651054608317828332
>>> a
3.141592653513651
>>> from decimal import *
>>> getcontext()
Context(prec=50, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[FloatOperation], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 50
>>> a = Decimal(1)/Decimal(3)#注,在分数计算中结果正确,如果直接定义超长精度小数会不准确
>>> a
Decimal('0.33333333333333333333333333333333333333333333333333')

>>> a = '3.141592653513651054608317828332'
>>> Decimal(a)
Decimal('3.141592653513651054608317828332')
#不推荐:字符串格式化方式,可以显示,但是计算和直接定义都不准确,后面的数字没有意义。
>>> a = ("%.30f" % (1.0/3))  
>>> a  
'0.333333333333333314829616256247'

浮点数所占空间远大于整数
1.4-0.2 = ? 0.2吗?
由于计算机内部是由固定长度的二进制表示,小数位结果为带有微小误差的近似值

复数

复数complex是由实数和虚数组成的

要了解复数,其实关于复数还需要先了解虚数。虚数(就是虚假不实的数):平方为复数的数叫做虚数。

复数是指能写成如下形式的数a+bi,这里a和b是实数,i是虚数单位(即-1开根)。在复数a+bi中,a称为复数的实部,b称为复数的虚部(虚数是指平方为负数的数),i称为虚数单位。

当虚部等于零时,这个复数就是实数;当虚部不等于零时,这个复数称为虚数。

注,虚数部分的字母j大小写都可以。

 


 字符串

字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,' '或'' ''或''' '''中间包含的内容称之为字符串

特性:有序!不可变!

>>> name = "Tom" #双引号
>>> age = "22"       #只要加引号就是字符串
>>> age2 = 22          #int
>>> 
>>> msg = '''My name is Tom, I am 22 years old!'''  #三个引号也可以
>>> 
>>> hometown = 'ShanDong'   #单引号也可以

单双引号没有任何区别,只有下面这种情况 你需要考虑单双的配合

msg = "My name is Tom , I'm 22 years old!"

多引号作用就是多行字符串必须用多引号

msg = '''
今天我想写首小诗,
歌颂我的同桌,
你看他那乌黑的短发,
好像一只炸毛鸡。
'''
print(msg)
不加引号的字符串被认为是变量

字符串拼接

数字可以进行加减乘除等运算,字符串只能进行"相加"和"相乘"运算。

>>> name
'Tom'
>>> age
'22'
 >>> 
>>> name + age  #相加其实就是简单拼接
'Tom22'
>>> 
>>> name * 10 #相乘其实就是复制自己多少次,再拼接在一起
'TomTomTomTomTomTomTomTomTomTom' 

注意,字符串的拼接只能是双方都是字符串,不能跟数字或其它类型拼接

字符串方法

capitalize 首字母大写

casefold 去除大写,全变为小写

center 

s = "hello world"
print(s.center(50,"-"))

 

  输出

    -------------------hello world--------------------

count 统计某元素有几个(可以设置起始结束位置)
endswith 判断以某各结尾

expendtabs 扩展tab键

find 查找某各值,返回索引(可以起始结束位置),没有就返回-1

format

s = "my name is {0}, i am {1} years old"
print(s.format("nicole",22))

  输出

    my name is nicole, i am 22 years old

s = "my name is {name}, i am {age} years old"
print(s.format(name = "nicole",age = 22))

  输出

    my name is nicole, i am 22 years old

index 返回制定某个值的索引,可以起始结束

isalnum 判断是否是数字或字符

isalpha 判断是否是字符

#isdecimal  判断是否是整数

isdigit 判断是否是整数

isidentifier 判断是可用合法变量

islower 判断是否全小写

isnumeric 判断是否只有数字

isprintable 判断值是否可以打印

isspace 判断是否是空格

istitle  判断每个单词第一个字否大写

isupper 判断是否都是大写

join() 将列表变为字符串      “间隔符”.join

ljust(长度,“加东西”) 改变字符串长度,多余部分用引号中的填补(可以不填)

lower 变为小写

upper 变为大写

strip 去除两端空格(或者换行或tab)

lstrip 去除左边空格(换行、tab)

rstrip 去除右边空格(换行、tab)

#maketrans 类似于制作一个密码表 translate 根据制作出的密码表翻译

a = "abcdefg"
b = "*)&%#@$"
table = str.maketrans(a,b)
print("catabc".translate(table))

  输出

             &*t*)&

#partition 输入某个值,将字符串以此值分成两半

replace 替换(“原字符”,“替换字符”,替换次数)默认全换

rfind 找到某个值,从左往右找到最右边的这个值,找不到是-1

rindex 索引从左往右找到最右边的这个值

rpartition 输入某个值,从左往右,将最右边字符串以此值分成两半

split 默认以空格分将字符串分为列表,也可指定

rsplit 从右边开始默认以空格分将字符串分为列表,从也可指定

splitlines 按行分为列表

startswith 判断以什么开头,或结束

swapcase 小写换大写

title 变成title(每个单词首字母大写)

zfill 将字符串变为固定长度,在前面加


布尔型(bool) 

bool型只有两个值:True和 ,是因为我们也习惯用1表示True,0表示False。

布尔值为False的有:[] () {} 0 False "" 等

 

posted @ 2018-08-14 15:25  混世妖精  阅读(227)  评论(0编辑  收藏  举报