#6 Python数据类型及运算

发布时间:2019-05-08 22:27:01编辑:auto阅读(1996)

    前言

    前文讲述了Python的输入输出以及变量的相关知识点,本节将探讨Python的数据类型以及数据之间的运算方式!

    一、Python数据类型

    上一节弄清了变量,其实变量所指向的值是有自己独特的数据类型的,这些数据类型可能代表不同的数据,在Python中,主要有以下几种数据类型:

    整形(int)

    在计算机中,整数的位数其实是有范围的,并没有我们想象的那样拥有无限的位数,而且,在不同的机器上整数的位数可能不同,例如:

    32位系统:整数的位数就是32位,寻址范围为:-231  ~  231-1 ,即-2147483648 ~ 2147483647

    64位系统:整数的位数就是64位,寻址范围为:-263 ~ 263-1 ,即-9223372036854775808 ~ 9223372036854775807

    长整形(long)

    在Python中,长整形整数并没有指定位数,也就是说,长整形整数可以无限大,但是由于机器本身的限制,往往并不能无限大,到一定范围也就不行了。

    浮点型(float)

    上面两种数据类型都是整数,但在实际并不可能全是整数,还有小数啊,于是浮点型便应运而生,说白了浮点型就是小数,并且可以使用科学计数,在计算机中,科学计数的倍数10用e代替,如:5.21x105 就写成 5.21e9,也可以写成521e7

    复数(complex)

    上面三种数据类型组合起来是实数,其实科学计算中常常用到复数,在Python中,存在复数的数据类型,一般形式为:x+yj,式中x,y都是实数,例如:5+6j

    布尔值(True、False)

    布尔值就俩:真、假,Python中用True、False表示,一定要注意首字母大写,Python中是区分大小写的,一定要注意。

    In [77]: 5==6
    Out[77]: False
    
    In [78]: 3>2
    Out[78]: True
    
    In [79]: True == True
    Out[79]: True
    
    In [80]: True == False
    Out[80]: False

    空值(None)

    空值就一个:None,这个空值是很有趣的,None不可以理解为0,因为0不是空值,就好像温度是0摄氏度一样,0摄氏度是有温度的( ̄▽ ̄)"

    字符串(str)

    字符串可能是编写Python中用到的最多的数据类型,只要是用引号引起来的就是字符串。Python中是不区分单引号、双引号和三引号的,他们是相同的:

    In [81]: 'Hello,world!'
    Out[81]: 'Hello,world!'
    
    In [82]: "Hello,world!"
    Out[82]: 'Hello,world!'
    
    In [83]: '''Hello,world'''
    Out[83]: 'Hello,world'

    肯定有萌新会问,搞这么多幺蛾子干啥,统一用一个不就完了,我就默默笑笑不说话:

    In [84]: 'i'm MinuteSheep'
      File "<ipython-input-84-a2a810ee38cb>", line 1
        'i'm MinuteSheep'
           ^
    SyntaxError: invalid syntax

    看!报错了竟然,为什么呢?因为Python会自动匹配最近的符号与之闭合,所以就会出现上面的情况,做如下修改:

    In [85]: "i'm MinuteSheep"
    Out[85]: "i'm MinuteSheep"

    (萌新:你个糟老头子坏得很╰(‵□′)╯)

    同样的,三引号用于多行,或者内容符号混乱的情况:

    In [87]: '''i'm MinuteSheep,i said:"i'm the best man in the world!"'''
    Out[87]: 'i\'m MinuteSheep,i said:"i\'m the best man in the world!"'
    
    
    In [86]: '''
        ...: i'm MinuteSheep,
        ...: i said:
        ...: "i'm the best man in the world!"
        ...: '''
    Out[86]: '\ni\'m MinuteSheep,\ni said:\n"i\'m the best man in the world!"\n'

    完美解决,还记得\n是什么吗,是换行意思的啦,同样你会发现i'm变成了i\'m,这其实是转义的显示,转义以后会讲到的啦

    又有萌新出来作妖了,你上一节不是说三引号是多行注释吗,这一节怎么变成了字符串啦?

    这个问题问的好!看我的解释,有图有真相:

    直接三引号内容,是注释,只要将三引号内容赋给变量,就是字符串

    字符串还有很多方法,之后会专门有一小节详细的讲解字符串的方法。

    列表(list)

    对于列表,萌新可能会很陌生,你可以暂时把它理解为一维数组,列表的在Python中的使用次数也是相当多的,是除字符串以外必须掌握的一种数据类型。来看看列表长啥样:

    In [88]: ['MinuteSheep', 'LiMing', '123', 123]
    Out[88]: ['MinuteSheep', 'LiMing', '123', 123]

    可以看到,被一对方括号括起来的数据就是列表,刘表里面可以又其他数据类型,上面的列表包括:字符串和整型。当然,列表可以包含列表,称为列表的嵌套:

    In [89]: ['MinuteSheep', ['LiMing', 123]]
    Out[89]: ['MinuteSheep', ['LiMing', 123]]

    关于列表,还有好多具体的方法,这里不一一介绍,之后也会有专门的一小节讲解列表方法。

    元组(tuple)

    元组可能就更陌生了,元组其实是不可变列表,列表用一队方括号括起来,元组则用一对圆括号括起来,列表是可以被操作的(比如增、删、改、查),但是元组不行,元组不可被更改,来看看元组长啥样哇:

    In [90]: ('MinuteSheep','LiMing',123)
    Out[90]: ('MinuteSheep', 'LiMing', 123)

    字典(dict)

    字典是Python的一种非常强大的数据类型,通过键值对的形式将数据保存下来,提高了数据增、删、改、查的速度,通常作为数据存储的格式,也来看看字典长啥样哇:

    In [91]: {'name': 'MinuteSheep', 'gender' : 'male', 'age': 99}
    Out[91]: {'age': 99, 'gender': 'male', 'name': 'MinuteSheep'}

    可以看到,字典是用一对花括号括起来的,并且以 'key' : 'value' 的形式存储,同样,字典里面可以包含其他数据类型,上面的字典包括:字符串、整型。当然,字典也可以嵌套:

    In [92]: {'name' : 'MinuteSheep', 'age': {'young' : 15, 'old' : 99}}
    Out[92]: {'age': {'old': 99, 'young': 15}, 'name': 'MinuteSheep'}

    字典也会有专门的一节去讲解它的方法。

    二、Python数据运算

    说完了Python的数据类型,就该数据运算了,养兵千日,用在一时嘛

    算数运算

    加 +

    In [93]: 1+2
    Out[93]: 3

    减 -

    In [95]: 1-2
    Out[95]: -1

    乘 *

    In [96]: 1*2
    Out[96]: 2

    除 /

    In [97]: 5/2
    Out[97]: 2.5

    取模 %  (就是取余数)

    In [98]: 5%2
    Out[98]: 1

    取整 //

    In [99]: 5//2
    Out[99]: 2

    幂 **

    In [100]: 5**2
    Out[100]: 25

    赋值运算

    简单赋值 =

    In [102]: a=5
    
    In [103]: b=6
    
    In [104]: c=a+b
    
    In [105]: c
    Out[105]: 11

    加法赋值 +=   (b+=a,相当于b=b+a)

    In [106]: a=5
    
    In [107]: b=6
    
    In [108]: b+=a
    
    In [109]: b
    Out[109]: 11

    减法赋值 -=   (b-=a,相当于b=b-a)

    In [111]: a=5
    
    In [112]: b=6
    
    In [113]: b-=a
    
    In [114]: b
    Out[114]: 1

    乘法赋值 *=   (b*=a,相当于b=b*a)

    In [115]: a=5
    
    In [116]: b=6
    
    In [117]: b*=a
    
    In [118]: b
    Out[118]: 30

    除法赋值 /=   (b/=a,相当于b=b/a)

    In [119]: a=5
    
    In [120]: b=6
    
    In [121]: b/=a
    
    In [122]: b
    Out[122]: 1.2

    取模赋值 %=   (b%=a,相当于b=b%a)

    In [123]: a=5
    
    In [124]: b=6
    
    In [125]: b%=a
    
    In [126]: b
    Out[126]: 1

    取整赋值 //=   (b//=a,相当于b=b//a)

    In [127]: a=5
    
    In [128]: b=6
    
    In [129]: b//=a
    
    In [130]: b
    Out[130]: 1

    幂赋值 **=   (b**=a,相当于b=b**a)

    In [131]: a=5
    
    In [132]: b=6
    
    In [133]: b**=a
    
    In [134]: b
    Out[134]: 7776

    比较运算

    测试相等 ==

    In [136]: 1==1
    Out[136]: True
    
    In [137]: 1==2
    Out[137]: False

    不等于 !=

    In [144]: 1!=1
    Out[144]: False
    
    In [145]: 1!=2
    Out[145]: True

    大于 >

    In [146]: 1>1
    Out[146]: False
    
    In [147]: 2>1
    Out[147]: True

    大于等于 >=

    In [149]: 1>=1
    Out[149]: True
    
    In [150]: 2>=1
    Out[150]: True

    小于 <

    In [151]: 6<6
    Out[151]: False
    
    In [152]: 6<7
    Out[152]: True

    小于等于 <=

    In [153]: 6<=6
    Out[153]: True
    
    In [154]: 6<=7
    Out[154]: True

    逻辑运算

    布尔'与' and   (有假为假,全真为真)

    In [156]: True and False
    Out[156]: False
    
    In [157]: True and True
    Out[157]: True
    
    In [158]: False and False
    Out[158]: False

    布尔'或' or   (有真为真,全假为假)

    In [159]: True or True
    Out[159]: True
    
    In [160]: True or False
    Out[160]: True
    
    In [161]: False and False
    Out[161]: False

    布尔'非' not   (取相反)

    In [162]: not True
    Out[162]: False
    
    In [163]: not False
    Out[163]: True

    身份运算

    判断两个标识符是否引用自同一个对象 is

    In [167]: a=b=3
    
    In [168]: a is b
    Out[168]: True
    
    In [169]: a=3
    
    In [170]: b=5
    
    In [171]: a is b
    Out[171]: False

    判断两个标识符是否引用自不同对象 is not

    In [177]: a=3
    
    In [178]: b=5
    
    In [179]: a is not b
    Out[179]: True

    == 与 is 的区别:

    看到这里,很多小伙伴已经晕了,== 和 is 好像一样啊,看起来一样,其实是不一样的,来看下面的这段代码:

    In [180]: a = 600
    
    In [181]: b = 600
    
    In [182]: a == b
    Out[182]: True
    
    In [183]: a is b
    Out[183]: False

    其实啊,== 比较的是值,is比较的地址,让我们用 id() 这个函数查看一下变量的地址:

    In [184]: id(a)
    Out[184]: 2155434581648
    
    In [185]: id(b)
    Out[185]: 2155434581904

    可以看到,a和b俩个变量的值虽然相同,但地址却不一样,所以使用 == 和 is 的结果自然就不一样。那我们再来看一段代码:

    In [187]: a = 10
    
    In [188]: b = 10
    
    In [189]: a == b
    Out[189]: True
    
    In [190]: a is b
    Out[190]: True
    
    In [191]: id(a)
    Out[191]: 1529742064
    
    In [192]: id(b)
    Out[192]: 1529742064

    萌新是不是莫不着头脑了,用600的时候 is 输出False,用10的时候怎么地址一样了啊,(快回头,有鬼~)其实啊,Python有一个叫做小整数对象池的东西,只要是[-5, 256]之间的整数都会使用同一份地址,这下萌新明白了哇。

    位运算

    重点说明:位运算针对的是二进制数

    按位与 &

    In [193]: a = 15   # 15 = 0000 1111
    
    In [194]: b = 30   # 30 = 0001 1110
    
    In [195]: c = a&b  # 14 = 0000 1110
    
    In [196]: c
    Out[196]: 14

    按位或 |

    In [193]: a = 15   # 15 = 0000 1111
    
    In [194]: b = 30   # 30 = 0001 1110
    
    In [197]: c = a|b  # 31 = 0001 1111
    
    In [198]: c
    Out[198]: 31

    按位异或 ^

    In [193]: a = 15   # 15 = 0000 1111
    
    In [194]: b = 30   # 30 = 0001 1110
    
    In [200]: c = a^b  # 17 = 0001 0001
    
    In [201]: c
    Out[201]: 17

    按位取反 ~

    In [210]: a = 60   # 60 = 0011 1100
    
    In [211]: c = ~a  # -61 = 1100 0011
    
    In [212]: c
    Out[212]: -61

    左移 <<

    In [213]: a = 15   # 15 = 0000 1111
    
    In [214]: c = a<<2 # 60 = 0011 1100
    
    In [215]: c
    Out[215]: 60
    
    #左移后面要加位数

    右移 >>

    In [213]: a = 15     # 15 = 0000 1111
    
    In [218]: c = a>>2    # 3 = 0000 0011
     
    In [219]: c
    Out[219]: 3
    
    
    #右移后面要加位数

    Python运算符优先级(从高到底依次排列)

    **                 # 指数 (最高优先级)
    ~ + -              # 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
    * / % //           # 乘,除,取模和取整除
    + -                # 加法减法
    >> <<              # 右移,左移运算符
    &                  # 位 'AND'
    ^ |                # 位运算符
    <= < > >=          # 比较运算符
    <> == !=           # 等于运算符
    = %= /= //= -= += *= **=    # 赋值运算符
    is is not          # 身份运算符
    in not in          # 成员运算符
    not and or         # 逻辑运算符

     

关键字