python学习笔记02: 数据类型
Python中数据类型可以分为 数字型和 非数字型:
- 数字型:整数int、浮点型float、布尔型bool,复数型complex
- 非数字型:字符串类型string、列表list、字典dic、元祖tuple、集合set
所有非数字型变量都支持以下特点:
- 1、都是一个序列,也可以理解为容器
- 2、取值
- 3、遍历
- 4、计算长度、最大/最小值、比较、删除
- 5、链接和重复
- 6、切片
一、字符串类型str
1. 字符串格式化输出
name = '小小兔' time = '2020/04/18' # 方法一:字符串连接(最简单,不推荐使用),用“+”连接,直接把输出的字符串和变量连接起来。 s1 = '欢迎'+name+'登录,今天的时间是'+time # 在内存里面存5个变量(name,time,欢迎,登录今天的时间,s1) print(s1) # 方法二:占位符连接字符串(推荐使用),多个变量后面跟值必须加括号 s2 = '欢迎%s登录,今天的时间是%s' % (name, time) # 在内存里存3个变量(name,time,s2) print(s2) s3 = '欢迎%s登录' % name print(s3) # 占位符有常用的有三种: # %s:字符串,后面跟什么类型都可以 # %d:整数型,后面必须跟整数型,例 %06d 意思不到6位,不够用0补齐 # %f:浮点型,后面必须跟小数型,默认保留6位小数,例 %.2f 保留2位小数 age = 18 score = 98.8888888 s4 = '年龄是%d,分数是%.2f' % (age, score) s5 = '年龄是%s,分数是%s' % (age, score) print(s4) print(s5) # 方法三:使用{}(和%s一样,用{}占位,参数多,容易弄混) s6 = '年龄是{},分数是{}'.format(age, score) print(s6) # 方法四:使用{}和format,适用于参数多,不需要按照顺序来 s7 = '欢迎{name}登录,今天的时间是{time}'.format(time='2020/04/18', name='小小兔') print(s7)
打印结果如下:
- 欢迎小小兔登录,今天的时间是2020/04/18
- 欢迎小小兔登录,今天的时间是2020/04/18
- 欢迎小小兔登录
- 年龄是18,分数是98.89
- 年龄是18,分数是98.8888888
- 年龄是18,分数是98.8888888
- 欢迎小小兔登录,今天的时间是2020/04/18
注意:
参数多,使用占位符不容易一一对应,容易弄错顺序,如果使用{}方式可以不需要按照顺序来,比较直观

