美文网首页
第二篇 基本数据类型

第二篇 基本数据类型

作者: 张大志的博客 | 来源:发表于2018-06-14 13:52 被阅读0次

    一、数字类型
    1:int
    2:fload
    如果数字或者字符串比较少的时候比如a=123,b=123,id号是一样的,id号一样,内存空间就一样,值就一样,但值比较大或者字符串比较长时,a=hello world ni hao,b=hello world ni hao,id号就不一样了,就要申请两块内存空间了


    image.png

    a和b的值是相等的,但内存空间却不一样
    二、字符串类型

    name='egon'
    # 按索引取值
    print(name[0]),字符串正向取
    print(name[-2]),反向取
    # 切片(顾头不顾尾,步长)
    print(name[1:3])打印出来的是go
    msg='hello world'
    print(msg[1:7])打印出来为ello w,注意顾头不顾尾
    print(msg[1:7:2])表示步长为2,打印出来为el
    msg='abcdefg'
    print(msg[::2])不写标书全取
    print(msg[5:0:-1])倒着取,了解
    # 长度len
    msg='abc'
    print(len(msg))
    # 成员运算in和not in
    msg='hello alex'
    print('a' in msg)
    print('alex' in msg)
    print('ax' in msg)必须是连续的才是其中的成员,打印的结果为False
    
    # 移除空白strip
    password='123456         '
    #password=password.strip()   strip可以去掉两边的空格
    #print(password)
    print(password.strip())或者直接写成这种格式
    msg='*****egon****'
    print(msg.strip('*'))#表示去掉*
    msg='*****eg**on******'
    print(msg.strip('*'))#打印出来为eg**on,说明只能去掉两边的,中间的被认为和字符串为一个整体
    # 切分split
    user_info='root:x:0:0::/root:/bin/bash'
    print(user_info.split(':')[0]) 表示以:为分隔符,全部切分,结果为root
    print(user_info.split(':',1)) 不写的时候表示全部切分,写上1表示切分一次,结果为['root', 'x:0:0::/root:/bin/bash']
    cmd='put a.txt'
    print(cmd.split()[0]) 结果为put。说明默认是以空格作为分隔符
    filepath='put /a/b/c/d/a.txt'
    print(filepath.split())
    msg='alex say i hace on tesla'
    print(msg.split(maxsplit=1)[0]) #表示最大切分几次,不常用
    #其他操作
    msg='****alex***'
    print(msg.strip('*'))
    print(msg.lstrip('*')) 去掉左边的*
    print(msg.rstrip('*')) 去掉右边的*
    msg='alex_sb'
    print(msg.startswith('alex')) 以什么开头和以什么结尾
    print(msg.endswith('sb'))
    msg='alex say i have one tesla,my name is alex'
    print(msg.replace('alex','sb',1)) #表示把alex替换成sb,不写后面的1表示全部替换,后面的1代表替换的次数
    print('my name is %s my age is %s' %('egon',18))
    print('my name is {} my age is {}'.format('egon',18))
    print('{1} {0} {1}'.format('egon',18))
    运行结果
    my name is egon my age is 18
    my name is egon my age is 18
    18 egon 18
    print('my name is {x} my age is {y}'.format(y=18,x='egon')) #不用考虑次序
    my name is egon my age is 18
    #find ,rfind(从右往左找),index,rindex,count
    msg='hello world'
    print(msg.find('ell')) #从左到右找,如果有,则返回第一个字符串的索引
    print(msg.find('xx')) #从左到右找,如果没有,则返回-1
    print(msg.index('d'))  #从左到右找,如果有,则返回第一个字符串的索引
    print(msg.index('xx')) #从左到右找,如果没有,则报错
    print(msg.find('d',0,3)) #表示从索引为0到索引为3找,顾头不顾尾
    print(msg.count('l',0,4)) #从索引为0到索引为4找,顾头不顾尾,找l
    #join
    user_info='root:x:0:0:addsfg'
    l=user_info.split(':') #表示以:做为分隔符,切分成列表
    print(':'.join(l)) #表示以:做为分隔符把列表l连接起来
    print(''.join(l)) #表示以空做为分隔符把列表l连接起来
    print(' '.join(l)) #表示以空格做为分隔符把列表l连接起来
    root:x:0:0:addsfg
    rootx00addsfg
    root x 0 0 addsfg
    #center,ljust,rjust,zerofill
    print('egno'.center(30,'=')) #30指定总宽度
    print('egon'.rjust(30,'='))
    print('egon'.ljust(30,'='))
    print('egon'.zfill(30)) #z表示zero用0填充
    =============egno=============
    ==========================egon
    egon==========================
    00000000000000000000000000egon
    msg='abc\tdef'
    print(msg.expandtabs(3)) #控制制表符的宽度
    msg='alex Say Hello'
    print(msg.capitalize()) #表示只有首字母大写
    print(msg.upper()) #全部大写
    print(msg.lower())
    print(msg.title()) #每个单词的首字母大写
    print(msg.swapcase()) #表示大小写反转
    #is 系列
    msg = 'alex Say Hello'
    print(msg.isupper()) #全部大写才是True
    print(msg.islower())
    print(msg.istitle())
    # #
    print(msg.isalpha()) #字符串是由字母组成
    print(msg.isalnum()) #字符串是由数字或者字母组成
    # 判断数字
    age=10
    inp=input('>>: ').strip() #表示输入的时候如果有空白就去掉
    if inp.isdigit(): #判断输入的字符串是否为数字,并且数字的类型为bytes或者是unicode
        inp=int(inp)
        if inp > age:
            print('ok')
    else:
            print('you must input number')
    #数字的类型
    num1=b'4'#bytes
    num2=u'4' #unicode,python3中无需加u就是unicode,就是用户input输入的类型
    num3='四' #中文数字
    num4='壹'
    num5='IV'  #罗马数字
    #bytes,unicode,最常用的判断是否为数字
    print(num1.isdigit()) True
    print(num2.isdigit()) True
    print(num3.isdigit()) False
    print(num4.isdigit())False
    print(num5.isdigit())False
    #unicode,只能判断unicode的数字
    print(num2.isdecimal()) True
    print(num3.isdecimal()) False
    print(num4.isdecimal()False
    print(num5.isdecimal())False
    #unicode,汉子,罗马,除了bytes类型的都可以判断
    print(num2.isnumeric()) True
    print(num3.isnumeric()) True
    print(num4.isnumeric()True
    print(num5.isnumeric())True
    #
    msg='    1'
    print(msg.isspace()) #表示是否全部是空格,是就True
    msg='aaifbb'
    print(msg.isidentifier()) #表示是否包含python的关键字,有就是true,这里的关键字是if
    

    三、列表类型

    #定义:[]内多个任意类型的值,逗号分隔
    my_girl_friends=['alex','liroutong','linxinru','yangmi',4,5]
    
    #优先掌握的操作
    #按索引存取值(正向存取+反向存取):既可以存也可以取
    print(my_girl_friends[2])
    print(my_girl_friends[-1])
    my_girl_friends[5]='linzhiling'#存值
    print(my_girl_friends)
    #切片(顾头不顾尾,步长)
    print(my_girl_friends[0:2]) #取前两个
    print(my_girl_friends[0:4:2]) #取前四个,以2为步长
    ['alex', 'liroutong']
    ['alex', 'linxinru']
    #长度
    print(len(my_girl_friends)) #统计列表里面元素的个数
    #成员运算in和notin
    print('alex'in my_girl_friends)#元素是否在列表内,在就是True
    print(5 in my_girl_friends)
    #追加
    my_girl_friends.append('6号女友')
    print(my_girl_friends)
    #删除
    del my_girl_friends[0] #最普通的删除,不仅可以删除列表
    print(my_girl_friends)
    my_girl_friends.remove('alex')
    print(my_girl_friends)
    print(my_girl_friends.remove('alex')) #remove是单纯的删除,不会返回删除的值,并且是按照值去删除,结果为none
    my_girl_friends.pop(-1) #按照索引删除,默认从末尾开始删除
    my_girl_friends.pop(1)
    print(my_girl_friends)
    print(my_girl_friends.pop(-1)) #从列表里面拿走一个值,会返回拿走的值
    #常用操作
    my_girl_friends=['alex','liroutong','linxinru','yangmi',4,5]
    my_girl_friends.insert(0,'sbalex') #在哪个索引后面插入值
    my_girl_friends.insert(2,'yh')
    my_girl_friends.extend([1,2,3]) #结果为在列表后面插入多个值为1,2,3
    print(my_girl_friends)
    print(my_girl_friends.count('alex')) #统计alex这个元素有几个
    #了解操作
    my_girl_friends=['alex','liroutong','linxinru','yangmi',4,5]
    my_girl_friends.clear() #清空列表
    print(my_girl_friends)
    l=my_girl_friends.copy() #表示复制一个列表
    print(l)
    my_girl_friends.reverse() #反转
    print(my_girl_friends)
    l=[3,4,-1,2]
    l.sort() #从从到大排序
    l.sort(reverse=True) #从大到小排序
    print(l)
    #练习
    #队列:先进先出,吃了拉
    append,pop
    l=[]
    l.append('first')
    l.append('second')
    l.append('third')
    print(l)
    print(l.pop(0))
    print(l.pop(0))
    print(l.pop(0))
    #堆栈:先进后出,吃了吐
    l=[]
    l.append('first')
    l.append('second')
    l.append('third')
    print(l)
    print(l.pop())
    print(l.pop())
    print(l.pop())
    l=[] #也可以写成如下形式
    l.insert(0,'first') #表示在索引为0的元素后面插入值first
    l.insert(0,'second')
    l.insert(0,'third')
    print(l)
    print(l.pop(0))
    print(l.pop(0))
    print(l.pop(0))
    

    四、元组类型

    #元组只能取不能修改,占的内存空间比列表少,是不可变的,列表可以修改里面的元素,而元组不可以,定义好了之后不能修改
    #定义方式
    ages=(10,12,18,33)#ages=tuple(10,12,18,33)
    print(id(ages),type(ages),ages)
    #优先掌握的操作
    #按索引取值,只能取
    #和列表和字符串一样
    #切片(顾头不顾尾,步长)
    print(ages[0:2])顾头不顾尾
    #长度
    print(len(ages))
    #成员运算in和not in
    print(10 in ages)
    #其他操作
    ages=(10,12,18,33)
    print(ages.index(18)) #查看索引
    print(ages.count(18)) #统计元素的个数,统计18这个元素出现几次
    #while循环列出元素
    l=['a','b','c','d','e']
    # l='abdcde'
    # l=('a','b','c','d','e')
    index=0
    while index < len(l):
        print(l[index])
        index+=1
    #打印字典中的商品名和价格
    msg_dir={
    'apple':10,
    'tesla':100000,
    'mac':3000,
    'lenovo':30000,
    'chicken':10,
    }
    for key in msg_dir: #key会遍历字典的每个key
        print(key,msg_dir[key])
    总结:for循环不依赖于索引,会遍历字符串、列表、元组的每个元素,对于字典,会遍历字典的每个key
    #range可以模拟打印出索引
    for i in range(1,10,2): #顾头不顾尾,结果为1 3 5 7 9
        print(i)
    l = ['a', 'b', 'c', 'd', 'e']
    for i in range(len(l)): #range可以模拟出打印索引
        print(i,l[i])
    
    #练习,打印商品名、价格、个数,保存到列表中
    msg_dir={
    'apple':10,
    'tesla':100000,
    'mac':3000,
    'lenovo':30000,
    'chicken':10,
    }
    goods_l=[]#注意此处不能定义为元组,因为元组中不能追加元素,不能进行修改,定义好了只能查看
    while True:
        for key in msg_dir:
            print(key,msg_dir[key])
        choice=input('商品名>>:').strip()#.strip()为去除用户输入的空
        if choice not in msg_dir:
            continue
        count=input('个数>>:').strip()
        if count.isdigit(): 判断是否为整数
            goods_l.append((choice,msg_dir[choice],int(count))) #把商品名、价格、购买个数保存到元组中,再把这个元组追加到列表goods_l中,相当于在goods_l列表中追加元素,元素的类型为元组
            print(goods_l)
    #for+else  如果循环过程中没有被break或者continue打断,就执行else
    for i in range(5):
        if i == 3:
            break
        print(i)
    else:
            print('ok')
    总结:数字、字符串和元组都是不可变类型,列表是可变类型
    

    五、字典类型

    #作用:存多个值,key-value存取,取值速度快
    #定义:key必须是不可变类型,value可以是任意类型
    d={'a':1}
    d={0:1}
    d={(1,2,3):1}
    d={[1,2,3]:1} #会报错。说明key不可以是可变类型
    #优先掌握的操作
    #按key存取值,可存可取
    info={'name':'egon','age':18,'sex':'male'}
    print(info['sex'])
    info['hobbies']=['read','music','play','sleep','eat'] #可以根据key进行存值
    print(info)
    #长度
    print(len(info)) #统计元素的个数
    #成员运算in和not in
    print('name' in info)
    print(18 in info) #成员运算时key的运算,而不是value的运算
    #删除
    print(info.pop('name')) #删除并取值
    print(info.pop('name13',None)) #如果没有这个key就返回None
    #键keys(),值values(),键值对items()
    print(info.keys())
    print(info.values())
    print(info.items()) #打印键值
    for key in info.keys():
        print(key)
    for val in info.values():
        print(val)
    for item in info.items():
        print(item[0],item[1])
    #其他方法
    info={'name':'egon','age':18,'sex':'male'}
    print(info.get('name123')) #即使没有这个key也不会报错,而是返回None
    print(info.get('name123',123)) #如果没有还可以自己指定值为123
    print(info.popitem())#删除并取值,删除的是键和值,并且从最后一个删除
    #补充两种赋值方式
    #一、链式赋值
    x=y=z=10
    print(id(x),id(y),id(z))
    #交换两个变量的值
    m=10
    n=20
    m,n=n,m
    print(m,n)
    #二、从一个数据类型中解压出我们想要的值
    t=(10.3,11.2,12.1,14.3,3.1)
    x,y,z,a,b=t
    print(x,y,z,a,b) #打印结果为10.3 11.2 12.1 14.3 3.1
    x,_,_,_,b=t #用下划线表示不需要打印的变量名
    print(x,b)
    print(_) #打印出来的是最后一个下划线匹配的变量
    x,*_,b=t #也可以用这种形式匹配任意的变量名
    print(x,b)
    x,*_='hello'
    print(x)  只打印x
    #总结:字符串、列表、元组都可以用这种方式取出我们想要的值
    x,y,z={'a':1,'b':2,'c':3}
    print(x,y,z)   #只取key
    #常用方法
    info={'name':'egon','age':18,'sex':'male'}
    for item in info.items():
        print(item) #取出键值放到元组里面
    for k,v in info.items(): #用这种方式可以一次取出字典里的键和值
        print(k,v)
    
    #了解
    info={'name':'egon','age':18,'sex':'male'}
    info_new={'a':1,'age':19}
    info.update(info_new) #用info_new来更新info这个字典,当info里面有的就覆盖,没有的就加到后面
    print(info) #结果为{'name': 'egon', 'age': 19, 'sex': 'male', 'a': 1}
    dic1={}.fromkeys(['name','age','hobbies'],None) #用于初始化一个字典,值为None
    print(dic1 )
    结果:{'name': None, 'age': None, 'hobbies': None}
    info={'name':'egon','age':18,'sex':'male'}
    info.setdefault('age',19) #如果字典中已经有key,则不修改,返回原来的值,没有这个key则新增,并返回的是新增的值
    

    六、集合类型

    #作用:去重,关系运算
    #定义:
    #1、每个元素必须是不可变类型,不能是列表,列表是可变类型
    #2、没有重复的元素
    #3、无序
    s={1,2,'a'} #s=set({1,2,'a'})
    print(type(s),s)
    #长度
    s={1,2,'a'}
    print(len(s)) #显示元素的个数
    #成员运算in和not in
    print('a' in s)
    for item in s:
        print(item)
    #|并集
    s1={1,2,3}
    s2={3,4.5}
    print(s1 | s2)
    #&交集
    print(s1 & s2)
    #-差集
    print(s1 -s2) #表示在s1里面不在s2里面
    
    #对称差集
    s1={1,2,3}
    s2={3,4.5}
    print(s1 ^ s2) #去除s1和s2同时存在的
    s1={1,2,3}
    s2={3,4.5}
    print(s1 > s2) #s1是否包含s2
    == ,>, >= ,< ,<= :父集,子集
    #其他方法:
    s1={1,2,3,4}
    s2={3,4,5}
    #并集
    print(s1.union(s2))
    #交集
    print(s1.intersection(s2))
    #差集
    print(s1.difference(s2))
    #对称差集
    print(s1.symmetric_difference(s2))
    print(s1.issuperset(s2)) #s1是s2的父集
    print(s2.issubset(s1)) #s2是否是s1的子集
    #常用操作
    s1={1,2,3,4}
    print(s1.pop()) #随机的删除一个元素,并返回删除的结果
    print(s1.remove(2)) #删除的时候需要制定元素,并且返回值为None,不会返回删除的结果,并且如果删除的元素不存在,则报错
    print(s1.discard('dd')) #单纯的删除,不会返回删除的结果,如果删除的元素不存在,不会报错,返回None
    s1.add('b') #添加一个元素
    print(s1)
    s1={1,2,3}
    s2={4,5}
    print(s1.isdisjoint(s2)) #如果s1和s2没有交集就返回True
    #去重
    l=[1,2,3,4,5,3,4]
    print(list(set(l))) #去重之后回到列表类型
    总结:字典是可变类型,集合是可变的
    

    七、字符编码

    就是汉字和数字的对应关系,将不同的语言转换成对应的数字的编码格式
    unicode 可以兼容全世界的编码,用2个bytes存的,英文用1个bytes存,所以unicode浪费空间
    
    Python2默认用ASCII编码,Python3默认用UTF-8编码,文件以什么编码存的就要以什么编码去取,这样才不会出现乱码
    一个16进制由4位二进制组成,一个字节由8位二进制组成,所以2个16进制
    是一个字节
    #coding:gbk'
    x='上'
    print([x])  #可以打印出x这个变量,在内存空间中真正存储的值是什么样的
    使用python2打印出来的结果是['\xc9\xcf'],\x代表16进制,c9表示两个16进制,cf表示两个16进制,总共4个16进制,占两个字节
    unicode =====encode ======>gbk #将unicode转化成其他编码,gbk是中文的编码
    gbk====decode====>unicode #将其他编码转化成unicode编码
    #coding:gbk
    x='上'
    print([x.decode('gbk')]) #将gbk转化成unicode,并且只看unicode中gbk那一列
    [u'\u4e0a'] #结果是这个,说明转化成unicode格式
    y=x.decode('gbk')
    print([y.encode('gbk')]) #将unicode转化为gbk
    print([y.encode('utf-8')]) #将unicode转化为utf-8
    x=u'上' #直接以unicode格式存储
    print(type(x))
    print([x.encode('gbk')])
    在python2中防止出现乱码,可以在字符串前面加u,定义的时候在内存中就以unicode格式存储,unicode会转化成任意格式的编码,就不会出现乱码
    x=u'上'
    print(x)
    Python3中定义变量时不用加u默认就是unicode格式
    

    相关文章

      网友评论

          本文标题:第二篇 基本数据类型

          本文链接:https://www.haomeiwen.com/subject/phhyeftx.html