1.Python数据类型
1.1 list/数组/列表
1.1.1 定义空list的两种方法:
-
goods=[]
-
goods=list()
1.1.2 在list中增加元素,append、insert
- goods.append('奶茶') #在list末尾增加一个元素
- goods.insert(0,'火锅') #在指定位置增加元素
- goods.insert(1,'串串') #在指定位置增加元素goods.insert(20,'蛋糕') #如果指定的下标不存在,则增加到末尾
1.1.3 修改list中的元素
- goods[i]='' #i为要修改元素的下标
1.1.4 删除list中元素,pop,del,remove,clear
-
goods.pop() #默认删除最后一个元素
- goods.pop(-2) #删除指定位置的元素,需要传入下标
- goods.remove('汉堡') #删除指定元素,传入元素值
- del goods[-1] #删除指定位置的元素
- goods.clear() #清空list
1.1.5 查询
- result=goods.count('奶茶') #查询某个元素在list中出现的次数
- index=goods.index('奶茶') #查询元素在list中的下标,如果list里这个元素存在多次,返回第一次出现的下标
1.1.6 其他常用方法
- goods.reverse() #反转
- nums.sort() #升序排序
- nums.sort(reverse=True) #降序排序
- nums.extend(goods) #把一个list里面元素添加到另一个list里
1.1.7 遍历一个list
- for s in stus: #获取到的s是list中的每一个元素
- for i in range(len(stus)): #i是list的下标,len(l)表示获取list的长度
- for index,stu in enumerate(stus): #index是下标,stu是元素
- for index,stu in enumerate(stus,1): #从1开始显示下标
1.1.8 数组切片
切片,list取值的一种方式,指定范围取值,顾头不顾尾
- stu[2:6] #截取stu[2]到stu[5]
- stu0[:6] #如果前面的下标没写,代表从第一个元素开始取
- stu0[2:] #如果后面的下标没写,代表取到最后一个元素
- new_stu=stu0[:] #复制一个新的list
- stu0[::2] #步长为2
- stu0[::] #步长默认为1,stu0[::]等同于stu0
- stu0[::-3]#步长为负数时从右往左取值
下标、索引、切片同样适用于字符串
字符串可以用下标取值,但不能修改
1.2 dic/字典
1.2.1定义一个空字典
- stu_info={}
1.2.2 向字典中增加/增加元素
- stu_info['key']='value' #若key-‘phone’已经存在,则会修改它对应的value
- stu_info.setdefault('key','value') #key已经存在时不会做出修改
1.2.3 获取字典中的元素
- print(stu_info['key']) #key不存在时会报错
- print(stu_info.get('key')) #key不存在时不会报错,返回None
- print(stu_info.get('key',500)) #key不存在时返回指定的默认值
1.2.4 删除字典中的元素
- stu_info.pop('key') #删除指定元素
- del stu_info['key'] #删除指定元素
- stu_info.popitem() #从字典中随机删除一个元素
-
stu_info.clear() #清空字典
1.2.5 其他常用方法
- d1.update(d2) #用字典d2更新字典d1
- stu_info.keys() #获取字典的key
- print(stu_info.values()) #获取字典的value
- 'name' in stu_info #判断key是否在字典中,这种方法效率更高
- 'name' in stu_info.keys() #判断key是否在字典中,这种方法效率较低
1.2.6 遍历一个字典
两种循环方式,第一种效率更高
- for k in stu_info #k为字典的key,value用stu_info[k]来获取
- for k,v in stu_info.items() #k,v分别为字典的key和value
2 字符串常用方法
- new_s=s.strip() #默认去掉字符串两边的空格和换行符
- new_s1=s1.strip('.') #去掉两边的指定的字符串
- print(s.rstrip())
- print(s.lstrip())
- print(s1.count('.')) #获取某个字符串出现的次数
- print(s.index('a')) #找某个字符串的下标
- print(s.find('a')) #找某个字符串的下标,不存在的时候find方法返回-1,不会报错,index会报错
- print(s.replace('abc','ABC',1)) #替换字符串,数字代表替换第几个
- print(s.upper()) #变成大写字母
- print(s.lower()) #变成小写字母
- print(s.capitalize()) #首字母大写
- print(s.startswith('p')) #判断是否以指定字符串开头
- print(s.endswith('.jpg')) #判断是否以指定字符串结尾
- print(s.islower()) #判断是否都是小写字母
- print(s.isupper()) #判断是否都是大写字母
- print(s.isdigit()) #判断是否为纯数字
- print(s.center(50,'*')) #把字符串放到中间,不够的用指定字符补齐
- print(s.isalpha()) #判断是不是都是字母或者汉字,不能有数字和特殊字符
- print(s.isalnum()) #字符串里只要没有特殊字符就返回True
- print(s.isidentifier()) #是不是一个合法的变量名
- print(s.isspace()) #判断是不是空格
- print(s.zfill(3)) #补0到指定的位数
- print(s.split(',')) #按照某个字符分割
- print(s1.split()) #默认按空格分割
- res=','.join(cars) #以某个字符串把list中的字符串连接起来
字符串格式化的两种方法,format和format_map
s='insert into user VALUE ({username},{password},{addr},{email},{phone})'
news=s.format(addr='北京',phone='12321',password='123456',email='37337@qq.com',username='niuhanyang')
d = {'addr':'北京','username':'xiaohei','password':'12345','email':12,"phone":'sdfs'}
s_map=s.format_map(d)
3 读写文件
3.1读文件
f=open('users.txt',encoding='utf-8') #读文件的时候,必须存在才能读取,如果文件不存在,open()
函数就会抛出一个IOError
的错误
res=f.read()
f.close() #文件使用完毕后必须关闭
# print(f.readline()) #读取一行
# print(f.readlines()) #读取文件里面所有的内容,把每行的内容放到一个list里面print(f.readline()) #读取一行的内容
# for line in f #直接循环文件对象,每次取的就是文件里的每一行 :
3.2写文件
fw=open('users',mode='w') #'w'模式:如果没有这个文件,就创建一个;如果有,那么就会先把原文件的内容清空再写入新的东西
fw.write('niuhanyang,123456
')
fw.close()
3.3追加文件
fa=open('users',mode='a') #‘a’模式:如果没有这个文件,就创建一个;如果有,那么在原文件后面追加新的东西
fa.write('qiaomeiling,123456
')
fa.close()
3.4模式概览
#r模式: 文件不存在时会报错,只能读不能写
#w模式:文件不存在时会新建,只能写不能读,会清空原来的内容
#a模式:文件不存在时会新建,只能写不能读,不会清空原来的内容
#r+模式:文件不存在时会报错,能读能写
#w+模式:文件不存在时会新建,能写能读(读不到内容,因为w先把文件清空了),会清空原来的内容
#a+模式:文件不存在时会新建,能写能读(读不到内容,因为文件指针在末尾),不会清空原来的内容
3.5高效读取文件的两种方法
f=open('users') #文件对象,或者文件句柄 d={} while 1: #第一种,但是要求文件里不能有空行 line= f.readline().strip() if line: user,passwd=line.split(',') d[user]=passwd else: break print(d)
f=open('users') #文件对象,或者文件句柄 #直接循环文件对象,每次取的就是文件里的每一行 for line in f: print(type(line)) print(line) f.close()
4 作业-注册、登陆
4.1 需求
1、写注册的程序:
username:
password:
cpassword:
输入的账号必须是没有注册过的,两次密码必须输入一致,账号、密码的长度要在6 - 10之间,注册完成之后,存到文件里面
2、登录,账号密码是从文件里面取的,如果输入的账号不存在要提示。登录的时候账号不区分大小写
4.2代码
1 import datetime 2 3 def get_logininfo(): #从文件中读取登陆信息,返回一个字典 4 #防止文件不存在的时候报错 5 try: 6 fr = open('users.txt', encoding='utf-8') # 从文件中读取登陆信息,解析到列表users_info中存储 7 users_info = fr.read().split(' ') 8 fr.close() 9 login_info={} 10 # 依次将文件中的name和password解析存储到字典login_info中 11 for item in users_info: 12 if item != '': 13 users = item.split(',') 14 name = users[0] 15 password = users[1] 16 login_info[name] = password 17 return login_info 18 except IOError: 19 return {} 20 21 def write(s): #将传入的字符串追加至文件中 22 fa = open('users.txt', encoding='utf-8', mode='a', ) 23 fa.write(s) 24 fa.close() 25 26 ispass = 0 # 标记是否操作完结 27 while True: 28 if ispass: 29 break # 操作完结则直接退出 30 31 islogin = input("请选择是直接登录还是注册,登录输入1,注册输入0,退出系统输入-1 ") 32 count = 0 33 if islogin == "1": # 登录 34 login_info=get_logininfo() 35 while count < 3: # 控制错误次数 36 count += 1 37 name_input = input("欢迎登录,请输入用户名:") 38 password_input = input("请输入密码:") 39 if name_input.strip() == "" or password_input.strip() == "": 40 print("用户名或密码为空,登录失败") # 判断用户名和密码是否为空 41 elif name_input.upper() in login_info: 42 if password_input == login_info[name_input.upper()]: # 用户名正确时判断对应的密码是否一致 43 ispass = 1 # 登录成功,标记完结 44 print("登录成功") 45 print("欢迎%s,今天的日期是%s" % (name_input,datetime.datetime.today())) 46 break 47 else: 48 print("密码错误,登录失败") 49 continue 50 else: 51 print("用户不存在,登录失败") 52 53 else: 54 print("错误次数达到上限") 55 break 56 57 elif islogin == "0": # 注册 58 while True: 59 login_info = get_logininfo() 60 61 name_input = input("欢迎注册,请输入用户名,长度在6-10之间:") 62 password_input = input("请输入密码,长度在6-10之间:") 63 cpassword_input = input("请确认密码,请与上次输入密码保持一致:") 64 if name_input.strip() == "" or password_input.strip() == "" or cpassword_input.strip() == "": 65 print("用户名或密码为空,请重新输入") # 判断用户名和密码是否输入为空 66 continue 67 elif len(name_input) > 10 or len(name_input) < 6: 68 print('用户名长度不符合要求,请重新输入') 69 continue 70 elif name_input in login_info: 71 print("用户名已存在,请直接登录") 72 break 73 elif len(password_input) > 10 or len(password_input) < 6: 74 print('密码长度不符合要求,请重新输入') 75 continue 76 elif password_input != cpassword_input: 77 print("两次输入的密码不一致,请重新输入") 78 continue 79 else: 80 print("注册成功,请重新选择是否登录") 81 # 将注册结果写入文件 82 s = '%s,%s '%(name_input.upper(),password_input) 83 write(s) 84 break 85 elif islogin == "-1": #退出 86 print("退出系统,再见!") 87 break 88 else: #错误指令 89 print("输出错误,请按照提示选择您需要的操作") 90 continue