# python 当中的索引
# str1 = 'abcdefghijk'
'''
索引:
正向索引:从0开始算起,从做到右数
负向索引:从-1开始算起,从右到左数
'''
# print(str1[0]) # 打印的结果a
# print(str1[3]) # 打印的结果d
# print(str1[10]) # 打印的结果为k
# print(str1[20]) # 报错:string index out of range 索引越界的错误
# print(str1[-1]) # 打印的结果为k
# print(str1[-5]) # 打印的结果为g
# Python当中的切片
# 切片语法:[start_index:end_index:step]
# 1.包含开始索引,不包含结束索引
# 2.step如果不写默认值为1
# 3.step如果为整数则从左往右取
# 4.step如果为整数则从右往左取
# 开始索引和结束索引没有值则可以是开始也可以是结尾,取决于步长step
# str1 = 'abcdefghijk'
# print(str1[2:3]) # 打印结果为c
# print(str1[4:8]) # 打印结果为efgh
# print(str1[:4]) # 打印结果为abcd
# print(str1[1:8:3]) # 打印结果为beh
# print(str1[-1:-5:]) # 打印结果为空
# print(str1[-1:-5:-1]) # 打印结果为kjih
# print(str1[:2:-1]) # 打印结果kjihgfed
# print(str1[2::-1]) # 打印的结果为cba
# print(str1[-7:-2:-1]) # 打印结果为空
# print(str1[-7::-1]) # 打印结果为abcde
# print(str1[::]) # 打印结果为abcdefghijk
# print(str1[::-1]) # 打印结果为kjihgfedcba :重点,切片的反转
# python 当中的字符串
# str1 = 'asdfghjkl'
# print(str1.capitalize()) # 结果:Zhang_tao,capitalize()把字符串首字母改成大写
#
# str2 = 'dcs_baoan'
# print(str2.capitalize()) # Dcs_baoan
# print(str2.title()) # Dcs_Baoan 下划线相连的也出现大写
# print(str1.count('a')) # 1
# print('*'.join(str1)) # a*s*d*f*g*h*j*k*l
# print(str1.split('*')) # ['asdfghjkl']指定的分隔符不在字符串当中,则返回一个列表,把当前字符串变成列表中的一个元素
# print(str1.split('d')) # ['as', 'fghjkl'],怎么取值as,print(str1.split('d')[0])
# 字符串可以通过+号来进行拼接(str与int不能进行拼接)
# 练习题,把字符串user_name输出成UserName
# str1 = 'user_name'
# title_name = str1.title()
# spl_name = title_name.split('_')
# user_name = spl_name[0]+spl_name[1]
# print(user_name)
# str1 = 'asdfghjksl'
# print(str1.strip('al')) # 删除开头和结尾有a或者l的字符,是或的关系,只是作用的开头和结尾
# print(str1.lstrip('as')) # 删除字符串开头有as序列字符
# print(str1.rstrip('kl')) # asdfghj 删除字符串结尾有kl序列字符
# print(str1.startswith('as')) # True 判断字符串是否以as开始
# print(str1.startswith('s')) # False
# print(str1.endswith('kl')) # True 判断字符串是否以kl结束
# print(str1.endswith('k')) # False
# endswith 可以判断文件格式是否为.txt结尾的
# file_name = input('请输入您上传的文件名称:')
# if file_name.endswith('.txt'):
# print('输入的文件有效!')
# else:
# print('输入的文件无效!')
# print(str1.find('s')) # 1获取的是索引的值,从左往右查找
# print(str1.rfind('s')) # 8 从右边开始找,如果没有重复的就只有一个值就看不出来
# 不管是find还是rfind显示的都是正向的索引
# str1 = 'asdfghjksl'
# print(str1.replace('s','xz')) # axzdfghjkxzl不加次数,表示全部替换
# print(str1.replace('s','xz',1)) # axzdfghjksl只替换一次
# str1 = 'ASfGhJksl'
# print(str1.lower()) # asfghjksl 把字符串中所有的大写转换成小写
# print(str1.upper()) # ASFGHJKSL 把字符串全部转换成大写
# print(str1.isdigit()) # False 判断字符串中是否全为数字
# print(str1.isalpha()) # True 判断字符串中是否全为字母
# print(str1.isalnum()) # True 判断字符串当中是否全都为数字,全为字母,或者数字字母组合
# 返回布尔值:True和False 如果有特殊符号就是否
# print(str1.istitle()) # 判断字符串中首字母是否为大写,其他是否为小写,其他不为小写则为否
# print(str1.islower()) # False 判断字符串中是否全部为小写
# print(str1.isupper()) # False 判断字符串中是否全部为大写
# 所有的函数需要默写
# python中的列表
# 列表是一个容器,可以装任何类型的数据
# 列表是用list表示
# 表达式为 list = []
# 定义一个列表
# 第一种方法
# list1 = ['duoceshi','dcs13','test',111,666,224]
# print(list1) # ['duoceshi', 'dcs13', 'test', 111, 666, 224]
# print(type(list1)) # <class 'list'> 数据类型为list
# 第二种方法
# str1 = 'duoceshi'
# list1 = list(str1)
# print(list1) # ['d', 'u', 'o', 'c', 'e', 's', 'h', 'i']
# print(type(list1)) # <class 'list'>
# 列表当中常用的函数与用法
# 1.索引赋值
# list1 = ['duoceshi','dcs13','test',111,666,224]
# list1[0] ='hello'
# print(list1)
# 2.切片赋值
# list1 = ['duoceshi','dcs13','test',111,666,224]
# list1[0:2] = 'dcs'
# print(list1) # ['d', 'c', 's', 'test', 111, 666, 224]
# list1 = ['duoceshi','dcs13','test',111,666,224]
# 1.append()函数,在列表末尾处添加一个元素,可以添加任何一个数据类型的数据
# list1.append('hello')
# list1.append(123456)
# print(list1) # ['duoceshi', 'dcs13', 'test', 111, 666, 224, 'hello']
# 2.extend()函数,连接两个列表
# list2 = ['hello']
# list2 = 123456 # TypeError: 'int' object is not iterable
# list1.extend(list2)
# print(list1)
# 3.insert()函数,根据索引位置去添加元素到列表
# list1 = ['duoceshi','dcs13','test',111,666,224]
# list1.insert(0,'hello')
# print(list1) # ['hello', 'duoceshi', 'dcs13', 'test', 111, 666, 224]
# 4.index()函数,查看列表元素的索引值
# list1 = ['duoceshi','dcs13','test',111,666,224]
# print(list1.index('test')) # 2
# 5.remove()函数,移除列表中的元素,根据元素进行删除
# 如果列表中有多个相同元素,删除只会删除最前面一个
# list1 = ['duoceshi','dcs13','test',111,666,224,'dcs13']
# list1.remove('dcs13')
# print(list1) # ['duoceshi', 'test', 111, 666, 224] 根据元素删除列表中的元素
# 6.del,根据索引进行删除
# list1 = ['duoceshi','dcs13','test',111,666,224,'dcs13']
# del list1[0]
# print(list1) # ['dcs13', 'test', 111, 666, 224, 'dcs13']
# 7.sort()函数只会对int类型进行升序排列
# list1 = ['duoceshi','dcs13','test',111,666,224,'dcs13']
# list1 = [1,4,5,3,2]
# list1.sort() # TypeError: '<' not supported between instances of 'int' and 'str'
# print(list1) # [1, 2, 3, 4, 5]
# print(sorted(list1,reverse=True)) # [5, 4, 3, 2, 1] 实现降序排列,reverse=False为升序
# print(sorted(list1,reverse=False)) # [1, 2, 3, 4, 5]
# 8.reverse()函数,反转列表
# list1 = [1,4,5,3,2]
# list.reverse(list1)
# print(list1) # [2, 3, 5, 4, 1]
# 9.pop()函数删除列表中元素,默认删除最后一个
# 不传值的时候会默认删除列表最后一个元素,也可以传入索引进行删除元素
# list1 = [1,4,5,3,2]
# print(list1.pop(2))
# print(list1)
# python 中的元组
# 元组(tuple)的表达式为tuple = ()
# 是一个“写保护”的,创建之后里面的元素不能被修改
# tuple1 = ('hello','dcs',12,['duoceshi',10086])
# print(tuple1)
# print(type(tuple1))
# tuple2 = ('dcs',) # 当元组只有一个元素的时候,在末尾需要加一个','。
# print(tuple2)
# print(type(tuple2))
# tuple1 = ('hello','dcs',12,['duoceshi',10086])
# print(tuple1[3]) # ['duoceshi', 10086]可以使用索引
# print(tuple1[0:2]) # ('hello', 'dcs')可以使用切片
# tuple1[0] = 666
# tuple1.insert(0,'dcs13')
# print(tuple1) # 不能直接被修改
# 间接的进行修改元组,先转换成列表进行改变,改变之后再转换成元组
# tuple1 = (1,2,3,4,5,6)
# list1 = list(tuple1) # 通过list的方法把元组转换成列表
# list1[0] = 'dcs13'
# tuple2 = tuple(list1) # 通过tuple的方法把列表转换成元组
# print(tuple2)
# 元组可以改变吗?
# 当元组中的元素作为一个整体的情况下是不可以被改变的
# tuple1 = ('hello','dcs',12,['duoceshi',10086])
# tuple1[3][0] = 'dcs12' # 当元组中的一个元素为列表的时候,可以通过索引或者切片修改列表中的值 ==》二维数组方法
# print(tuple1)
# tuple1 = ('hello','dcs',12,['duoceshi',10086])
# for i in tuple1: # 用for来进行迭代,取任何一个值
# print(i)
# python 中的字典
# 字典(dict)的表达式为 dict = {}
# 字典是无序的,是以键值对的形式存储也就是key:value
# key是唯一的,值可以任意
# 字典的第一种定义方法
# dict1 = {'name':'xiaozhang','age':18}
# print(dict1)
# print(type(dict1))
# 字典的第二种定义方法
# test = [('name','xiaozhang'),('age',18)]
# dict1 = dict(test) # 通过dict方法把列表转换成字典
# print(type(test)) # <class 'list'>
# print(dict1) # {'name': 'xiaozhang', 'age': 18}
# print(type(dict1)) # <class 'dict'>
# 1.添加一个键值对
# dict1 = {'name':'xiaozhang','age':18}
# dict1['sex'] = 'man' # 如果字典当中存在sex键的话,那么会对sex的值进行修改
# print(dict1) # {'name': 'xiaozhang', 'age': 18, 'sex': 'man'}
# 2.取出字典中的键 ==>通过for循环去遍历字典中所有的键(key)
# dict1 = {'name':'xiaozhang','age':18}
# for i in dict1.keys(): # for i in dict1 不加修饰函数会默认取键(key)
# print(i) # name,age
# 3.取出字典中的值 ==>通过for循环去遍历字典中所有的值(value)
# dict1 = {'name':'xiaozhang','age':18}
# for i in dict1.values():
# print(i)
# 4.取出具体的值
# dict1 = {'name':'xiaozhang','age':18}
# print(dict1['name']) # xiaozhang
# print(dict1['age']) # 18
# 5.字典添加元素setdefault(),当添加的元素存在的话,就会添加无效,且值的默认值为空
# dict1 = {'name':'xiaozhang','age':18}
# dict1.setdefault('sex','man')
# print(dict1) # {'name': 'xiaozhang', 'age': 18, 'sex': 'man'}
# dict1.setdefault('age',18)
# print(dict1) # {'name': 'xiaozhang', 'age': 18}
# dict1.setdefault('sex')
# print(dict1) # {'name': 'xiaozhang', 'age': 18, 'sex': None} 默认值为None
# 6.删除字典
# dict1 = {'name':'xiaozhang','age':18}
# del(dict1)
# print(dict1) # NameError: name 'dict1' is not defined
# 7.删除字典中的元素,根据键来删除
# dict1 = {'name':'xiaozhang','age':18}
# del dict1['name']
# print(dict1)
# 8.for in语句遍历字典第一种方法
# dict1 = {'name':'xiaozhang','age':18}
# for k in dict1:
# print(k,dict1[k]) # dict1[k],是通过k这个键来获取对应的键的值、
# 9.for in语句遍历字典第二种方法
# dict1 = {'name':'xiaozhang','age':18}
# for k,v in dict1.items():
# print(k,v) # 通过items()函数来遍历字典中的键与值
# 10.pop(key)函数,删除指定键并返回删除的值
# dict1 = {'name':'xiaozhang','age':18}
# print(dict1.pop('name')) # xiaozhang 删除并返回删除的值,不能使用索引来删除值
# print(dict1) # {'age': 18} 返回的是剩余的值
# 11.clear()清空字典所有项
# dict1 = {'name':'xiaozhang','age':18}
# dict1.clear()
# print(dict1) # {}
# 12.get(key)方法,通过key获取值,当键不存在,返回None
# dict1 = {'name':'xiaozhang','age':18}
# print( dict1.get('name')) # xiaozhang
# print(dict1.get('sex')) # None
# 13.dromkeys(),函数定义一个初始化的字典,不只是可以用{},也可以用()
# dict1 = {}.fromkeys(['name','age'])
# print(dict1) # {'name': None, 'age': None},相当于定义一个字典,初始化
# dict1['name'] = 'xiaozhang'
# dict1['age'] = 18
# print(dict1) # {'name': 'xiaozhang', 'age': 18}
# dict2 = {}.fromkeys(('name','age'),'xiaozhang')
# print(dict2)
# 14.__contains__())函数,双下划线的函数表示为私有的函数,判断字典中是否含有某个键,存在返回Ture,反之返回Fales
# dict1 = {'name':'xiaozhang','age':18}
# print(dict1.__contains__('name')) # True
# 函数可以使用与判断语句,如下:
# if dict1.__contains__('name1') is True:
# print('判断正确')
# else:
# dict1.setdefault('name1','test')
# print(dict1)
# 15.popitem()删除字典的键值,如果字典为空的话就会报错
# dict1 = {'name':'xiaozhang','age':18}
# pop_dict = dict1.popitem()
# print(type(pop_dict)) # <class 'tuple'>删除之后返回的是一个元组
# print(dict1)
# 16.update(),利用一个字典更新另外一个字典,如果要更新的元素项在原字典里存在,则把原来的项覆盖
# dict1 = {'name':'xiaozhang','age':18}
# dict2 = {'sex':'man'}
# dict1.update(dict2)
# print(dict1) # {'name': 'xiaozhang', 'age': 18, 'sex': 'man'}
# Python中的集合
# 1.可变集合 set
# 2.不可变集合 frozenset
# 集合最大的功能是去重
# name = 'baoan12'
# set1 = set(name)
# set1.clear() # 清除集合的数据
# set1.pop() # 随机删除一个集合元素
# set1.remove('b') # 指定值删除集合中元素
# set1.add('13') # 往集合中添加一个元素
# print(type(set1)) # <class 'set'>
# print(set1) # {'g', 'h', 'z', 'a', 'x', 'o', 'i', 'n'}
# 不可变函数,只有一个copy函数可用
# name = 'baoan15'
# set1 = frozenset(name)
# # set1.add(111) # 打出函数就直接报错,AttributeError: 'frozenset' object has no attribute 'add'
# set2 = set1.copy()
# print(set1) # frozenset({'a', 'b', '5', 'n', 'o', '1'})
# print(set2) # frozenset({'n', '1', 'b', 'o', '5', 'a'})
# print(type(set1)) # <class 'frozenset'>
# python去重的用法
# list1 = [1,1,2,3,4,4,5,6,6,6,7]
# set1 = set(list1)
# print(set1)
# for i in set1:
# print(i)