第三章 数据类型
3.1 整型(int)
age = 18
3.1.1 整型的长度
py2中有:int/long
int
32位电脑:-2147483648~2147483647
64位电脑:-9223372036854775808~9223372036854775807 超出范围后python自动将其转换成long(长整形)
整型除法只能保留整数位。
from __future__ import division
v = 9 /2
print(v)
py3
只有:int (int/long)
整型除法只能保留所有。
3.1.2 整除
py2和py3中整除是不一样。
3.2 布尔(bool)
布尔值就是用于表示真假。True和False。
只有两个值:True/False
转换
数字转布尔:0是False,其他都是True
字符串转布尔:“”是False,其他都是True
其他类型转换成布尔值:
- str
- ...
对于:None / "" / 0 .... -> false
3.3 字符串(str)
字符串特有
.upper() / .lower()
.isdigit()
.strip() / .lstrip() / .rstrip()
.replace("被替换的字符/子序列","要替换为的内容")
.replace("被替换的字符/子序列","要替换为的内容", 1)
.split('根据什么东西进行分割') /
.split('根据什么东西进行分割', 1 ) /
rsplit
字符串是写代码中最常见的,python内存中的字符串是按照:unicode 编码存储。对于字符串是不可变。
字符串自己有很多方法,如:
大写: upper
v = 'ALEX' v1 = v.upper() print(v1) v2 = v.isupper() # 判断是否全部是大写 print(v2)
小写:lower
v = 'alex' v1 = v.lower() print(v1) v2 = v.islower() # 判断是否全部是小写 print(v2) ############ 了解即可 v = 'ß' # 将字符串变小写(更牛逼) v1 = v.casefold() print(v1) # ss v2 = v.lower() print(v2)
判断是否是数字: isdecimal判断是否10进制数
isdigit() 函数是作用于字符串的,用来判断字符串是否全部由数字组成。
isnumeric() 方法检测字符串是否只由数字组成。这种方法是只针对unicode对象。
v = '1'
# v = '二'
# v = '②'
v1 = v.isdigit() # '1'-> True; '二'-> False; '②' --> True
v2 = v.isdecimal() # '1'-> True; '二'-> False; '②' --> False
v3 = v.isnumeric() # '1'-> True; '二'-> True; '②' --> True
print(v1,v2,v3)
# 以后推荐用 isdecimal 判断是否是 10进制的数。
# ############## 应用 ##############
v = ['alex','eric','tony']
for i in v:
print(i)
num = input('请输入序号:')
if num.isdecimal():
num = int(num)
print(v[num])
else:
print('你输入的不是数字')
去空白+\t+\n + 指定字符串
v1 = "alex " print(v1.strip()) v2 = "alex\t" print(v2.strip()) v3 = "alex\n" print(v3.strip()) v1 = "alexa" print(v1.strip('al'))
公共
len ,计算长度。 (字符串->计算字符串中的字符个数)
索引取值(0作为开始)
v = "oldboy" v1 = v[0] # 0 1 2 3 ... 从前向后 v2 = v[-1] # -1 -2 -3 ...从后向前
- 切片(0作为开始)
v = "oldboy"
# v1 = v[2:4] # 2 =< 索引位置 <3
# v2 = v[3:6]
# v2 = v[3:-1]
# v2 = v[3:]
# v2 = v[:-1]
# print(v2)
# 示例: 取最后两个字符
# data = input('请输入:')
# 方式一
# v = data[-2:]
# print(v)
# 方式二
# total_len = len(data)
# v = data[total_len-2:total_len]
# print(v)
步长
name = 'alex' # val = name[0:-1:2] # val = name[1:-1:2] # val = name[1::2] # val = name[::2] # val = name[-1:0:-2] # print(val) # 笔试题:请将字符串反转。 val = name[::-1] print(val)
for 循环
name = 'alex' for item in name: print(item)
# 练习题
# 1. for循环打印 “alex” 的每个元素: for > while
# 2. 请打印: 1 - 10
"""
for i in range(1,11): # [1,2,3,4,5,6,7,8,9,10,11,12,14] "12345678910"
print(i)
"""
# 3. 请打印: 1 2 3 4 5 6 8 9 10
"""
for i in range(1,11):
if i == 7:
pass
else:
print(i)
独有功能
替换 replace
replace("被替换的字符/子序列","要替换为的内容") / .
replace("被替换的字符/子序列","要替换为的内容", 1)
开头 / 结尾
startswith / endswith
name = 'alex'
# 判断是否已al开头
"""
# 方式一:
flag = name.startswith('al')
print(flag)
"""
"""
# 方式二:
val = name[0:2]
if val == 'al':
print('是以al开头')
else:
print('不是')
编码,把字符串转换成二进制
format
name = "我叫{0},年龄: {1}".format('老男孩',73) print(n)
encode
name = '李杰' # 解释器读取到内存后,按照unicode编码存储:8个字节。 v1 = name.encode('utf-8') print(v1) v2 = name.encode('gbk') print(v2)
join
name = 'alex' # a_l_e_x result = "**".join(name) # 循环每个元素,并在元素和元素之间加入连接符。 print(result)
split
split('根据什么东西进行分割') / .split('根据什么东西进行分割', 1 ) / rsplit
其他【可选】
3.4 列表
users = ["李邵奇","奇航",99]
3.4.1公共功能
len
users = ["李邵奇","奇航",99]
val = len(users)
print(val) # 3
索引
users = ["李邵奇","奇航",99]
val = users[0]
print(val)
切片
users = ["李邵奇","奇航",99] val = users[0:2]
删除(数字/布尔/字符串除外)
users = ["李邵奇","奇航",99] # 方式一 users.pop(1) print(users) # 方式二: del users[1] print(users)
注意:
字符串本身不能修改或删除【不可变类型】
v1 = "alex"
列表是可变类型。
修改(字符串/数字/布尔除外)
users = ["李邵奇","奇航",99] users[2] = 66 users[0] = '李杰' users[0][1]
步长
users = ["李邵奇","奇航",99] val = users[0:2:2]
练习题
实现一个整数加法计算器(两个数相加): 如:content = input("请输入内容:") 用户输入:5+9或5+ 9或5 + 9(含空白),然后进行分割转换最终进行整数的计算得到结果。 # 思路一: content = input('请输入:') # [5+9] 或 [5 +9] 或者 [ 5 + 9 ] content = content.strip() # [5+9] 或 [5 +9] 或者 [5 + 9] v1 = int(content[0]) v2 = int(content[-1]) v3 = v1 + v2 # 思路二: content = input('请输入:') # [5+9] 或 [5 +9] 或者 [ 5 + 9 ] content_len = len(content) index = 0 total = 0 while True: char = content[index] if char.isdigit(): total += int(char) index += 1 if index == content_len: break print(total) # 思路三: content = input('请输入:') # [5+9] 或 [5 +9] 或者 [ 5 + 9 ] result = content.split('+') # print(result) # ['55 ', ' 99 '] v1 = int(result[0]) # "55" v2 = int(result[1]) # " 99 " v3 = v1 + v2 print(v3)
for 循环
users = ['李邵奇','利奇航','张三丰','李子森'] for i in users: print(i) users = ['李邵奇','利奇航','张三丰','李子森'] for i in users: # 第一次循环:i=“李邵奇” print(i) for ele in i: print(ele) # 练习题:请通过for循环和数字计数器实现:users = ['李邵奇','利奇航','张三丰','李子森'] 0 李邵奇 1 利奇航 2 张三丰 3 李子森 # 方式一 users = ['李邵奇','利奇航','张三丰','李子森'] count = 0 for i in users: print(count,i) count += 1 # 方式二 users = ['李邵奇','利奇航','张三丰','李子森'] users_len = len(users) # 4 for index in range(0,users_len): # [0,1,2,3] print(index,users[index])
3.4.2独有功能
append, 在列表的最后追加一个元素
users = [] users.append('alex') print(user)
示例一:
users = []
while True:
name = input('请输入姓名:')
users.append(name)
print(users)
示例二:
# 录入用户和密码
users = []
for i in range(0,3):
name = input('请输入用户名和密码:')
users.append(name)
print(users) # ['alex,123', 'oldboy,888', 'lishaoqi,123']
# 用户和密码校验
username = input('请输入要登陆用户名:')
password = input('请输入要登陆密码:')
for item in users:
result = item.split(',') # ['alex','123']
user = result[0]
pwd = result[1]
if user == username and pwd == password:
print('登陆成功')
break
-
insert
list.insert(index, obj)
#!/usr/bin/python
aList = [123, 'xyz', 'zara', 'abc']
aList.insert( 3, 2009)
print ("Final List : ", aList)
remove
name_list.remove('Byrant') print(name_list)
pop
a=name_list.pop() print(a)
clear
#list.clear() list1 = ['Google', 'Runoob', 'Taobao', 'Baidu'] list1.clear() print ("列表清空后 : ", list1)
extend
aList = [1,2,3] bList = ['www', 'pythontab.com'] aList.extend(bList) print(aList) # 结果: [1, 2, 3, 'www', 'pythontab.com']
reverse,反转。
v1 = [1,2,3111,32,13] print(v1) v1.reverse() print(v1)
sort
v1 = [11,22,3111,32,13] print(v1) # v1.sort(reverse=False) # 从小到大(默认) # v1.sort(reverse=True) # 从大到小 # print(v1)
3.4.3总结:
增:
- append / insert
删:
- remove / pop / clear / del users[2]
改:
- users[3] = "新值"
查:
- 索引/切片
- 列表嵌套
users = ["alex",0,True,[11,22,33,"老男孩"],[1,['alex','oldboy'],2,3]] users[0] users[2] users[0][2] users[3] # [11,22,33,"老男孩"] users[3][-1] # "老男孩" users[3][-1][1] # '男' users[3] = 666
3.5元组
3.5.1 元组书写规范
users = [11,22,33,"老男孩"] # 列表(可变) users = (11,22,33,"老男孩") # 元组(不可变)
3.5.2 公共功能
索引(排除:int/bool)
users = (11,22,33,"老男孩") print(users[0]) print(users[-1])
切片(排除:int/bool)
users = (11,22,33,"老男孩") print(users[0:2])
步长(排除:int/bool)
users = (11,22,33,"老男孩") print(users[0:2:2])
删除(排除:tuple/str/int/bool)
修改(排除:tuple/str/int/bool)
for循环(排除:int/bool)
users = (11,22,33,"老男孩")
for item in users:
print(item)len(排除:int/bool)
users = (11,22,33,"老男孩") print(len(users))
3.5.3 独有功能(无)
3.5.4特殊:元组中的元素(儿子)不可被修改/删除。
# 示例一:
v1 = (11,22,33)
v1[1] = 999 # 错误
v1 = 999 # 正确
# 示例二:可以嵌套
v1 = (11,22,33,(44,55,66),(11,2,(99,88,),3))
# 示例三:嵌套
v2 = [11,22,33,(11,22,33)]
v2[-1][1] = 99 # 错误
v2[-1] = 123 # 正确
# 示例四:嵌套
v3 = (11,[1,2,3],22,33)
v3[1] = 666 # 错误
v3[1][2] = 123
3.6.字典
帮助用户去表示一个事物的信息(事物是有多个属性)。
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} # 键值
# 请输出:我今天点%s,他的年龄是%s,性别是%s,他喜欢他的%s;
3.6.1基本格式
data = {键:值,键:值,键:值,键:值,键:值,键:值,}
# 练习题
userinfo = {'usenrame':'alex','password':"oldboy"}
user = input('请输入用户:')
pwd = input('请输入密码:')
if userinfo['username'] == user and userinfo['password'] == pwd:
print('登陆成功')
else:
print('用户名或密码错误')
3.6.2独有功能
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'}
-
- keys, 获取字典中所有的键。 ['name','age','gender','hobby']
# for item in info.keys(): # print(item)
2.values,获取字典中所有的值。 ['刘伟达','18','男','同桌']
# for v1,v2 in info.items(): # print(v1,v2)
3.items,获取字典中的所有键值对。
# for v1,v2 in info.items(): # print(v1,v2)
4.get
info = {'k1':'v1','k2':'v2'} # v1 = info['k11111'] # v2 = info.get('k1111') # None就是Python中的空 # v3 = info.get('k1111',666) # print(v2) # None数据类型,改类型表示空(无任何功能,专门用于提供空值)
5.pop
info = {'k1':'v1','k2':'v2'} result = info.pop('k2') print(info,result) del info['k1']
update
info = {'k1':'v1','k2':'v2'} # 不存在,则添加/存在,则更新 info.update({'k3':'v3','k4':'v4','k2':666}) print(info)
3.6.3公共功能
len
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} print(len(info))
索引
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} info['name'] info['age']
切片【无】
步长【无】
for
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} for item in info.keys(): print(item) for item in info.values(): print(item) for k,v in info.items(): print(k,v)
修改(存在就修改/不存在就增加)
# 改值 info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} info['age'] = 19 print(info) # 改键 # 删除后再增加 del info['hobby'] info['xxxxx'] = 'x1'
- 删除
info = {"name":'刘伟达','age':18,'gender':'男','hobby':'同桌'} del info['name'] print(info)
3.7 集合 set
3.7.1 集合的特点
无序
无重复
v = {1,2,3,4,5,6,99,100} # 疑问:v = {} None int v1 = 123 v1 = int() --> 0 bool v2 = True/False v2 = bool() -> False str v3 = "" v3 = str() list v4 = [] v4 = list() tuple v5 = () v5 = tuple() dict v6 = {} v6 = dict() set v7 = set()
3.7.2 集合独有功能
- add
s = {6,7,8,9} #增加 s.add(1) print(s)
- discard
- update
s1 = {1,4,5}
s1.update({2,3}) #s1变
print(s1)
- 删除
s = {6,7,8,9}
s.pop()
print(s)
#删除指定元素
s = {6,7,8,9}
s.remove(7)
print(s)
- intersection
s1 = {1,2,3}
s2 = {2,3,4}
#交集
print('交集: ',s1.intersection(s2))
print('交集: ',s1 & s2)
- union
s1 = {1,2,3}
s2 = {2,3,4}
#并集
print('并集: ',s1.union(s2))
print('并集: ',s1 | s2)
- difference
s1 = {1,2,3}
s2 = {2,3,4}
print('差集: ',s1.difference(s2)) #s1 - (s1&s2)
print('差集: ',s2.difference(s1)) #s2 - (s1&s2)
- symmetric_difference
s1 = {1,2,3}
s2 = {2,3,4}
print('对等差分: ',s1.symmetric_difference(s2))
print('对等差分: ',s2.symmetric_difference(s1))
- 子集
s1 = {1,2}
s2 = {1,2,3}
print(s1.issuperset(s2))
print(s1.issubset(s2))
- 判断两个集合是否相交
s1 = {1,2}
s2 = {1,2,3}
print(s1.isdisjoint(s2))
##### 3.7.3公共功能
len
v = {1,2,'李邵奇'} print(len(v))
for 循环
v = {1,2,'李邵奇'} for item in v: print(item)
- 索引【无】
- 步长【无】
切片【无】
修改【无】
3.8 内容补充
3.8.1强制转换
int('字符串') 【重要】
int(布尔值)
bool
bool(整数) -> bool(1)/.. -> bool(0)
bool(字符串) -> bool('xx') --> bool("")
bool(列表) -> bool([]) --> bool([])
bool(元组) -> bool(()) --> bool(空元组)
v1 = bool(0) v2 = bool("") v3 = bool([]) v4 = bool(()) print(v1,v2,v3,v4) # False
```
str(999) # "999"
str(True) # "True"
str(["唐开发",'李忠伟']) # "["唐开发",'李忠伟']" v2 = "".join(["唐开发",'李忠伟'])
- str(["唐开发",'李忠伟'])
- list("asdfadfasfdadfasfd")
v1 = list("asdfadfasfdadfasfd")
print(v1)
- list( (11,22,33,44,) )
v1 = list( (11,22,33,44,) )
print(v1)
```
tuple('adfadfasdfasdfasdfafd')
v1 = tuple('adfadfasdfasdfasdfafd') print(v1)
tuple([11,22,33,44])
v1 = tuple([11,22,33,44]) print(v1)
总结
常见的类型转换
# 字符串转数字
# 数字转字符串
# 列表转元组
# 元组转列表
# 其他转bool时,只有:0 “” [] ()
# 练习题
nums = [11,22,33,44]
for i in range(0,len(nums)):
nums[i] = str(nums[i])
resutl = '_'.join(nums)
print(resutl)
# 1. "".join([元素必须是字符串,元素必须是字符串,])
##### 3.8.2 判断一个字符串中是否有敏感字符?
str
v = "Python全栈21期" if "全栈" in v: print('含敏感字符')
list/tuple
v = ['alex','oldboy','藏老四','利奇航'] if "利奇航" in v: print('含敏感')
dict
v = {'k1':'v1','k2':'v2','k3':'v3'} # 默认按照键判断,即:判断x是否是字典的键。 if 'x' in v: pass # 请判断:k1 是否在其中? if 'k1' in v: pass # 请判断:v2 是否在其中? # 方式一:循环判断 flag = '不存在' for v in v.values(): if v == 'v2': flag = '存在' print(flag) # 方式二: if 'v2' in list(v.values()): # 强制转换成列表 ['v1','v2','v3'] pass # 请判断:k2:v2 是否在其中? value = v.get('k2') if value == 'v2': print('存在') else: print('不存在')
练习题
# 让用户输入任意字符串,然后判断此字符串是否包含指定的敏感字符。 char_list = ['利奇航','堂有光','炸展会'] content = input('请输入内容:') # 我叫利奇航 / 我是堂有光 / 我要炸展会 success = True for v in char_list: if v in content: success = False break if success: print(content) else: print('包含铭感字符') # 示例: # 1. 昨天课上最后一题 # 2. 判断 ‘v2’ 是否在字典的value中 v = {'k1':'v1','k2':'v2','k3':'v3'} 【循环判断】 # 3. 敏感字
3.8.3 嵌套问题
# 1. 列表/字典/集合 -> 不能放在集合中+不能作为字典的key(unhashable) # info = {1, 2, 3, 4, True, "国风", None, (1, 2, 3)} # print(info) # 2. hash -> 哈希是怎么回事? # 因为在内部会将值进行哈希算法并得到一个数值(对应内存地址),以后用于快速查找。 # 3. 特殊情况 # info = {0, 2, 3, 4, False, "国风", None, (1, 2, 3)} # print(info) # info = { # 1:'alex', # True:'oldboy' # } # print(info)
```
3.9 内存相关
示例一
v1 = [11,22,33] v2 = [11,22,33] v1 = 666 v2 = 666 v1 = "asdf" v2 = "asdf" # 按理 v1 和 v2 应该是不同的内存地址。特殊: 1. 整型: -5 ~ 256 2. 字符串:"alex",'asfasd asdf asdf d_asdf ' ----"f_*" * 3 - 重新开辟内存。
示例二:
v1 = [11,22,33,44] v1 = [11,22,33]
示例三:
v1 = [11,22,33] v2 = v1 # 练习1 (内部修改) v1 = [11,22,33] v2 = v1 v1.append(666) print(v2) # 含 666 # 练习2:(赋值) v1 = [11,22,33] v2 = v1 v1 = [1,2,3,4] print(v2) # 练习3:(重新赋值) v1 = 'alex' v2 = v1 v1 = 'oldboy' print(v2)
示例四
v = [1,2,3] values = [11,22,v] # 练习1: v.append(9) print(values) # [11,22,[1,2,3,9]] # 练习2: values[2].append(999) print(v) # [1, 2, 3, 999] # 练习3: v = 999 print(values) # [11, 22, [1, 2, 3]] # 练习4: values[2] = 666 print(v) # [1, 2, 3]
示例五
v1 = [1,2]
v2 = [2,3]v3 = [11,22,v1,v2,v1]
查看内存地址
v1 = [1,2,3] v2 = v1 v1.append(999) print(v1,v2) print(id(v1),id(v2)) v1 = [1,2,3] v2 = v1 print(id(v1),id(v2)) v1 = 999 print(id(v1),id(v2)) - 问题: == 和 is有什么区别? - == 用于比较值是否相等。 - is 用于比较内存地址是否相等
#### 3.9.1深浅拷贝
# 可变
- 浅拷贝:拷贝第一层
- 深拷贝:拷贝所有数据
# 应该每次都拷贝一份(但由于小数据池,未拷贝)
v1 = 'alex'
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))
v1 = [1,2,3,4]
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))
# v1 = [1,2,3,4,[11,22,33]]
# import copy
# v2 = copy.copy(v1)
# print(id(v1),id(v2))
# print(id(v1[4]),id(v2[4]))
# v2 = copy.deepcopy(v1)
# print(id(v1),id(v2))
# print(id(v1[4]),id(v2[4]))
# ###################################################
# 练习 1
"""
import copy
v1 = [1,2,3]
v2 = copy.copy(v1)
print(v1 == v2) # True
print(v1 is v2) # False
print(v1[0] is v2[0]) # True
# 练习 2
import copy
v1 = [1,2,3]
v2 = copy.deepcopy(v1)
print(v1 == v2) # True
print(v1 is v2) # False
print(v1[0] is v2[0]) # True
### 练习3
import copy
v1 = [1,2,3,{'k1':123,'k2':456}]
v2 = copy.deepcopy(v1)
print(v1 == v2) # True
print(v1 is v2) # False
print(v1[0] is v2[0]) # True
print(v1[3] == v2[3]) # True
print(v1[3] is v2[3]) # False
# ################ 总结 #########################
# 浅拷贝:只拷贝第一层。
# 深拷贝:拷贝嵌套层次中的所有可变类型。
# ------ 特殊情况
v1 = (1,2,3,4)
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))
v1 = (1,2,3,[1,2,3],4)
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))
# 不可变
# v1 = 'asdf'
# v1 = 123
# import copy
# v2 = copy.copy(v1)
# print(id(v1),id(v2))
# v3 = copy.deepcopy(v1)
# print(id(v1),id(v3))
# 可变 + 不可变
v1 = [1,2,3,[11,2,33]]
import copy
v2 = copy.copy(v1)
print(id(v1),id(v2))
v3 = copy.deepcopy(v1)
print(id(v1),id(v3))