#一、列表和列表操作
stus = ["张柏芝","朱一龙","王凯"]   #一维数组
stus2 = [1,2,3,4, ['a','b','c','d']   ] #2维数组
stus3 = [1,2,3,4,['a','b','c','d',['test','dev','pre']]]      #三维数组
list = []  #空列表
list = list()   #空列表
#取值
print(stus3[4][4][1])  #test

#增
msg = '杨紫'
stus = ["张柏芝","朱一龙","王凯"]
stus.append(msg)    #在list的末尾增加一个元素
stus.insert(1,msg)  #从指定位置插入元素,这个1代表下标
#如果指定的下标不存在,那么会把元素插入到最后

#查
msg = '杨紫'
stus = ["张柏芝","朱一龙","王凯"]
print('单个取',stus[0])  #h获取第一个元素
print('最后一个元素',stus[-1]) #-1代表最后一个元素
#查询可以通过for循环遍历
# for 循环遍历字符串
# for 变量 in 可迭代对象
#     循环体
#
stus = ['chengweiliang','chenqi','guoliwen']
for stu in stus:#for循环直接循环一个list,就是取list里面的每一个元素
    print('每次循环取的值',stu)
    username = 'szz-'+stu
    print(username)

#改
stus = ["张柏芝","朱一龙","王凯"]
stus[4] = 'baby' #修改指定位置的值
print('改之后的',stus)
#

#删
stus = ["张柏芝","朱一龙","王凯"]
stus.remove('王凯')   #删除指定的值,如果list里面有多个一样的元素,那么就只会删掉一个
del stus[0] #删除指定位置的值
stus.pop()  #不传入下标的话,删除最后一个值
stus.pop(2) #传入下标删除指定位置的值
stus.clear()    #python3清空列表

