一、字符串
    s = 'python'
    s1 = 'python' + 'learn'        #相加其实就是简单拼接
    s2 = 'python' * 5            #相乘其实就是复制自己多少次,再拼接在一起
    字符串切片:
        a= 'abcdefg'
        print(a[0])                # 索引即下标,就是字符串组成的元素从第一个开始,初始索引为0以此类推。
        print(a[0:])             #默认到最后
        print(a[0:-1])             #-1就是最后一个
        print(a[0:5:2])            #加步长
        print(a[5:0:-2])        #反向加步长
    
    print(s.capitalize())         #首字母大写
    print(s.swapcase())            #大小写翻转
    print(s.title())             #每个单词的首字母大写
    print('learn'.center(20,'*'))        #居中,总长度,空白处填充
    print('learnnnn'.count('n',0,6))    #计算字符串中某元素出现的个数,可切片。
    print('pyt\t12345ho\tn'.expandtabs())    #补全 (tab -> 8个字符)    # pyt     12345ho n
    print('python'.find("pyt",1,6))            #返回的找到的元素的索引,如果找不到返回-1
    print('python'.index("pyt",1,6))         #返回的找到的元素的索引,找不到报错。
    #str <---转---> list
    print(''.join({'1','2','3'}))            #""中是什么,就以什么作为拼接符,将参数中所有的str元素合并为一个新的字符串
    print('py t,hon'.split())                #以什么分割,最终形成一个列表此列表不含有这个分割的元素。默认空格。
    print('py t.h.on'.rsplit('.',1))        #从右往左,取一个分割符    #['py t.h', 'on']
    print(' python* '.strip())            #默认去掉两端的空格。        #python*
    print('* *python*'.rstrip('*'))        #去掉字符串右边的空格'*'    #* *python
    print('* *python*'.lstrip('*'))        #去掉字符串左边的空格'*'    # *python*
    print('abcbc'.replace('bc','SB',1))    #替换,且替换一处    #aSBbc
    
    print('abc123'.isalnum())    #字符串由字母或数字组成
    print('abc123'.isalpha())    #字符串只由字母组成
    print('abc123'.isdigit())    #字符串只由数字组成
    
    # S.format的用法
    res1='{} {} {}'.format('a',18,'male')
    res2='{1} {0} {1}'.format('a',18,'male')
    res3='{name} {age} {sex}'.format(sex='male',name='a',age=18)
    print(res1,'\n',res2,'\n',res3)
    
    print('{:-^50}\n{}\n'.format('欢迎','>>>返回请输入 b ,退出请输入 q'))
    # print('{name}今年{age}'.format(name='ming',age=18))    #通过关键字
    # grade = {'name' : 'ming', 'age': '18'}
    # print('{name}今年{age}'.format(**grade))    #通过关键字,可用字典当关键字传入值时,在字典前加**即可
    # print('{0}今年{1}'.format('ming','18'))
    # 填充和对齐^<>分别表示居中、左对齐、右对齐,后面带宽度
    # print('{:^14}'.format('ming'))
    # print('{:>14}'.format('ming'))
    # print('{:<14}'.format('ming'))
    # print('{:*<14}'.format('ming'))
    # print('{:&>14}'.format('ming'))

二、元组tuple
    元组被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组。
    例:tup1=(1,2,3) tup2=("a","b","c")
        tup3=(1,2,[],{})        #tup3中的[],{}可修改,因为tuple存的是list和dict的内存地址,用id()查
    注:如果元组里面只有一个元素切不加“,”,那么元素是什么类型,就是什么类型。

