数据类型内置方法
内置方法理论
我们之前所学习的八大数据类型每一个都有它自身的一系列操作方法,其中内置方法功能是最多的
在python中所有数据类型的内置方法都可以使用句点符来实现 (绑定字符串的变量名.字符串内置方法)
整型内置方法
- 类型转换
可以直接将浮点型转为整型,字符串中只能转纯数字的字符串,里面多一个小数点都不行
print(int(11.1)) # 11
print(int('11')) # 11
print(int('11.3')) # 报错
- 进制转换
能将十进制转为其它进制,也可以将其他进制转为十进制
十进制转其他进制
print(bin(100)) # 0b1100100 二进制 0b开头
print(oct(100)) # 0o144 八进制 0o开头
print(hex(100)) # 0x64 十六进制 0x开头
其他进制转十进制
print(int(0b1100100))
print(int(0o144))
print(int(0x64))
ps:python语言自身对数字的敏感度或者说精确度较低,当我们需要进行精准的计算时需要借助于模块numpy...
浮点型内置方法与操作
类型转换
可以将整型转为浮点型,字符串中可以转纯数字的字符串,带小数点的字符串也可但字符串中只能有一个小数点多一个都不行
print(float(18)) # 18.0
print(float('18')) # 18.0
print(float('18.66')) # 18.66
print(float('18.66.77.88')) # 报错
print(float('qwer')) #报错
字符串内置方法
类型转换
str(其它数据类型)
字符串的数据转换可以转任意数据类型,只需要在前后加上引号即可
需要掌握的方法
- 索引取值(起始位置从0开始,超出范围报错)
a = 'abcdefg'
print(a[0]) # a 从左往右
print(a[-1]) # g 从右往左,以负数形式
- 切片操作
a = 'abcdefg'
print(a[0:5]) # abcde 顾头不顾尾 从索引0取到索引4
print(a[-5:-1]) # cdef 支持负数但还是从左往右的顺序
- 修改切片方向(间隔)
a = 'abcdefghijk'
print(a[1:5:1]) # bcde 正常切片取值时第二个冒号后面不填或者没有第二个冒号,间隔都默认为一
print(a[1:5:2]) # bd 间隔为2,隔一个取值
print(a[-1:-5:-1]) # kjih 从右往左切片取值
print(a[:]) # 不写数字就默认全都要
print(a[2:]) # 从索引2开始往后都要
print(a[:5]) # 从索引0开始切取到索引4
print(a[::2]) # 全都要但是间隔为2
- 统计字符串中字符的个数
a = 'abcdefghijk'
print(len(a)) # 11 字符串中统计字符个数用len()
- 移除字符串首尾指定的字符
a = ' abcdefghijk ' # 在字符串中空格也算字符串
# 字符串中移除首尾指定的字符用.strip()
print(a.strip(' ')) # abcdefghijk 引号内填写需要移除的字符
print(a.lstrip(' ')) # 移除左边的指定字符
print(a.rstrip(' ')) # 移除右边的指定字符
- 切割字符串中指定的字符
res = 'zyg|666|read'
print(res.split('|')) # ['zyg', '666', 'read'] 该方法的处理结果是产生一个列表
print(res.split('|', maxsplit = 1)) # ['zyg', '666|read'] 从左往右切指定个数
print(res.rsplit('|', maxsplit = 1)) # ['zyg|666', 'read'] 从右往左切指定个数
- 字符串格式化输出
方法一:
# 等价于占位符
res = 'my name is {} my age is {}'.format('zyg', 666)
print(res) # my name is zyg my age is 666
方法二:
# 索引取值,且可以重复取用
res = 'my name is {0} my age is {1} {0} {1}'.format('zyg', 666)
print(res) # my name is zyg my age is 666 zyg 666
方法三:
# 占位符见名知意
res = 'my name is {name1} my age is {age1} {name1} {age1} {name1} '.format(name1='zyg', age1=666)
print(res) # my name is zyg myage is 666 zyg 666 zyg
方法四:与用户输入搭配 (推荐使用)
name = input('username:')
age = input('age:')
res = f'my name is {name} my age is {age}'
print(res)
字符串需要了解的方法
- 大小写相关
- upper()转大写
res = 'hello WORLD 666'
print(res.upper()) # HELLO WORLD 666
- .lower()转小写
res = 'hello WORLD 666'
print(res.lower()) # hello world 666
- .isupper()判断字符串是否是纯大写
- .islower()判断字符串是否是纯小写
res = 'hello world'
print(res.isupper()) # False 判断是否是纯大写
print(ers.islower()) # Ture 判断是否是纯小写
- 判断字符串中是否是纯数字
res = '666'
print(res.isdigit()) # Ture 判断是否是纯数字
- 替换字符串中指定的内容
res = 'I like EDG,EDG,EDG'
print(res.replace('EDG', 'RNG')) # I like RNG,RNG,RNG
# .replace(旧内容, 新内容)替换字符串中指定的内容
print(res.replace('EDG', 'RNG', 1)) # 从左往右替换指定个数内容
- 字符串的拼接
a = 'EDG'
b = 'NB'
print(a + b) # EDGNB # 字符串支持字符串与字符串相加
print(a * 2) # EDGEDG # 字符串只能与纯数字相乘且为整数
print('|'.join(['jason', '123', 'read', 'JDB'])) # jason|123|read|JDB
print('|'.join(['jason', 123])) # 报错 参与拼接的数据值必须都是字符串
- 统计指定字符出现的次数
res = 'hello world'
print(res.count('l')) # 3 使用.count()来统计次数
- 判断字符串的开头或者结尾
res = 'jason say hello'
print(res.startswith('j')) # True
print(res.startswith('a')) #False
print(res.startswith('jason')) #True
print(res.endswith('o')) #True
# 判断字符串的开头用.startswith() 判断字符串的结尾用.endswith()
- 其他方法补充
res = 'helLO wORld hELlo worLD'
print(res.title()) # Hello World Hello World 每个单词的首字母大写
print(res.capitalize()) # Hello world hello world 第一个单词的首字母大写
print(res.swapcase()) # HELlo WorLD HelLO WORld 大小写转换
print(res.index('O')) # 4 查找索引
print(res.find('O')) # 4 查找索引
列表内置方法及操作
类型转换
list
能够被for循环使用的数据类型
可以转换的数据类型有字符串、字典、元组、集合(不能为空)
需要掌握的方法
- 索引取值(正负数)
11 = [111, 222, 333, 444, 555, 666, 777, 888]
print(l1[1]) # 222
print(l1[-1]) # 888
- 切片操作 与字符串操作一致
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
print(l1[0:5]) # [111, 222, 333, 444, 555]
print(l1[:]) # [111, 222, 333, 444, 555, 666, 777, 888]
- 间隔数 与字符串操作一致
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
print(l1[::-1]) # [888, 777, 666, 555, 444, 333, 222, 111]
- 统计数据值的个数 与字符串操作一致
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
print(len(l1)) # 8
- 修改数据值
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
l1[0] = 123
print(l1) # [123, 222, 333, 444, 555, 666, 777, 888]
- 列表添加数据值
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
方式一:尾部追加数据值 .append()
l1.append('123')
print(l1) # [111, 222, 333, 444, 555, 666, 777, 888, '123']
l1.append([1, 2, 3])
print(l1) # [111, 222, 333, 444, 555, 666, 777, 888, [1, 2, 3]]
方式二:任意位置插入数据值 .insert()
l1.insert(0, 123)
print(l1) # [123, 111, 222, 333, 444, 555, 666, 777, 888]
l1.insert(5, 123)
print(l1) # [111, 222, 333, 444, 555, 123, 666, 777, 888]
方法三:扩展或合并列表 .extend()
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b) # [1, 2, 3, 4, 5, 6]
a.extend(b)
print(a) # [1, 2, 3, 4, 5, 6]
- 删除列表数据
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
方式一:通用的删除关键字del
del l1[1]
print(l1) # [111, 333, 444, 555, 666, 777, 888]
方式二:remove
l1.remove(222) # 括号内填写具体的数据值
print(l1) # [111, 333, 444, 555, 666, 777, 888]
方式三:pop
l1.pop(1) # 括号内填写索引值
print(l1) # [111, 333, 444, 555, 666, 777, 888]
l1.pop() #默认弹出尾部数据值
print(l1) # [111, 222, 333, 444, 555, 666, 777]
# pop与remove的却别在于remove是直接删除数据,pop是弹出数据,弹出的数据可以找变量名接收
- 排序 .sort
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
l1.sort() # 默认是升序
print(l1) # [111, 222, 333, 444, 555, 666, 777, 888]
l1.sort(reverse = True) # 改为降序
print(l1) # [888, 777, 666, 555, 444, 333, 222, 111]
- 统计列表中某个数据值出现的次数 .count
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
print(l1.count(111)) # 1
- 颠倒列表的顺序.reverse
l1 = [111, 222, 333, 444, 555, 666, 777, 888]
l1.reverse() #
print(l1) # [888, 777, 666, 555, 444, 333, 222, 111]
可变类型与不可变类型
a = '$$zyg$$'
b = [1, 2, 3]
a1 = a.strip('$')
print(a) # $$zyg$$
print(a1) # zyg
b1 = b.append(4)
print(b) # [1, 2, 3, 4]
print(b1) # None
# 字符串在调用内置方法以后不会改变自己而是产生一个新的结果
# 列表在调用内置方法以后改变的是自身不会产生一个新的结果
什么是可变类型不可变类型
- 可变类型
值改变,内存地址不变
- 不可变类型
值改变,内存地址也改变
字典相关操作
类型转换
dict() 字典的转换一般不使用关键字,都是自己手动转
字典必须要掌握的操作
user_dict = {
'username': 'jason',
'password': 123,
'hobby': ['read', 'music', 'run']
}
-
按k取值(不推荐使用)
print(user_dict['username']) # jason print(user_dict['phone']) # 当k不存在时会直接报错 -
按内置方法get取值(推荐使用)
print(user_dict.get('username')) # jason print(user_dict.get('age')) # None print(user_dict.get('phone', '找不到我吧')) # 键不存在默认返回None 可以通过第二个参数自定义 -
修改数据值
user_dict['username'] = 'tony' # 键存在则修改对应的值 print(user_dict) # {'username': 'tony', 'password': 123, 'hobby': ['read', 'music', 'run']} -
新增键值对
user_dict['age'] = 18 # 键不存在则新增键值对 print(user_dict) # {'username': 'jason','password': 123,'hobby': ['read', 'music', 'run'],'age':18} -
删除数据
方式一:del del user_dict['username'] print(user_dict) # {'password': 123,'hobby': ['read', 'music', 'run']} 方式二:pop user_dict.pop('password') print(user_dict) # {'username': 'jason','hobby': ['read', 'music', 'run']} -
统计字典中键值对的个数
print(len(user_dict)) # 3 -
字典三剑客
剑客一: 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'])]) 一次性获取字典的键值对数据 -
补充说明
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']} # 当第二个公共值是可变类型的时候,一定要注意,通过任何一个键修改值都会影响所有 res = user_dict.setdefault('username','tony') print(user_dict, res) # tony 键存在则不修改 结果是键对应的值 res = user_dict.setdefault('age',123) print(user_dict, res) # 123 键不存在则新增键值对 结果是新增的值 user_dict.popitem() # 随机弹出一个键值对,采用后进先出的原则
元组相关操作
类型转换
tuple()
支持for循环的数据类型都可以转成元组
元祖必须掌握的方法(使用方法与列表差不多)
a = (1, 2, 3, 4, 5, 6,)
-
索引取值
print(a[0]) # 1 -
切片操作
print(a[0:5]) # (1, 2, 3, 4, 5) -
间隔、方向
print(a[0:5:2]) # (1, 3, 5) print(a[-1:-5:-1]) # (6, 5, 4, 3) -
统计元组内数据值的个数
print(len(a)) # 6 -
统计元组内某个数据值出现的次数
print(a.count(5)) # 1 -
统计元组内指定数据值的索引值
print(a.index(4)) # 3
注意:
元组内如果只有一个数据值那么逗号不能少
元组内索引绑定的内存地址不能被修改(注意区分 可变与不可变)
元组不能新增或删除数据
集合相关操作
类型转换
set()
集合内的的数据必须是不可变类型(整型、浮点型、字符串、元组)
集合内的数据是无序的,没有索引的概念
集合需要掌握的方法
- 去重
s1 = {11, 22, 11, 22, 22, 11, 222, 11, 22, 33, 22}
l1 = [11, 22, 33, 22, 11, 22, 33, 22, 11, 22, 33, 22]
s1 = set(l1)
l1 = list(s1)
print(l1) # [33, 11, 22]
集合的去重无法保留原来数据的排列顺序
- 关系运算
群体之间的差异化校验
a1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
a2 = {5, 6, 7, 8, 9, 10, 11, 12, 13}
# 1.求两个集合之间相同的部分
print(a1 & a2) # {5, 6, 7, 8, 9}
# 2.求a1独有的数据
print(a1 - a2) # {1, 2, 3, 4}
# 3.求两个集合所有的数据
print(a1 | a2) # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}
# 4.求两个集合各自独有的数据
print(a1 ^ a2) # {1, 2, 3, 4, 10, 11, 12, 13}
# 5.父集与子集
就是子集的数据父集中都有,父集中的数据子集不一定有
字符编码
编码与解码
编码:将人类的字符按照指定的编码编码成计算机能够读懂的数据
字符串.encode()
a = '一条大河波浪宽,风吹稻花香两岸'
b = a.encode()
print(b) # b'\xe4\xb8\x80\xe6\x9d\xa1\xe5\xa4\xa7\xe6\xb2\xb3\xe6\xb3\xa2\xe6\xb5\xaa\xe5\xae\xbd\xef\xbc\x8c\xe9\xa3\x8e\xe5\x90\xb9\xe7\xa8\xbb\xe8\x8a\xb1\xe9\xa6\x99\xe4\xb8\xa4\xe5\xb2\xb8
解码:将计算机能够读懂的数据按照指定的编码解码成人能够读懂
bytes类型数据.decode()
print(b.decode('utf8')) # 一条大河波浪宽,风吹稻花香两岸
python2与python3的差异
python2默认的编码是ASCII,不能识别汉字,因此当给我们需要在python2中做此类操作时有两种方法
第一种:添加一个文件头
就是在编码一开始的时候就说明一下 # encoding:utf8
第二种:字符串前面加u
python3默认的编码是utf系列
练习题
1.基于字符串充当数据库完成用户登录(基础练习)
data_source = 'jason|123' # 一个用户数据
data_source = 'jason|123'
username = input('请输入用户名:')
passworld = input('请输入密码:')
if username in data_source.split('|') and passworld in data_source.split('|'):
print('登陆成功')
else:
print('登陆失败')
2.基于列表充当数据库完成用户登录(拔高练习) # 多个用户数据
data_source = ['jason|123', 'kevin|321','oscar|222']
data_source = ['jason|123', 'kevin|321', 'oscar|222']
username = input('请输入用户名:')
passworld = input('请输入密码:')
if ('|'.join([username, passworld])) in data_source:
print('登录成功')
else:
print('登陆失败')
3.利用列表编写一个员工姓名管理系统
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
username = {}
while True:
a = int(input('请按功能键:'))
while a == 1:
username1 = input('请输入要添加的用户名:')
passworld = int(input('请设置密码:'))
username[username1] = passworld
hint = input('添加完成是否继续添加:')
if hint == 'y':
continue
else:
break
if a == 2:
for i in username:
print(i)
continue
while a == 3:
delnet = input('请输入您要删除的用户名:')
if delnet in username:
del[username[delnet]]
print('删除成功')
break
else:
print('您输入的用户名不存在')
if a == 0:
print('退出')
break
while a == 4:
username2 = input('请输入您的用户名:')
passworld1 = int(input('请输入您的密码:'))
if username2 in username and passworld1 == username[username2]:
print('登录成功')
break
else:
print('用户名密码错误请重新登录')
continue
else:
print('请重新按功能键:')
continue
浙公网安备 33010602011771号