2. 字符串常用方法
s = 'hahaha' print(s[1]) # 字符串有下标,根据下标取值 # for i in s: # 字符串可以循环(因为有下标) # print(i) print(s.count('a')) # 找某个元素出现的次数 print(s.find('a')) # 找某个元素的下标 print(s.isdigit()) # 判断是否为纯数字,若是纯数字返回True,否返回False print(s.startswith('h')) # 判断字符串是否以什么开头,若是返回True,否返回False print(s.endswith('com')) # 判断字符串是否以什么结尾,若是返回True,否返回False print(s.lower()) # 字符串全部变成小写, print(s.upper()) # 字符串全部变成大写 s1 = ' hahaha \n' s2 = 'hahaha,' print(s1.strip()) # 默认去掉字符串两边的空格和换行符\n print(s2.strip(',')) # 指定逗号,可以去掉逗号的字符串 print(s.replace('a', '1')) # 替换字符串 print(s.replace('a', '2', 1)) # 指定1,替换第1次出现的 s3 = '123 123' print(s3.replace(' ', '')) # 去掉字符串中间的空格 s4 = 'zyb,cmc,wy,lj,lxy' s5 = 'zyb cmc wy lj lxy' s6 = 'zyb.cmc.sy' print(s4.split(',')) # 指定逗号,按逗号分割字符串,把分割的字符串放到list里['zyb','cmc','wy','l'] print(s5.split()) # 默认以空格进行分割 print(s6.split(',')) # 若分割符号填写错误,把原始字符串直接放到list里面 l1 = ['zyb', 'cmc', 'wy', 'lj', 'lxy'] print(','.join(l1)) # 把list每个元素通过逗号连接起来变成字符串 print(s.index('a')) #找某个元素的第一次出现的下标 print(s.index('a',2)) #指定2,从下标2开始找 # find和index区别:找不存在的元素,index找不到会报错,find找不到会返回-1,不会报错 print(s.islower()) # 判断字符串是否全部小写 print(s.isupper()) # 判断字符串是否全部大写 #001,002,003,004..... s7 = '5' print(s7.zfill(3)) # 补零,传值3,不够3位的补零 print(s.capitalize()) # 首字母大写 s8 = '欢迎光临' print(s8.center(50, '*')) # 输出时居中字符串,长度不够50的用*补齐 s9 = ' ' print(s9.isspace()) # 判断字符串是否为空格,若是空格返回True,否则返回False print(s.isalnum()) # 如果是大小写字母、汉字、数字返回True,其他的字符串都返回False print(s.isalpha()) # 如果是大小写字母、汉字返回True,其他的字符串都返回False s10 = '编号是{name},{age}' print(s10.format(name=1, age=2)) # 字符串格式化,直接传值 print(s10.format_map({'name': 1, 'age': 35})) # 字符串格式化使用,必须传字典 print(s1.lstrip()) # 只去掉前面的空格 print(s1.rstrip()) # 只去掉后面的空格
打印结果如下:
- a
- 3
- 1
- False
- True
- False
- hahaha
- HAHAHA
- hahaha
- hahaha
- h1h1h1
- h2haha
- 123123
- ['zyb', 'cmc', 'wy', 'lj', 'lxy']
- ['zyb', 'cmc', 'wy', 'lj', 'lxy']
- ['zyb.cmc.sy']
- zyb,cmc,wy,lj,lxy
- 1
- 3
- True
- False
- 005
- Hahaha
- ***********************欢迎光临***********************
- True
- True
- True
- 编号是1,2
- 编号是1,35
- hahaha
- hahaha
二、列表list
- 专门用来 存储一串信息
- 列表用 [] 定义,数据之间用 , 分隔
- 列表的索引从 0 开始
- 获取列表的长度 n+1
注意:从列表中取值时,如果 超出索引范围,程序会报错
1. 列表常用方法
s = '王一,王二,王三,王四' # 定义字符串,字符串有下标,但无法取其中的某个值 l2 = ['王一', '王二', '王三', '王四'] # 定义列表,根据索引可以从中取某个值,下标从0开始计数 # 索引/下标0 1 2 3 l3 = [] #定义空列表 #增 l2.append('小小兔') # append增加到最后 print(l2) l2.insert(1, '小小月') # insert增加指定位置,1代表下标 print(l2) #删 l2.pop(1) # 不传下标默认删除最后一个值,传入下标删除指定位置 print(l2) del l2[2] # 删除指定位置的值 print(l2) l2.remove('王一') # 删除指定的值(删除不存在元素会报错) print(l2) l2.clear() # 清空列表 print(l2) #改 l2[0] = '王一一' # 修改指定位置的值 print(l2) #查 print(l2[0]) # 获取指定元素,[-1]代表最后一个元素 l4 = [1, 54, 77, 2, 3, 54, 4] #其他方法 print(l4.count(54)) # 某个元素出现的次数 print(l4.index(2)) # 取索引(找不存在的元素,报错) #.sort()先排序再打印,如果打印print(l4.sort()),则输出结果为None l4.sort() # 升序 print(l4) l4.sort(reverse=True) # 降序 print(l4) l5 = l4.copy() # 复制 print(l5) l4.extend(l2) # 扩展列表,把l2的值加到l3里 print(l4) l4.reverse() # 反转数组 print(l4) #二维数组的取值: infos = [ ['小黑', '1111', '北京'], ['小贝', '2222', '上海'], ['小明', '3333', '广州'] ] print(infos[-1][0]) list1 = [1, 2, 3, 4] # 一个普通的数组 list2 = ['marry', 'lily', [50, 'monkey']] # 二维数组 list3 = ['name', 'sex', ['lily', 124, ['aaa', 'bb']]] # 三维数组 l = [ [[1,2,3],['abc','456']], 'xiaohei', {'name':'xiaobai'} ] print(l[2]['name'])
打印结果如下:
- ['王一', '王二', '王三', '王四', '小小兔']
- ['王一', '小小月', '王二', '王三', '王四']
- ['王一', '王三', '王四']
- ['王一', '王二', '王四']
- ['王二', '王三', '王四']
- []
- ['王一一', '王二', '王三', '王四']
- 王一
- 2
- 3
- [1, 2, 3, 4, 54, 54, 77]
- [77, 54, 54, 4, 3, 2, 1]
- [77, 54, 54, 4, 3, 2, 1]
- [77, 54, 54, 4, 3, 2, 1, '王一', '王二', '王三', '王四']
- [4, 54, 3, 2, 77, 54, 1]
- 小明
- xiaobai
2. 切片
- 切片是list取值的一种方式,可以范围取值(取多个元素),可以理解为,从第几个元素开始,到第几个元素结束。
- 切片是不包含后面那个元素的值的(顾头不顾尾)。
- 切片后面还有可以写一个参数,叫做步长,也就是隔多少个元素,取一次,默认可以不写,也就是隔一个取一次。
- 切片操作也可以对字符串使用,和列表的用法一样。
l = [1,2,3,4,5,6,7,8,9,10] print(l[0:5]) # 切片:顾头不顾尾 print(l[:5]) # 冒号前面省略,默认是0 print(l[5:]) # 冒号后面省略,默认取到尾 print(l[:]) # 两边都不写,默认取所有 print(l[1:5:2]) # 从第2个元素开始,到第5个结束,隔一个取一个 print(l[::2]) # 从头到尾,隔一个取一个 print(l[::-1]) # 若步长为负数,就是从后往前取值 print(l[-1:-11:-1]) # 若步长为负数,前面指定范围用的下标也得写负数 t = ('a', 'b', 'c') print(t[1:3]) # 元祖可以通过下标方式取值 s = 'abcdefg' print(s[1:3]) # 字符串也可以通过下标方式取值
打印结果如下:
- [1, 2, 3, 4, 5]
- [1, 2, 3, 4, 5]
- [6, 7, 8, 9, 10]
- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
- [2, 4]
- [1, 3, 5, 7, 9]
- [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
- [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
- ('b', 'c')
- bc
列表小练习
# 欢迎xxx登录,今天的时间是xxx。登录错误次数过多,最多登录3次 # 分析 # 1、循环3次 # 2、输入账号,判断账号是否存在(in 或 count) # 3、根据账号取到下标,然后根据账号的下标取到对应的密码(index) # 4、输入密码,判断密码是否正确 # 5、若账号和密码正确,登录成功,立即结束循环(break) import datetime today = datetime.datetime.today() usernames = ['小黑', '小贝', '小白'] passwords = ['123456', '1111', '1'] for i in range(3): username = input('输入username:') if usernames.count(username) > 0: index = usernames.index(username) password = passwords[index] pwd = input('输入password:') if password == pwd: print('欢迎【%s】登录,今天的时间是%s' % (username, today)) break else: print('密码错误') else: print('账号不存在') else: print('登录错误次数超过3次')
三、字典dic
字典具有极快的查找速度;字典是一种key-value的数据类型,比如说要存每个人的信息,那么每个人的编号就是key,value就是每个人的信息,这样的话,一个字典就能存所有人的信息了。字典的定义使用{},每个值用“,”隔开,key和value使用“:”分隔。字典是无序的,因为它没有下标,用key来当索引,所以是无序的。字典的key必须是唯一的,因为它是通过key来进行索引的,所以key不能重复。
stu_info = { 'name': '小黑', 'phone': '1111', 'addr': '北京' } # 增 stu_info['age'] = 18 # 新增 dic[key]=value stu_info.setdefault('qq', '1234567') # 新增 dic.setdefault(key,value) print(stu_info) # []和setdefault的区别:key存在,[]会替换values,setdefault不做修改。key不存在的时候没区别。 # 删 stu_info.pop('phone') # 删除(不存在的key,报错) dic.pop(key) del stu_info['name'] # 删除 del dic[key] print(stu_info) # 改 stu_info['name'] = '小强' # 修改(key存在,就是修改;key不存在,就是新增) dic[key]=value print(stu_info) # 查 print(stu_info.get('name')) # 查询(key不存的时候,get取值none) dic.get(key) print(stu_info.get('qq', '不存在')) # get不到值,默认值返回值 print(stu_info['phone']) # 查询(key不存的时候,[]报错) # 其他方法 new_stu_info = stu_info.copy() # 复制 stu_info.clear() # 清空字典 print(stu_info.keys()) # 打印字典所有的key print(stu_info.values()) # 打印字典所有的values print(stu_info.items()) # 字典转换成list stu_info.update(qq='890344') # 更新字典值,key存在就更新,key不存在就添加 print(stu_info)
打印结果如下:
- {'name': '小黑', 'phone': '1111', 'addr': '北京', 'age': 18, 'qq': '1234567'}
- { 'addr': '北京'}
- {'name': '小强', 'phone': '1111', 'addr': '北京'}
- 小黑
- 不存在
- 1111
- dict_keys(['name', 'phone', 'addr'])
- dict_values(['小黑', '1111', '北京'])
- dict_items([('name', '小黑'), ('phone', '1111'), ('addr', '北京')])
- {'name': '小黑', 'phone': '1111', 'addr': '北京', 'qq': '890344'}
四、元祖tuple
t = (1, 2, 2, 3, 2) # 元祖是数组的一种,与list的区别:一旦创建,不能修改,没有增删改 print(t[0]) # 元祖可以取值 print(t[-1]) l = ('ip',3306,'user','password') # 如连接数据库,不可以修改,就可以定义成元祖 for i in t: # 元祖可以循环 print(i) # 其他方法: print(t.index(3)) # 找某个元素的下标 print(t.count(2)) # 找某个元素出现的次数 t1 = (2) print(type(t1)) t2 = ('zss') print(type(t2)) t3 = ('ss',) # 如果元祖只有一个元素,后面加个逗号,才会认为是元祖 print(type(t3))
打印结果如下:
1
2
1
2
2
3
2
3
3
<class 'int'>
<class 'str'>
<class 'tuple'>
五、集合set
s = {1, 2, 3, 4, 5, 5, 6, 7}#定义集合
print(s) # 1.集合天生去重;2.集合是无序的
s2 = set() # 空集合
s3 = {} # 空字典
for i in s: # 集合可以循环
print(i)
l = [1, 2, 3, 4, 5, 5, 6, 7]
l = list(set(l)) # list去重:list先转成set去重后在转成list
print(l)
s.add(8) # 添加元素
print(s)
s.update({9, 5, 6}) # 把另外一个集合加到这个集合里面
print(s)
s.remove(4) # 删除指定元素
print(s)
#关系测试(交际,并集,差集,对称差集)
l1 = [1, 2, 3, 4]
l2 = [2, 3, 4, 5]
l1 = set(l1)
l2 = set(l2)
# 取交集:就是两个集合里面相同的元素
print(l1 & l2) # 取交集
print(l1.intersection(l2)) # 取交集
# 取并集:就是把两个集合合并到一起
print(l1 | l2) # 取并集
print(l1.union(l2)) # 取并集
# 取差集:在a集合里面存在,在b集合里面不存在的
print(l1 - l2) # 取差集
print(l1.difference(l2)) # 取差集
# 取对称差集:把a集合和b集合里面相同的元素去掉,剩下的
print(l1 ^ l2) # 取对称差集
print(l1.symmetric_difference(l2)) # 取对称差集
l3 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
l4 = {2, 3, 4, 5}
print(l3.issuperset(l4)) # 判断a集合是不是b集合的父集
print(l4.issubset(l3)) # 判断a集合是不是b集合的子集
六、布尔类型bool
对于布尔值,只有两种结果即True和False
七、练习
# 1、注册 # usernames=['小黑','小贝','小白'] # passwords=['123456','1111','1'] # 需要把上面的2个list先转成字典;最多输入3次机会,输入账号(校验账号是否存在,若存在,不能注册;校验是否为空,空格也算空,为空也算一次错误);输入密码和确认密码(校验两次密码是否一致,若一致,加到字典中,注册成功;校验输入是否为空)。 # 分析: # 1)两个list转成字典,需要循环,username是key,password是value # 2)循环3次,输入账号,校验是否为空,若不为空,继续 # 3)判断账号是否在字典里面,若不在,继续 # 4)输入密码和确认密码,校验是否为空,若不为空,继续 # 5)判断两次输入密码是否一致,若一致,注册成功 # 6)账号和密码加入到字典里面 usernames = ['小黑', '小贝', '小白'] passwords = ['123', '111', '222'] d = {} for i in range(len(usernames)): # 列表转换成字典 u = usernames[i] p = passwords[i] d[u] = p print(d) for i in range(3): user_name = input('请输入账号:').strip() # 去掉空格 if user_name in d: print('用户名已存在') elif user_name == '': print('用户名不能为空') else: pwd1 = input('请输入密码:').strip() pwd2 = input('再次确认密码:').strip() if pwd1 == '' or pwd2 == '': # 校验不为空 print('密码不能为空') elif pwd1 != pwd2: print('两次输入密码不一致,请重新输入') else: d[user_name] = pwd1 print('恭喜{name}注册成功'.format(name=user_name)) break else: print('3次机会已用完') print(d) # 2、登录: # usernames=['小黑','小贝','小白'] # passwords=['123456','1111','1'] # 最多输入3次机会,输入账号(校验账号是否存在,从字典里面判断,若不存在,不能登录)和密码(账号和密码一致才能登录) # 分析: # 1)两个list转成字典,需要循环,username是key,password是value # 2)循环3次,输入账号,判断是否为空,若不为空,继续 # 3)判断账号是否存在字典里面,若存在,继续 not in # 4)输入密码,判断密码是否为空,若不为空,继续 # 5)根据账号从字典里面获取密码,和用户输入的密码作比较,如果一致登录成功 usernames = ['小黑', '小贝', '小白'] passwords = ['123', '111', '222'] d = {} for i in range(len(usernames)): # 列表转换成字典 u = usernames[i] p = passwords[i] d[u] = p print(d) for i in range(3): user_name = input('请输入账号:').strip() # 去掉空格 if user_name == '': print('账号不能为空') elif user_name not in d: print('账号不存在') else: pwd1 = input('请输入密码:').strip() if pwd1 == '': # 校验不为空 print('密码不能为空') elif pwd1 != d.get(user_name): print('密码输入错误') else: print('恭喜{name}登录成功'.format(name=user_name)) break else: print('3次机会已用完')

浙公网安备 33010602011771号