三、列表list:
    li = [1,'a','b',2,3,'a']
    # li.insert(0,55)         #按照索引去增加
    # li.append('aaa')         #增加到最后
    # li.append([1,2,3])     #增加到最后
    # li.extend([1,2,3])    #迭代添加
    
    # l1 = li.pop(1)     #按照位置去删除,有返回值
    # del li[1:3]         #按照位置去删除,也可切片,删除没有返回值。
    # li.remove('a')    #按照元素去删除
    # li.clear()        #清空列表
    
    # li[1] = 'dfasdfas'    #改,对某个元素直接赋值
    # li[1:3] = ['a','b']    #对切片范围赋可迭代对象,将迭代值插入到列表(在选定范围处,有多少插多少,原索引往后移,被选范围将不复存在)
    
    # 查 #切片查,或者循环查
    # print(li.count("a"))    #统计某个元素在列表中出现的次数
    # print(li.index("a"))    #从列表中找出某个值第一个匹配项的索引位置,没有会报错

    # li.sort()        #方法用于在原位置对列表进行排序。str与int并存会报错
    # li.reverse()    #方法将列表中的元素反向存放。

    深浅copy:
    L1 = [1,2,3]
    L2 = L1            # id(L1)=id(L2)        #指向同一个内存地址,修改L1,L2 也会变
    L3 = L1[:]        # id(L1)!=id(L3)    #切片赋值给L3,新开辟内存,互不干扰
    
    L  = ['a']
    L1 = [1,2,L]        #L1的第三个元素是L的内存地址
    L4 = L1[:]            #切片只是复制一层元素给L4,复制L的地址给L4,不复制L指向的值
    L1[-1].append('b')     #L1[2]与L4[2]都指向L,所以L1[2] == L4[2]
    import copy
    L5 = copy.deepcopy(L1)    #对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

四、字典dict:
    #键唯一,可哈希。
    # dic = {"name":"A","age":18,"sex":"male"}
    # dic1 = {"name":"B","weight":100}
    # dic1.setdefault('weight')      # 有键值对,不做任何改变,没有才添加。# dic1.setdefault('weight',100) 
    
    # value1 = dic["name"]                            # 没有会报错
    # value2 = dic.get("djffdsafg","默认返回值")    # 若没有可以返回设定的返回值
    
    # dic['k']='v'                # 添加
    # print(dic1.pop('age'))    # 有返回值,按键删除
    # dic2.update(dic)            # 将dic所有的键值对覆盖添加(相同的覆盖,没有的添加)到dic2中
    
    
    # item = dic.items()
    # keys = dic.keys()
    # values = dic.values()
    # dic_clear = dic.clear()  # 清空字典

    #字典的循环
    # for key in dic:                #key为键
    # for item in dic.items():        #item = ('name', 'A')
    # for key,value in dic.items():    #key,value = 'name', 'A'

五、enumerate
    #枚举,对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),
    #enumerate将其组成一个索引序列,利用它可以同时获得索引和值。
        >>>s = enumerate([1,2,3,4,5,6])
        >>>s.__next__()
        >>>(0, 1)
        # for i in enumerate(li):
        # for index,name in enumerate(li,2):    # 起始位置默认是0,可更改

六、range
    #指定范围,生成指定数字。
    #1.默认是从小到大 #2.范围是从小到大,步长需为正 #3.范围是从大小大,步长需为负
    #不满足这三点只是空列表[]
    # for i in range(1,10):        
    # for i in range(1,10,2):    # 步长        # 范围是从小到大,步长需为正
    # for i in range(10,1,-2):    # 反向步长    # 范围是从大小大,步长需为负

七、集合set:
    集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
  去重,把一个列表变成集合,就自动去重了。
  关系测试,测试两组数据间的交集、差集、并集等关系。
    
    set1 = set({1,2,'hobby'})
    set2 = {1,2,'hobby'}
    print(set1,set2)          # {1, 2, 'hobby'} {1, 2, 'hobby'}
    
    set1.add('女神')
    set1.update([1,2,3])    #update:迭代添加,不重复
    
    set1.remove(1)          # 删除一个元素
    set1.pop()                # 随机删除一个元素
    set1.clear()            # 清空集合
    del set1                # 删除集合
    
    set1 & set2        #交集。(&  或者 intersection)
    set1 | set2        #并集。(| 或者 union)
    set1 - set2        #差集。(- 或者 difference)
    set1 ^ set2        #反交集。 (^ 或者 symmetric_difference)
    set1 < set2或set1.issubset(set2)        # set1是set2子集。bool值
    set2 > set1或set2.issuperset(set1)        # set2是set1超集。bool值
    
    #列表去重
    # 1i=[1,2,33,33,2,1,4,5,6,6]
    # set1=set(1i)
    # 1i=list(set1)

    #frozenset不可变集合,让集合变成不可变类型(不可添加删除)。
    s = frozenset('www')
    print(s,type(s))  
    # frozenset({'w'}) <class 'frozenset'>