• 数据类型


    一、可变不可变类型

    1. 可变类型:值改变,但是id不变,证明就是在改变原值,是可变类型

    L =['a','b','c','d']
      print(id(L))
    L[0]='A' # 给列表L第一项元素重新赋值
      print(L)
    print(id(L))
    #输出结果如下:
    30237320
    x=int('123123')
      print(x,type(x)
    #输出结果如下:
      123123 <class 'int'>
     
    x=int('12.3')
    #输出结果如下
    ValueError: invalid literal for int() with base 10: '12.3'
    
    ['A', 'b', 'c', 'd']
    30237320

    2. 不可变类型:值改变,但是id也跟着变,证明是产生了新的值,是不可变类型

    x=11
    print(id(x))
    x=22
    print(id(x))
    #输出结果如下:
    8791546520720
    8791546521072

    二、数字类型

    1.整型

    (1)、用途:记录年龄、等级、数量
    (2)、定义方式
    age = 10 # age=int(10)
    3)数据类型转换:只能将纯数字的字符串转成int
    x=int('123123')
      print(x,type(x)
    #输出结果如下:
      123123 <class 'int'>
     
      x=int('12.3')
    #输出结果如下
    ValueError: invalid literal for int() with base 10: '12.3'

    2.浮点型float

    (1、用途:记录身高、薪资、体重

    (2)、定义方式
     salary = 10.1 # salary=float(10.1)
    (3)数据类型转换: 只能将包含小数的字符串转成float
    x=float('3.1')
      print(x,type(x))
    #输出结果如下:
    3.1 <class 'float'>

    总结;数字类型是不可变类型,同时只能存一个值

    三、字符串类型

    1、用途:记录描述性质的状态
    2、定义方式:在单引号、双引号、三引号内包含一串字符串
    msg='hello' # msg=str('hello')
    小点:
    数据类型转换:所有类型都可以被str转成字符串类型
    res=str([1,2,3])
      print(res,type(res))
    #输出结果如下:
    [1, 2, 3] <class 'str'>
    3、常用操作+内置的方法(掌握程度*****)
    3.1、按索引取值(正向取+反向取) :只能取
    msg='hello'
      print(msg[0],type(msg[0])) #取其第一个字符,打印其的类型
      print(msg[-1])                    #从最后第一项索引字符
      print(msg[-2])                    #从最后第二项索引字符
    #输出结果如下:
      h <class 'str'>
      o
      l
    
    msg[0]='H'                        # 只能取,不能用
    #输出结果如下:
    'str' object does not support item assignment
    3.2、切片(顾头不顾尾,步长)
    msg='hello world'
    res=msg[0:3:1] #[0:3:1] 0代表从字符串第一位索引,3代表截止到第三位,1代表步长。
    msg='hello world'
    res=msg[0:3:1] # 0 1 2
      print(res)
      print(msg)
    #输出结果如下:
    hel
    hello world
    
    
    msg='hello world'              
    res=msg[:]                   #不指名两端位置,默认索引全部
    res=msg[::2]               # 0 2 4 6 8 10,此时步长为2
      print(res)
    #输出结果如下:
    hlowrd
    
    msg='hello world'
    res=msg[-1:-12:-1]   # 代表从最后一项开始索引,步长为往左走一步
    #res=msg[-1::-1]       同上
    #res=msg[::-1]          同上
      print(res)
    #输出结构如下:
    dlrow olleh
    3.3、长度len
    msg='hello world'
    print(len(msg))
    #输出结果如下:
    11 #指的是该字符串的长度,包括里面的空格

    3.4、成员运算in和not in:判断一个子字符串是否存在于大字符串中;not in 代表取反
    msg='kevin is dsb'
      print('kevin' in msg)
      print('b' in msg)
      print('aaa' not in msg)
      print(not 'aaa' in msg)
    #输出结果如下:                     即只要里面含有该片段的字符,即为True
    True
    True
    True
    True
    3.5、移除空白strip: 用来去除字符串左右两边的字符,不指定默认去除的是空格
    msg='      he llo     '
    res=msg.strip()        #.strip()默认去除字符串两边的空格
      print(res,id(res))          
      print(msg,id(msg))
    #输出结果如下:
    he llo 31293600          #去除两边空格后的结果,中间空格没去除
          he llo      31912776  #原始输出的结果,发现Id改变了,即字符串是不
                                            可变类型
    
      print('***+-/***eg*on#@$*****'.strip('*+-/#@'))
      print('***+-/***eg*on#@$*****'.strip('*+-/#$@'))
    #输出结果如下:
    eg*on#@$    #当.strip()里指定要去除的字符时,看该字符串左右是否存在
    eg*on           #要去除的字符,如果存在,即抹去;不存在,保留
    3.6、切分split:针对有规律的字符串,按照某种分隔符切成列表
    info='egon:18:male'
    res=info.split(':')    #split(self,sep,maxsplit) 即(分隔符,最大分割数 )
      print(res,type(res))   # 当不知道分割数时,默认走完
      print(res[0],res[1])
    #输出结果如下:
      ['egon', '18', 'male'] <class 'list'>
    egon 18
    
    cmd='get|a.txt|33333'
      print(cmd.split('|',1)) #此时指定分割数为1,则从左往右分割一个'|'成为                                      #输出结果如下:         #列表即可      
      ['get', 'a.txt|33333']
    3.7、循环
    for item in 'hello':
    print(item)
    #输出结果如下:
    h
    e
    l
    l
    o


    以下为需要掌握的操作:
    1、strip,lstrip,rstrip
    print('******egon***********'.strip('*'))   #去除两边的‘*’
    print('******egon***********'.lstrip('*'))   #去除左边的'*
    print('******egon***********'.rstrip('*'))  #去除右边的‘*’
    #输出结果如下:        
    egon
    egon***********
    ******egon          #用于移除字符串头尾指定的字符(默认为空格或换行
                                 #   符)或字符序列。
    2、lower,upper,title
    print('Abc123 cde'.lower())    #字符串里的字符都小写
    print('Abc123 cde'.upper())   #字符串里的字符都大写
    print('Abc123 cde'.title())      #字符串里的单词第一个字符大写
    #输出结果如下:
    abc123 cde
    ABC123 CDE
    Abc123 Cde     
    3、startswith,endswith
    msg='alex is dsb'
    print(msg.startswith('alex'))
    print(msg.endswith('b'))
    #输出结果如下: 
    True       
    True             #startswith() 方法用于判断字符串是否以指定前缀开头,如果
                          是则返回 True,否则返回 False
                       #endswith() 方法用于判断字符串是否以指定后缀结尾,如果
                          是则返回True,否则返回False。
    4、format的三种玩法
    res='my name is %s my age is %s' %('egon',18)
      print(res)
    #输出结果如下:
    my name is egon my age is 18     #此处是占位符的原始使用
                                                     #以下为format的使用
    res = 'my name is {name} my age is {age}'.format(age=18, name='egon')
      print(res)
    #输出结果如下:                         
    my name is egon my age is 18
    
    #了解
    res='my name is {} my age is {}'.format('egon',18)
      print(res)
    #输出结果如下:
    my name is egon my age is 18
    
    res='my name is {0}{1} my age is {1}{1}'.format('egon',18)
      print(res)
    #输出结果如下:
    my name is egon18 my age is 1818

    format使用拓展:

    #通过位置
    print '{0},{1}'.format('chuhao',20)
    
    print '{},{}'.format('chuhao',20)
    
    print '{1},{0},{1}'.format('chuhao',20)
    
    #通过关键字参数
    print '{name},{age}'.format(age=18,name='chuhao')
    
    class Person:
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        def __str__(self):
            return 'This guy is {self.name},is {self.age} old'.format(self=self)
    
    print str(Person('chuhao',18))
    
    #通过映射 list
    a_list = ['chuhao',20,'china']
    print 'my name is {0[0]},from {0[2]},age is {0[1]}'.format(a_list)
    #my name is chuhao,from china,age is 20
    
    #通过映射 dict
    b_dict = {'name':'chuhao','age':20,'province':'shanxi'}
    print 'my name is {name}, age is {age},from {province}'.format(**b_dict)
    #my name is chuhao, age is 20,from shanxi
    
    #填充与对齐
    print '{:>8}'.format('189')
    #     189
    print '{:0>8}'.format('189')
    #00000189
    print '{:a>8}'.format('189')
    #aaaaa189
    
    #精度与类型f
    #保留两位小数
    print '{:.2f}'.format(321.33345)
    #321.33
    
    #用来做金额的千位分隔符
    print '{:,}'.format(1234567890)
    #1,234,567,890
    
    #其他类型 主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制。
    
    print '{:b}'.format(18) #二进制 10010
    print '{:d}'.format(18) #十进制 18
    print '{:o}'.format(18) #八进制 22
    print '{:x}'.format(18) #十六进制12
    View Code
    5、split,rsplit
    u="www.doiido.com"
    #使用默认空格符来分割
    print(u.split())
    #输出结果为:
    ['www.doiido.com']
    
    #以‘.’为分割符
    print(u.split('.'))
    #输出结果:
    ['www', 'doiido', 'com']
    
    #分割0次
    print(u.split('.',0))
    #输出结果为
    ['www.doiido.com']
    
    #分割一次
    print(u.split('.',1))
    #输出结果为:
    'www', 'doiido.com']
    
    #分割两次
    print(u.split('.'2))
    #输出结果
    ['www', 'doiido', 'com']
    
    str:   表示为分隔符,默认为空格,但是不能为空('')。若字符串中没有分隔符,则把整个字符串作为列表的一个元素
    num:表示分割次数。如果存在参数num,则仅分隔成 num+1 个子字符串,并且每一个子字符串可以赋给新的变量
    [n]:   表示选取第n个分片
    
    
    rsplit 待续
    View Code
    6、replace
    Python replace() 方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。
    msg='apple appld   cppld'
      print(msg.replace('p','q'))
    #输出结果
    aqqle aqqld   cqqld   #当不指定第三个参数时,会全部替换
     
    
      print(msg.replace('p','q',4))
    #当指定第三个参数时,结果如下
    aqqle aqqld   cppld      #此时只替换了4次
    7、isdigit
     isdigit() 方法检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False
    print('123123'.isdigit()) # 如果字符串是由纯数字组成的,则返回True
    print('123123  '.isdigit())     #此时存在空格,返回False
    print('123123asdf'.isdigit())
    print('12312.3'.isdigit())
    #输出结果
    True
    False
    False
    False

    了解的部分:

    # 1、find,rfind,index,rindex,count
    # print('123 ke123ke'.find('ke'))
    # print('123 ke123ke'.rfind('ke'))
    # print('123 ke123ke'.index('ke'))
    # print('123 ke123ke'.rindex('ke'))
    
    # print('123 ke123ke'.find('xxxx'))
    # print('123 ke123ke'.index('xxxx'))
    # print('123 ke123ke'.count('ke',0,6))
    
    # 2、center,ljust,rjust,zfill
    # print('egon'.center(50,'*'))
    # print('egon'.ljust(50,'*'))
    # print('egon'.rjust(50,'*'))
    
    # print('egon'.rjust(50,'0'))
    # print('egon'.zfill(50))
    
    # 3、captalize,swapcase,title
    # print('abcdef dddddd'.capitalize())
    # print('abcAef dddddd'.swapcase())
    # print('abcAef dddddd'.title())
    
    # 4、is数字系列
    num1 = b'4'  # bytes
    num2 = '4'  # unicode,python3中无需加u就是unicode
    num3 = ''  # 中文数字
    num4 = ''  # 罗马数字
    
    # bytes与阿拉伯数字组成的字符串
    # print(num1.isdigit())
    # print(num2.isdigit())
    # print(num3.isdigit())
    # print(num4.isdigit())
    
    # 阿拉伯数字组成的字符串
    # print(num2.isdecimal())
    # print(num3.isdecimal())
    # print(num4.isdecimal())
    
    # 阿拉伯数字中文罗马组成的字符串
    # print(num2.isnumeric())
    # print(num3.isnumeric())
    # print(num4.isnumeric())
    View Code
    总结:
    存一个值

    不可变
    例如:通过索引只能取值,不能用该值,strip改变不了原始的状态。


    四、列表类型
    1、用途:按照位置记录多个值,索引对应值
    2、定义方式:在[]内用逗号分隔开多个任意类型的值
    l=['a',11,11.3,] # l=list(['a',11,11.3,])

    数据类型转换:但凡能够被for循环遍历的数据类型都可以传给list,被其转换成列表
    res=list('123')
      print(res)
    #输出结果  ['1', '2', '3']
    
    res=list({'a':1,'b':2,'c':3}) # []
      print(res)  
    #输出结果   ['a', 'b', 'c']
     3、常用操作+内置的方法
    3.1、按索引存取值(正向存取+反向存取):即可存也可以取
    l=['a','b','c','d','e']
      print(l[0])    #a
      print(l[-1])   #e
      print(id(l))   #30171848
    l[0]='A'
      print(l)       #['A', 'b', 'c', 'd', 'e']
      print(id(l))   #30171848                          此时说明列表是可变类型
    强调强调强调!!!:对于不存在的索引会报错
      print(l[5])   # list index out of range
    
    dic={"k1":111}      #原始字典
    dic['k2']=2222      #加上一个键值对
      print(dic)          #结果为 {'k1': 111, 'k2': 2222}        证明可存
    3.2、切片(顾头不顾尾,步长)
    l=['a','b','c','d','e']
      print(l[1:4])         #['b', 'c', 'd']
      print(l[::-1])        #['e', 'd', 'c', 'b', 'a']
    3.3、长度
    l=['a','b','c','d','e']
      print(len(l))       #输出结果为   5
    3.4、成员运算in和not in
    l=['a','b','c','d','e']   
      print('a' in l)                #  True
      print('a'not in l)             #False
      print(1 not in l)              #True
    3.5、追加与insert
    l=['a','b','c','d','e']
    l.append('xxx')         
    l.append('yyy')   #append()将添加的元素加入最后一个位置
      print(l)              #'a', 'b', 'c', 'd', 'e', 'xxx', 'yyy']     
    l.insert(0,'xxxx')    # 指定位置,添加
      print(l)              #['xxxx', 'a', 'b', 'c', 'd', 'e', 'xxx', 'yyy'] 
    3.6、删除
    3.6.1、del是一种通用的删除操作,没有返回值
    l=['a','bbb','c','d','e']
    del l[0]
      print(l)       #['bbb', 'c', 'd', 'e']
    
    dic={'k1':1}
    del dic['k1']
      print(dic)      #{}     把键删了,对应的值也消失,此时只剩下空的dict
    3.6.2、remove(指定要删除的那个元素),没有返回值
    l=['a','bbb','c','d','e']
    res=l.remove('bbb')          #删除‘bbb’,同时给res赋值
      print(l)        #['a', 'c', 'd', 'e']            
      print(res)      #None           res明显为空
    3.6.3、pop(指定要删除的那个元素的索引),返回刚刚删掉的那个元素
    l=['a','bbb','c','d','e']
    l.pop(-1)         #删除‘e’
    res=l.pop(1)      #给res赋值为l删除‘bbb’后的列表,同时自身删除'bbb'
      print(l)           #['a', 'c', 'd']
      print(res)         #bbb
    3.7 循环
    l=['a','b','c','d','e']
    for item in l:
        print(item)  
    #输出结果为:
    a
    b
    c
    d
    e
    队列与堆栈
    # 队列:先进先出              堆栈:先进后出(后进先出)
    # l=[] l=[]
    # # 入队 入队
    # l.append('first')
    # l.append('second')
    # l.append('third')
    # print(l)
    # # 出队 出队
    # print(l.pop(0)) print(l(pop(-1))
    # print(l.pop(0)) print(l(pop(-1))
    # print(l.pop(0)) print(l(pop(-1))

    需要掌握的操作: append和extend的区别
    l=['aaa','bb',345]
    l.clear()               #删除所有
      print(l)                #[]
    l.append([1,2,3])       #加上集合[1,2,3]
      print(l)                #[[1,2,3]] 
    
    l=[1,2,3,4]
    l.append([5,6,7])  
      print(l)               #[1,2,3,4,[5,6,7]]    
    
    l=[1,2,3,4]
    l.extend([5,6,7])
      print(l)               #[1,2,3,4,5,6,7]
    extendextend将它的参数视为 list,extend的行为是把这两个list接到一起,append是将它的参数视为element,作为一个整体添加上去的。
    append是整建制地追加,extend是个体化扩编。
    append()方法使用
    
    首先看官方文档中的描述:
    
    list.extend(L)             Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.
    
     翻译成汉语就是:        通过将所有元素追加到已知list来扩充它,相当于a[len(a):]= L
    
    举个例子,更能明白这句话
    
    >>> la
    [1, 2, 3]
    >>> lb
    ['qiwsir', 'python']
    >>> la.extend(lb)
    >>> la
    [1, 2, 3, 'qiwsir', 'python']
    >>> lb
    ['qiwsir', 'python']
    
    如果有两个list,一个是la,另外一个lb,将lb追加到la的后面,也就是把lb中的所有元素加入到la中,
    即让la扩容。看代码
    >>> la = [1,2,3]
    >>> b = "abc"
    >>> la.extend(b)
    >>> la
    [1, 2, 3, 'a', 'b', 'c']
    >>> c = 5
    >>> la.extend(c)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      TypeError: 'int' object is not iterable
    原来,如果extend(str)的时候,str被以字符为单位拆开,然后追加到la里面。如果extend的对象是数值型,则报错。
    
    所以,extend的对象是一个list,如果是str,则python会先把它按照字符为单位转化为list再追加到已知list。
    
    
    
    
    
    >>> la
    [1, 2, 3, 'a', 'b', 'c']
    >>> lb
    ['qiwsir', 'python']
    >>> la[len(la):]=lb
    >>> la
    [1, 2, 3, 'a', 'b', 'c', 'qiwsir', 'python']
    
    为什会出现输入la,运行后 [1, 2, 3, 'a', 'b', 'c', 'qiwsir', 'python']   因为  list.extend(L) 等效于 list[len(list):] = L,  L是待并入的list。
    
    
    
    
    extend()方法使用
    >>> new = [1,2,3]
    >>> lst = ['python','qiwsir']
    >>> lst.extend(new)
    >>> lst
    ['python', 'qiwsir', 1, 2, 3]
    >>> new
    [1, 2, 3]
    通过extend函数,将[1,2,3]中的每个元素都拿出来,然后塞到lst里面,从而得到了一个跟原来的对象元素不一样的列表,后面的比原来的多了三个元素。
    
    还要关注一下,从上面的演示中可以看出,lst经过extend函数操作之后,变成了一个貌似“新”的列表。这句话好像有点别扭,“貌似新”的,之所以这么说,是因为对“新的”可能有不同的理解。不妨深挖一下。
    
    >>> new = [1,2,3]
    >>> id(new)
    3072383244L
    
    >>> lst = ['python', 'qiwsir']
    >>> id(lst)
    3069501420L
    用id()能够看到两个列表分别在内存中的“窝”的编号。
    
    >>> lst.extend(new)
    >>> lst
    ['python', 'qiwsir', 1, 2, 3]
    >>> id(lst)
    3069501420L
    注意到没有?虽然lst经过extend()方法之后,比原来扩容了,但是,并没有离开原来的“窝”,也就是在内存中,还是“旧”的,只不过里面的内容增多了。相当于两口之家,经过一番云雨之后,又增加了一个小宝宝,那么这个家是“新”的还是“旧”的呢?角度不同或许说法不一了。
    
    这就是列表的一个重要特征:列表是可以修改的。这种修改,不是复制一个新的,而是在原地进行修改。
    
    其实,append()对列表的操作也是如此,不妨用同样的方式看看。
    
    说明:虽然这里的lst内容和上面的一样,但是,我从新在shell中输入,所以id会变化。也就是内存分配的“窝”的编号变了。
    
    >>> lst = ['python','qiwsir']
    >>> id(lst)     
    3069501388L
    >>> lst.append(new)
    >>> lst
    ['python', 'qiwsir', [1, 2, 3]]
    >>> id(lst)
    3069501388L
    显然,append()也是原地修改列表。
    
    如果,对于extend(),提供的不是iterable类型对象,会如何呢?
    
    >>> lst.extend("itdiffer")
    >>> lst
    ['python', 'qiwsir', 'i', 't', 'd', 'i', 'f', 'f', 'e', 'r']
    它把一个字符串"itdiffer"转化为['i', 't', 'd', 'i', 'f', 'f', 'e', 'r'],然后将这个列表作为参数,提供给extend,并将列表中的元素塞入原来的列表中。
    
    >>> num_lst = [1,2,3]
    >>> num_lst.extend(8)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not iterable
    这就报错了。错误提示中告诉我们,那个数字8,是int类型的对象,不是iterable的。
    
    这里讲述的两个让列表扩容的函数append()和extend()。从上面的演示中,可以看到他们有相同的地方:
    
    都是原地修改列表
    既然是原地修改,就不返回值
    原地修改没有返回值,就不能赋值给某个变量。
    
    >>> one = ["good","good","study"]
    >>> another = one.extend(["day","day","up"])    #对于没有提供返回值的函数,如果要这样,结果是:
    >>> another                                     #这样的,什么也没有得到。
    >>> one
    ['good', 'good', 'study', 'day', 'day', 'up']
    那么两者有什么不一样呢?看下面例子:
    
    >>> lst = [1,2,3]
    >>> lst.append(["qiwsir","github"])
    >>> lst
    [1, 2, 3, ['qiwsir', 'github']]  #append的结果
    >>> len(lst)
    4
    
    >>> lst2 = [1,2,3]
    >>> lst2.extend(["qiwsir","github"])
    >>> lst2
    [1, 2, 3, 'qiwsir', 'github']   #extend的结果
    >>> len(lst2)
    5
    append是整建制地追加,extend是个体化扩编。
    
         extend将它的参数视为 list,extend的行为是把这两个list接到一起,append是将它的参数视为element,作为一个整体添加上去的。
    List里可以有任意的数据类型,所以,要分清这俩函数的区别。
    View Code
    sort的使用:只有在类中中所有元素都是同种类型的情况下才能用sort排序
    l=[1,3,2]
    l.sort(reverse=True)      #相反的是True,即从小到大打印
      print(l)                  #[3, 2, 1]
    
    
    l=['z','d','a']
    l.sort()     
      print(l)                  #['a', 'd', 'z']   
    总结:
    存多个值

    有序

    可变










  • 相关阅读:
    php字符串
    碰撞检测
    javascript倒计时
    日期
    雪花那个飘
    VBS学习笔记(2): Call造成的麻烦
    VBS学习笔记(3): Array和Collection的不同
    NotepadAutomationDemo的代码V2
    VBS学习笔记(1): Set的取舍
    SQL Server之旅:(三)Attach mdf without ldf
  • 原文地址:https://www.cnblogs.com/wangyisen/p/10581865.html
Copyright © 2020-2023  润新知