python进阶之路7 数据类型的内置方法
内容回顾
while 循环补充说明
1.死循环
2.while循环嵌套和全局标志位
for循环
1.for 变量名 in 待遍历数据
for循环体代码
2.for 也可以与break continue连用
range方法
1.range()一个数字,0为起始位,顾头不顾尾
2.range()两个数据,第一个数据是起始位
3.range()三个数据,第三个数是等差值
数据类型的内置方法理论
我们之前所学习的每一种数据类型本身都含有一系列的操作方法内置方法是其中最多的(自带的功能)
在python中数据类型调用内置方法的统一句式为>>>:句点符
'jason'.字符串内置方法
绑定字符串的变量名.字符串内置方法
str.字符串内置方法
ps:数据类型的内置方法比较的多 我们如果想要掌握 不要光靠死记硬背 更多时候靠的是熟能生巧
整型的内置方法与操作
1.类型转换(将其他数据类型转换成整型)
int(其他数据类型)
ps:浮点型可以直接转 字符串必须满足内部是纯数字才可以
2.进制数转换
十进制转其他进制
print(bin(100)) # 0b1100100
print(oct(100)) # 0o144
print(hex(100)) # 0x64
"""
数字的开头如果是0b 则为二进制 0o则为八进制 0x则为十六进制
"""
其他类型转十进制
print(int(0b1100100))
print(int(0o144))
print(int(0x64))
如果是字符串的话,在后面加,跟数字
print(int('0b1100100',2))
print(int('0o144',8))
print(int('0x64',16))
3.python自身对数字的敏感度较低(精确的低)
有一篇文章可以参考一下
https://blog.csdn.net/weixin_32821579/article/details/113496501
python这门语言其实真的一点都不厉害 主要是因为它背后有很多大佬
如果需要精准的计算需要借助于模块numpy....
浮点型内置方法与操作
1.类型转换
float(其他数据类型)
字符串里面可以运行出现一个小数点 其他都必须是纯数字
2.pyhton自身对数字的敏感度较低(精确度低)
python这门语言其实真的一点都不厉害 主要是因为它背后有很多大佬
如果需要精准的计算需要借助于模块numpy....
字符串内置方法与操作
1.类型转换
str(其他数据类型)
ps:可以转人员数据类型(只需要在前后加引号即可)
2.必须要掌握的方法
s1 = 'hello world'
2.1索引取值(起始位置0开始 超出范围直接报错)
print(s1[0]) # h
print(s1[-1]) # d 支持负数 从末尾开始
2.2切片操作
print(s1[1:5]) # 顾头不顾尾 从索引1 一直取到索引4
print(s1[-1:-5]) # 默认的顺序是从左往右 报错
print(s1[-5:-1]) # 默认的顺序是从左往右
2.3 修改切片方向(间隔)
print(s1[1:5:1]) # 默认是1
print(s1[1:5:2]) # 第三个数是等差数的间隔
print(s1[-1:-5:-1]) # 改方向
print(s1[:]) # 不写数字就默认都要
print(s1[2:]) # 从索引2开始往后都要
print(s1[:5]) # 从索引0开始往后要到索引4
print(s1[::2]) # 隔两个要一个
2.4统计字符串中所有的字符
print(len(s1)) # 10
2.5移除字符串首尾指定的字符
username = input('username>>>:').strip()
if username == 'jason':
print('登陆成功')
res = 'jason'
print(len(res))
print(len(res.strip())) # 括号内不写 默认移除首尾的空格
res1 = '$$jason$$'
print(res1.strip('$')) # jason
print(res1.lstrip('$')) # jason$$
print(res1.rstrip('$')) # $$jason
2.6 切割字符串中指定的字符
res = 'jason|123|read'
print(res.split('|')) # ['jason', '123', 'read'] 该方法的处理结果是一个列表
name, pwd,hobby = res.split('|')
print(res.split('|',maxsplit=1)) # ['jason', '123|read'] # 从左往右切指定个数
print(res.rsplit('|',maxsplit=1)) # ['jason|123', 'read']
2.7 字符串格式化输出
format玩法1 等价于占位符
res = 'my name is {} my age is {}'.format('jason',123)
print(res) # my name is jason my age is 123
format玩法2 索引取值并支持反复使用
res = 'my name is {0} my age is {1} {1} {1} {0} {1}'.format('jason',123)
print(res)
format 玩法3 占位符 见名知意
res = 'my name is {name} my age is {age}'.format(name='jason',age=123)
print(res) # my name is jason my age is 123
format 玩法4 推荐使用(*****)
name = input('username>>>:')
age = input('age>>>:')
res = f'my name is {name} my age is{age}'
print(res)
3.字符串需要了解的方法
大小写相关
res = 'hEllO wOLd 666'
print(res.upper()) # HELLO WOLD 666
print(res.lower()) # hello wold 666
'''图片验证码: 生成没有大小写统一的验证码 展示给用户看
获取用户输入的验证码 将用户输入的验证码和当初产生的验证码统一转大写或者小写再比对
'''
code = '8Ja6cC'
print('展示给用户看的图片验证吗',code)
confirm_code = input('请输入验证码').strip()
if confirm_code.upper() == code.upper():
print('验证码正确')
res = 'hello world'
print(res.isupper()) # 判断字符串是否是纯大写 False
print(res.islower()) # 判断字符串是否是纯小写 True
3.2 判断字符串中是否是纯数字
res = '123'
print(res.isdigit()) # True
guess_age = input('guess_age>>>:').strip()
if guess_age.isdigit():
guess_age = int(guess_age)
else:
print('年龄都不知道怎么输吗?')
3.3替换字符串中指定的内容
res = 'my name is jason jason jason jason jason'
print(res.replace('jason','tony')) # my name is tony tony tony tony tony
print(res.replace('jason','tony',1)) # my name is tony jason jason jason jason
3.4 字符串的拼接
ss1 = 'hello'
ss2 = 'world'
print(ss1+ss2) # helloworld
print(ss1*10) # hellohellohellohellohellohellohellohellohellohello
print('|'.join(['jason', '123', 'read', 'jdb'])) # jason|123|read|jdb
print('|'.join(['jason', 123])) # 报错 参与拼接的必须都是字符串
3.5 统计指定字符出现的次数
res = 'hello world'
print(res.count('l')) # 3
3.6判断字符串的开头或者结尾
res = 'jason say hello'
print(res.startswith('jason'))
print(res.startswith('j'))
print(res.startswith('jas'))
print(res.startswith('a')) # 报错
print(res.startswith('son')) # 报错
print(res.startswith('say')) # 报错
print(res.endswith('o'))
print(res.endswith('llo'))
print(res.endswith('hello'))
3.7 其他方法补充
res = 'hello world'
print(res.title()) # 每个字母首字母大写
print(res.capitalize()) # 整段首字母大写
print(res.swapcase()) # 把大小写反转
print(res.index('o')) # 只 找第一个
print(res.find('o'))
print(res.index('c')) # 找不到报错
print(res.find('c')) # 找不到 默认返回-1
print(res.find('lo')) # 找一块也可以
列表内置方法及操作
1.类型转换
list(其他数据类型)
ps:能够被for循环的数据类型都可以转成列表
print(list('hello'))
print(list({'name':'jason', 'pwd':123}))
print(list((1, 2, 3, 4)))
print(list({1, 2, 3, 4, 5}))
2.需要掌握的方法
l1 = [1111, 222, 333, 444, 555, 666, 777, 888]
2.1索引取值(正负数)
print(l1[0])
print(l1[-1])
2.2 切片操作 与字符串讲解操作一致
print(l1[0:5])
print(l1[:])
2.3 间隔数 方向 与字符串讲解操作一致
print(l1[::-1])
2.4 统计列表中数据值的个数
print(len(l1))
l1[0] = 123
print(l1)
2.6 列表添加数据值
方式1: 尾部追加数据值
l1.append('干饭')
print(l1) # [1111, 222, 333, 444, 555, 666, 777, 888, '干饭']
l1.append(['jason', 'kevin', 'jerry'])
print(l1) # [1111, 222, 333, 444, 555, 666, 777, 888, ['jason', 'kevin', 'jerry']]
方式2: 任意位置插入数据值
l1.insert(0,'jason')
print(l1) # ['jason', 1111, 222, 333, 444, 555, 666, 777, 888]
l1.insert(0,[11,22,333,44,])
print(l1) # [[11, 22, 333, 44], 1111, 222, 333, 444, 555, 666, 777, 888]
方式3: 扩展列表 合并列表
ll1 = [11,22,33]
ll2 = [44,55,66]
print(ll1+ll2) # [11, 22, 33, 44, 55, 66]
ll1.extend(ll2) # 相当于for+append
print(ll1) # [11, 22, 33, 44, 55, 66]
2.7 删除列表数据
方式1:统用的删除关键子del
del l1[0]
print(l1)
方式2:内置方法 remove
l1.remove(444)
print(l1)
方式3:pop 弹出元素
l1.pop(3) # 括号内填写索引值
print(l1)
l1.pop() # 默认尾部弹出数据值
print(l1)
res = l1.pop(3)
print(l1) # 444
res1 = l1.remove(444)
print(res1) # None
2.8 排序
ss = [33, 55, 77, 8, 8, 99, 00, 44, 5, 666]
ss.sort()
print(ss) # 默认升序 [0, 5, 8, 8, 33, 44, 55, 77, 99, 666]
ss.sort(reverse=True)
print(ss) # 改为降序
2.9 统计列表中某个数据值出现的次数
print(l1.count(222))
2.10 颠倒列表顺序
l1.reverse()
print(l1)
字典相关操作
1.类型转换
dict()
字典的转换一般不使用关键字 而是自己动手转
2.字典必须要掌握的操作
print(dict([('name','pwd'),('jason',123)])) # {'name': 'pwd', 'jason': 123}
user_dict = {
'username': 'jason',
'password': 123,
'hobby':['read','music','run']
}
1.按k取值
print(user_dict['username']) # 'jason
print(user_dict['phone']) # k不存在会直接报错
2.按内置方法get取值(推荐使用)
print(user_dict.get('username')) # jason
print(user_dict.get('age')) # None
print(user_dict.get('username','没有呦 嘿嘿嘿')) # jason 键存在的情况下获取对应的值
print(user_dict.get('age','没有呦 嘿嘿嘿')) # 没有呦 嘿嘿嘿 键不存在的情况下第二个值
3.修改值数据
user_dict['username'] = 'tony'
print(user_dict) # {'username': 'tony', 'password': 123, 'hobby': ['read', 'music', 'run']}
print(id(user_dict))
print(user_dict)
4.新增键值对
user_dict['age'] = 18 # 键不存在则新增键值对
print(user_dict)
5.删除数据
del user_dict['username']
print(user_dict) # {'password': 123, 'hobby': ['read', 'music', 'run']}
res = user_dict.pop('password')
print(user_dict) # {'username': 'jason', 'hobby': ['read', 'music', 'run']}
print(res) # 123
6.统计字典中键值对的个数
print(len(user_dict)) # 3
7.字典三剑客
print(user_dict.keys()) # 一次性获取字典所有的键 dict_keys(['username', 'password', 'hobby'])
print(user_dict.values()) # 一次性获取字典所有的值 dict_values(['jason', 123, ['read', 'music', 'run']])
print(user_dict.items()) # 一次性获取字典的键值对数据 # dict_items([('username', 'jason'), ('password', 123), ('hobby', ['read', 'music', 'run'])])
for k,v in user_dict.items():
print(k,v)
username jason
password 123
hobby ['read', 'music', 'run']
8.补充说明
print(dict.fromkeys(['name', 'pwd', 'hobby'], 123)) # 快速生成值相同的字典
res = dict.fromkeys(['name', 'pwd', 'hobby'], [])
print(res) # {'name': [], 'pwd': [], 'hobby': []}
res['name'].append('jason')
res['pwd'].append(123)
res['hobby'].append('study')
print(res) # {'name': ['jason', 123, 'study'], 'pwd': ['jason', 123, 'study'], 'hobby': ['jason', 123, 'study']}
'''
当第二个公共值是可变类型 的时候一定要注意 通过任何一个键修改都会影响所有
'''
user_dict.setdefault('username','tony')
print(user_dict) # 键存在则不修改 结果是键对应的值
res = user_dict.setdefault('age',123)
print(user_dict,res) # 键不存在则新增键值对结果是新增的值
user_dict.popitem() # 弹出键值对 后进先出
print(user_dict)
元组相关操作
1.类型转换
tuple()
ps:支持for循环的数据类型都可以转成元组
2.元组必须掌握的方法
t1 = (11,22,33,44,55,66)
1.索引取值
2.切片操作
3.间隔 、方向
4.统计元组内数据值的个数
print(len(t1)) # 6
5.统计元组内某个数据值出现的次数
print(t1.count(11))
6.统计元组内指定数据值的索引值
print(t1.index(22))
7元组内如果只有一个数据值那么逗号不能少
8.元组内索引绑定的内存地址不能被修改(部分区分 可变与不可变)
9.元组不能新增或删除数据
集合相关操作
1.类型转换
set()
集合内数据必须是不可变类型(整型 浮点型 字符串 元组)
集合内数据也是无序的 没有索引的概念
2.集合需要掌握的方法
去重
关系运算
ps:只有遇到上述两种需求的时候才应该考虑使用集合
3.去重
s1 = {11,22,33,4,4,55,5,566,7,44,4,4,44,4,4,}
print(s1)
l1 = [11,22,33,22,33,22,11,11,22,33,22,22,11,11]
s1 =set(l1)
l1 = list(s1)
print(l1)
4.关系运算
群体之间做差异化校验
eg:两个微信账户之间 有不同的好友 有相同的好友
f1 = {'jason','tony', 'jerry', 'oscar'} # 用户1的好友列表
f2 = {'jack', 'jason','tom','tony'} # 用户2的 好友列表
1.求两个人的共同好友
print(f1 & f2) # {'jason', 'tony'}
2.求用户1 独有的好友
print(f1 - f2) # {'oscar', 'jerry'}
3.求两个人所有的好友
print(f1 | f2) # {'tony', 'oscar', 'tom', 'jerry', 'jason', 'jack'}
4. 求两个人各自独有的好友
print(f1 ^ f2) # {'oscar', 'tom', 'jerry', 'jack'}
5.父集 子集
print(f1 > f2) # False
print(f2 < f1) # False
可变类型与不可变类型
s1 = '$$jason$$'
l1 = [11,22,33]
print(s1.strip('$'))
'''
字符串在调用内置方法之后并不会修改自己 而是产生了一个新的结果
如何查看调用方法之后有没有新的结果 可以在调用该方法的代码左侧添加变量名和赋值符号
'''
l1.append(44)
print(l1) # [11, 22, 33, 44]
ret = l1.append(44)
print(ret) # None
'''
列表在调用内置方法之后修改的就是自身 并没有产生一个新的结果
如何查看调用方法之后有没有新的结果 可以在调用该方法的代码左侧添加变量名和赋值符号
'''
可变类型: 值改变 内存地址不变
l1 = [11,22,33]
print(l1)
print(id(l1))
l1.append(44)
print(l1)
print(id(l1))
不可变类型: 值改变 内存地址肯定变
res = '$$hello world$$'
print(res)
print(id(res))
res.strip('$')
print(res)
print(id(res))
作业
1.整理今日内容及博客
每个内置方法一定要自己动手写案例 查看效果
2.基于字符串充当数据库完成用户登录(基础练习)
data_source = 'jason|123' # 一个用户数据
获取用户用户名和密码 将上述数据拆分校验用户信息是否正确
data_source = 'jason|123' # 一个用户数据
# 获取用户用户名和密码 将上述数据拆分校验用户信息是否正确
data_source = 'jason|123'
username = input('username>>>:').strip()
if len(username) == '0':
print('用户名不能为空')
password = input('password>>>:').strip()
if len(username) =='0':
print('用户名不能为空')
name, pwd = data_source.split('|')
if username == name and password == pwd:
print('登陆成功')
else:
print('用户名或密码错误')
3.基于列表充当数据库完成用户登录(拔高练习) # 多个用户数据
data_source = ['jason|123', 'kevin|321','oscar|222']
data_source = ['jason|123', 'kevin|321','oscar|222']
# 获取用户名和密码
username = input('username>>>:').strip()
if len(username) == '0':
print('用户名不能为空')
password = input('password>>>:').strip()
if len(username) =='0':
print('用户名不能为空')
for j in data_source:
real_name, real_pwd = j.split('|')
if username == real_name and password == real_pwd:
print('登陆成功')
break
else:
print('用户名或密码不正确')
4.利用列表编写一个员工姓名管理系统
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
'''分析 用户输入的不同 可以执行不同的代码'''
ps: 思考如何让程序循环起来并且可以根据不同指令执行不同操作
提示: 循环结构 + 分支结构
# 定义一个空列表
data_list = []
while True:
print("""
1.添加用户名
2.查看所有用户名
3.删除指定用户名
""")
# 获取用想要执行的功能编号
choice_num = input('请输入执行的功能编号>>>:').strip()
# 5.根据不同的功能编号执行不同的分支代码
if choice_num == '1':
# 6.获取用户输入的用户吗
username = input('请输入需要添加的用户名>>>:').strip()
# 7.限制用户名不能重复 判断当前用户名是否已存在
if username in data_list:
print('用户名已存在')
else:
# 8.列表添加用户名
data_list.append(username)
print(f'用户名{username}添加成功')
elif choice_num == '2':
# 9.循环打印每一个用户数据
for name in data_list:
print(f"""
---------user info------
用户名:{name}
-----------end----------
""")
elif choice_num == '3':
# 获取用户想要删除的用户名
delete_username = input('输入需要删除的用户名>>>:').strip()
# 10.获取用户想要删除的用户名
if delete_username in data_list:
# 11.先判断用户名是否存在
data_list.remove(delete_username)
print(f'用户名{delete_username}删除成功')
else:
print('员工姓名不存在,无法删除')
else:
print('抱歉,暂时没有您想要执行的功能编号')