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)

打印结果如下:               

  1. 欢迎小小兔登录,今天的时间是2020/04/18
  2. 欢迎小小兔登录,今天的时间是2020/04/18
  3. 欢迎小小兔登录
  4. 年龄是18,分数是98.89
  5. 年龄是18,分数是98.8888888
  6. 年龄是18,分数是98.8888888
  7. 欢迎小小兔登录,今天的时间是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())  # 只去掉后面的空格

打印结果如下:

  1. a
  2. 3
  3. 1
  4. False
  5. True
  6. False
  7. hahaha
  8. HAHAHA
  9. hahaha
  10. hahaha
  11. h1h1h1
  12. h2haha
  13. 123123
  14. ['zyb', 'cmc', 'wy', 'lj', 'lxy']
  15. ['zyb', 'cmc', 'wy', 'lj', 'lxy']
  16. ['zyb.cmc.sy']
  17. zyb,cmc,wy,lj,lxy
  18. 1
  19. 3
  20. True
  21. False
  22. 005
  23. Hahaha
  24. ***********************欢迎光临***********************
  25. True
  26. True
  27. True
  28. 编号是1,2
  29. 编号是1,35
  30. hahaha
       
  31.    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'])

打印结果如下:

  1. ['王一', '王二', '王三', '王四', '小小兔']
  2. ['王一', '小小月', '王二', '王三', '王四']
  3. ['王一', '王三', '王四']
  4. ['王一', '王二', '王四']
  5. ['王二', '王三', '王四']
  6. []
  7. ['王一一', '王二', '王三', '王四']
  8. 王一
  9. 2
  10. 3
  11. [1, 2, 3, 4, 54, 54, 77]
  12. [77, 54, 54, 4, 3, 2, 1]
  13. [77, 54, 54, 4, 3, 2, 1]
  14. [77, 54, 54, 4, 3, 2, 1, '王一', '王二', '王三', '王四']
  15. [4, 54, 3, 2, 77, 54, 1]
  16. 小明
  17. 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. [1, 2, 3, 4, 5]
  2. [1, 2, 3, 4, 5]
  3. [6, 7, 8, 9, 10]
  4. [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  5. [2, 4]
  6. [1, 3, 5, 7, 9]
  7. [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  8. [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  9. ('b', 'c')
  10. 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)

打印结果如下:

  1. {'name': '小黑', 'phone': '1111', 'addr': '北京', 'age': 18, 'qq': '1234567'}
  2. { 'addr': '北京'}
  3. {'name': '小强', 'phone': '1111', 'addr': '北京'}
  4. 小黑
  5. 不存在
  6. 1111
  7. dict_keys(['name', 'phone', 'addr'])
  8. dict_values(['小黑', '1111', '北京'])
  9. dict_items([('name', '小黑'), ('phone', '1111'), ('addr', '北京')])
  10. {'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次机会已用完')

 

posted @ 2020-04-30 00:07  张小歪  阅读(320)  评论(0)    收藏  举报