#其他常用方法
stus = ["张柏芝","朱一龙","王凯"]
print(stus.count('王凯')) #某个元素在list里面的数量
new_stus = stus.copy()#复制一个
print(new_stus)
stus.reverse()  #反转数组,会改变原数组的值
nums = [9,23,12,234,23,5235,235,235,23523,523]
print(stus.sort())  #排序,从小到大排序,根据ASCII来排序
print(stus.sort(reverse=True)#排序,从大到小排序
stus.extend(nums)  #扩展列表,也就是把nums的值加到stus里面
print(stus.index('王凯')) #找某个元素的下标

#range
range() 可迭代对象
range(参数) [0, 参数)
range(参数1,参数2) [参数1, 参数2)
range(参数1,参数2,step) [参数1,参数2) 每隔step取一个
#
# # 重点
for i in range(len(lst)):
         i 索引
         lst[i] 元素
  print(i, lst[i])

stus = ['zhangbaizhi','zhiyilong','wangkai']
for i in range(len(stus)):  #b
    username = stus[i]
    print(username)

l = list(range(3))
print(l)    #[0, 1, 2]

stus = ['zhangbaizhi','zhiyilong','wangkai']
username=''
#sql='insert into user (username,password) value ("%s","%s");'%(username,password)
password='123456'
index = 0
while index<len(stus):
    username = stus[index]
    username = 'szz-'+username
    sql='insert into user (username,password) value ("%s","%s");'%(username,password)
    print(sql)
    index+=1

#切片
names = ['andashu', 'cc', 'niuniu', 'amy', 'lily']
print(names[1:4])  #取下标1至下标4之间的值,包括1,不包括4,顾头不顾尾,['cc', 'niuniu', 'amy']
print(names[1:-1])  # 取下标1至末尾,不包括-1(末尾)['cc', 'niuniu', 'amy']
print(names[0:3])  # 从0取到3,不包括3,['andashu', 'cc', 'niuniu']
print(names[:3])  # 取下标0至3的值,不包括3,和上一条效果一样,0可以省略不写,['andashu', 'cc', 'niuniu']
print(names[2:])  # 取从第二个下标开始的后面所有元素,['niuniu', 'amy', 'lily']
# # 下面是加步长的
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(nums[::2])  # 这个代表取所有的元素,然后每个2个元素取一个,# 执行结果>>> 1,3,5,7,9
print(nums[1:8:3])  # 代表取第二个元素开始,到第8个元素,隔3个取一次,执行结果2,5,8
print(nums[5:1:-1]) #倒序取,[6,5,4,3]

#二、字典
#字典以key:value形式存储,{}表示,是无序的
stu_info = \
    {
    'username':'qx',
    'password':'123456',
    'money':20,
    'addr':'上海'
    }

#字典的key是唯一的。相同key会覆盖前面的
#字典的增删改查
d1 = {} #创建空字典
d2 = dict() #创建空字典
# #增:
d1['name'] = '胖妞'#没有就新增,有就修改
d1['age'] = 18
d1.setdefault('class','双子座')
print('之前的',d1) #之前的 {'name': '胖妞', 'age': 18, 'class': '双子座'}

d1.setdefault('age',30) #如果使用setdefault,key已经存在了,就不会修改原来key的值
print('之后的',d1) #不会修改age的值 之后的 {'name': '胖妞', 'age': 18, 'class': '双子座'}
d1['name'] = '胖妞2'  #没有就新增,有就修改
print('之后的2',d1)    #{'name': '胖妞2', 'age': 18, 'class': '双子座'}

#改:
d1['name'] = '胖妞3'

#删除:
d1.pop('name')#标准的删除方法,若key不存在报错
del d1['name']#使用del方法删除,若key不存在报错
d1.popitem() #随机删除一个值
d1.clear()    #清空

#查询:
id.get('name')#获取name的信息,这种方式如果key不存在的话,会返回None
id['name']#获取name的信息,这种方式如果key不存在的话,会报错
'name' in id #判断name是否在这个字典中,返回True或者False

#内置方法:
dic = {'stu1':'cc','stu2':'andashu','stu3':'niuniu'}
print(dic.values())#打印所有value,执行结果['andashu', 'niuniu', 'cc']
print(dic.keys())#打印所有的key,执行结果['stu2', 'stu3', 'stu1']
print(dic.setdefault('stu1','fengluo'))#如果这个key存在的话,那就不动它,不存在的话,添加一个,cc
dic2 = {'stu1':'sriba','stu10':'baidu'}
dic.update(dic2)#更新字典值,将字典dic2加入到字典dic如果key存在的话,就更新,不存在的话就添加
print(dic.items())#字典转换成一个list,拿到所有的键值对,
# 执行结果[('stu2', 'andashu'), ('stu3', 'niuniu'), ('stu1', 'sriba'), ('stu10', 'baidu')]

#循环字典
users = {
    "niuhanyang":'123456sdf',
    "niuhanyang2":'123456sd',
    "niuhanyang3":'123456sdf',
    "niuhanyang4":'1234sdf56',
    "niuhanyang5":'12345gsdfs6',
    "niuhanyang6":'1234324g56'
}
#把字典里面每个用户的密码,前面都加上 username_ +
#1、循环这个字典
#2、把value修改成value = key_+value
for k in users: #直接循环一个字典的话,循环的是key
    value = users[k]    #通过key取到value
    users[k] = '%s_%s'%(k,value)
print(users)

for k,v in users.items():
    print('%s===>%s'%(k,v))
    users[k] = '%s_%s' % (k,v)
    print(users[k])

stus = [
    {"name":"小白","age":18,'addr':"北京"},
    {"name":"小黑","age":28,'addr':"上海"},
    {"name":"小hong","age":28,'addr':"上海"},
    {"name":"小zi","age":28,'addr':"上海"},
    {"name":"小lv","age":28,'addr':"上海"},
    {"name":"小5","age":28,'addr':"上海"}
    ]

for stu in stus:
    stu['phone'] = '159111111'
print(stus)

stus = {
    "胖妞":
        {
            "house": ['三环', "四环", "七环"],
            "car": {
                "日本": ["雷克萨斯", "英菲尼迪"],
                "中国": ['五菱宏光', '红旗', '比亚迪', "宝骏"],
                "美国": ["福特", "凯迪拉克"]
            },
            "化妆品": {
                "SK-2": 1000,
                "YSL": 8000
            }
        },
    "陆明":{
        "money":[1000,5000,8000,800000],
        "xifu":{
            "越南":2,
            "伊拉克":10,
            "韩国":2,
            "泰国":3
        }

    }
}
#1、统计胖妞总共有多好辆车
cars = stus["胖妞"]["car"]
# print (cars)
carcount = 0
for car in cars.values():
    # print(car)
    # print(len(car))
    carcount += len(car)
print("胖妞共有%s辆车!" %carcount)
# #2、胖妞又买了,德国车2辆,奥迪、奔驰
stus["胖妞"]["car"].update({"德国":["奥迪",'奔驰']})
print(stus)
# #3、胖妞的化妆品全被男朋友扔了
stus["胖妞"].pop("化妆品")
print(stus)

#三、元组
#元组与列表不同的是,元组的值不能改变,可以查询,迭代for循环
mysql_coon = ('192.168.1.109','root','123456',3306,'my_db')#定义元组,定义好后不可修改,修改会报错
# #元组只有两个方法index和count
print(mysql_coon[0])
print(mysql_coon.count('root'))
print(mysql_coon.index("root"))
# #元组只有一个元素时,要加","
tu = (1,)

#四、字符串和字符串操作
str = '  ca th y  '
#字符串去除空格方法
print(str.strip())  #默认去掉两边的空格和换行
print(str.lstrip()) #默认去掉左边的空格和换行
print(str.rstrip()) #默认去掉右边的空格和换行
#去除字符串全部空格
#1、使用replace
# replace主要用于字符串的替换replace(old, new, count)
print(str.replace(' ',''))
#2、使用join+split
# join为字符字符串合成传入一个字符串列表,split用于字符串分割可以按规则进行分割
str = ''.join(str.split())
# str.split()   #字符串按空格分割成列表
''.join(str.split())    #使用一个空字符串合成列表内容生成新的字符串
print(str)
#3、使用正则表达式
import re
str = re.sub(r"\s+","",str,flags=re.UNICODE)
print(str)

print(str.index('d'))   #查找字符串的索引,找不到报错
print(str.find('d'))    #查找字符串的索引,找不到返回-1

str = 'cathy'
print(str.capitalize()) #首字母大写
print(str.lower())#全部变成小写
print(str.upper())#全部变成大写
print(str.replace('c','C',1))#替换字符串

print('abc.jpg'.endswith('.jpg'))#判断是否以XX结尾,返回True,False
print('abc'.startswith('c'))    #判断是否以XX开头,返回True,False

print("欢迎登陆".center(100,'*')) #把欢迎登陆放中间,前后补*达到100个字符
print(str.zfill(40))  #指定长度的字符串,原字符串右对齐,前面填充0
print(str.expandtabs(30))#补当前字符串中\t的次数

username = 'cathy'
today = '2019-04-02'
str2 = '欢迎{}登陆,今天的日期是{}.'
print(str2.format(username,today))#格式字符串

str3 = '欢迎{username}登陆,今天的日期是{today}.'
print(str3.format(username = 'cathy',today = '20190403'))
print(str3.format_map({'username':'cathy','today':'20190403'})) #格式字符串字典类型

print(' '.isspace())    #判断是否为空格

print('123abc'.isalnum())#是否包含数字和字母,没有%%##@特殊字符串就返回true
print('abc'.isalpha())#是否是英文字母,不是数字、不是特殊符号就返回true
print('122'.isdigit())#是否是数字
print('aa'.isidentifier())#是否是一个合法的变量名
print('aa'.islower())#是否是小写字母
print('AA'.isupper())#是否是大写字母
print('Loadrunner Book'.istitle())#是不是一个标题,判断首字符是否是大写
print('+'.join(['hehe','haha','ee']))#拼接字符串,hehe+haha+ee


###maketrans() 方法用于给 translate() 方法创建字符映射转换表
##python3.4以后不需要从外部string模块来调用maketrans()方法,用内建函数bytearray.maketrans()、bytes.maketrans()、str.maketrans()。
##python3中:
##p = str.maketrans('abcdefg','1234567')#前面的字符串和后面的字符串做映射
##第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串,表示转换的目标。两个字符串的长度必须相同,为一一对应的关系
##print('cc ae gg'.translate(p))##输出按照上面maketrans做映射后的字符串

##python2中:
import string
p = string.maketrans('abcdefg','1234567')
print('cc ae gg'.translate(p))#结果为33 15 77

print('mysql is is db'.rfind('is'))#返回最右边字符的下标
print('1+2+3+4'.split('+'))#切割字符串,返回一个list
print('1+2+3\n1+2+3+4'.splitlines())#按照换行符分割
print('Abcdef'.swapcase())#大小写反转

s="""
寂寞当然有一点

你不在我身边

总是特别想念你的脸

距离是一份考卷

测量相爱的誓言

最后会不会实现

我们为爱还在学

学沟通的语言

学着谅解

学着不流泪

等到我们学会飞

飞越黑夜和考验

日子就要从孤单里毕业

我们用多一点点的辛苦

来交换多一点点的幸福

就算幸福

还有一段路

等我们学会忍耐和付出

这爱情一定会有张证书

证明

从此不孤独

从此不孤独

"""

# 字符串是不能被修改的

file_name = input('请上传文件,文件只能是zip压缩包')
if file_name.endswith('.zip'):
    print('没问题')
else:
    print('文件格式错误!')


# 三元运算符
# 三元运算就是在赋值变量的时候,可以直接给它加上判断后,再赋值
# 用法:res = 值1 if 条件 else 值2
a = 5
b = 4
c = a if a>b else b #如果a>b ,c=a,否则c=b,不用三元运算,则如下面的写法

if a > b:
    c = a
else:
    c= b

#三元运算符用于列表和字典
nums = [1,2,3,4,5,6,7,8,9,10]
#old_num = [num for num in nums if num%2!=0]
#循环num,如果nums里面的值,不能被2整除的话,就写到old_num 列表中。等于下面的写法:

old_num = []
for num in nums:
    if num % 2 !=0:
        old_num.append(num)