第五章 数据类型
本节带大家来学习Python常见的数据类型,Python中提供了int/bool/str/list/tuple/dict常见的数据类型共我们来使用,而每种数据类型都有自己的特点及应用场景,以后的开发中需要根据实际的开发情况选择合适的数据类型。
1. 整型(int)
整型其实就是十进制整数的统称,比如:1、68、999都属于整型。他一般用于表示 年龄、序号等。
1.1 定义整型
number = 10
age = 99
# 可以通过type查看下到底是什么类型
print( type(number) )
1.2 常见方法
无
1.3 转换为整型
在项目开发和面试题中经常会出现一些 “字符串” 和 布尔值 转换为 整型的情况。
# 布尔值转整型
n1 = int(True) # True转换为整数 1
n2 = int(False) # False转换为整数 0
# 字符串转整型
v1 = int("186",base=10) # 把字符串看成十进制的值,然后再转换为 十进制整数,结果:v1 = 186
v2 = int("0b1001",base=2) # 把字符串看成二进制的值,然后再转换为 十进制整数,结果:v2 = 9 (0b表示二进制)
v3 = int("0o144",base=8) # 把字符串看成八进制的值,然后转换为 十进制整数,结果:v3 = 100 (0o表示八进制)
v4 = int("0x59",base=16) # 把字符串看成十六进制的值,然后转换为 十进制整数,结果:v4 = 89 (0x表示十六进制)
所以,如果以后别人给你一个按 二进制、八进制、十进制、十六进制 规则存储的字符串时,可以轻松的通过int转换为十进制的整数。
1.4 其他
在python2中跟整数相关的数据类型有两种:int(整型)、long(长整型),他们都是整数只不过能表示的值范围不同。
- int,可表示的范围:-9223372036854775808~9223372036854775807
- long,整数值超出int范围之后自动会转换为long类型(无限制)。
在python3中去除了long只剩下:int(整型),并且 int 长度不在限制。
扩展:python2中两个值相除时,默认进行地板除,只保留整数位。(python3中默认会保留小数)
# 默认
v1 = 3/2 # 值为 1
# 想要保留小数位
from __future__ import division
v2 = 3/2 # 值为 1.5
2. 布尔值(bool)
布尔值,其实就是 “真”、“假” 两个值的统称。
2.1 布尔值的表示
alex_is_sb = True
oldboy_is_db = False
2.2 常见方法
无
2.3 转换为布尔值
在以后的项目开发中,会经常使用其他类型转换为布尔值的情景,此处只要记住一个规律即可。
整数0、空字符串、空列表、空元祖、空字典转换为布尔值时均为False
其他均为True
2.4 其他
如果在 if
、while
条件后面写一个值当做条件时,他会默认转换为布尔类型,然后再做条件判断。
if 666:
print("太六了")
if "Jesse":
print("你好")
if 0:
print("你是傻逼?")
else:
print("你是逗比?")
练习题:判断用户输入是否为空?如果为空则提示输入错误。
value = input("请输入值:")
if not value:
print("用户输入不能为空")
3. 字符串(str)
字符串,我们平时会用他来表示文本信息。例如:姓名、地址、自我介绍等。
- python中的字符串可以使用单引号,双引号和三引号(三个单引号或三个双引号)括起来,使用反斜杠\转义特殊字符
- Python3源码默认使用UTF-8编码,所有字符串都是Unicode字符串
- 支持字符串拼接,截取等多种运算
3.1 字符串的表示
v1 = "包治百病"
v2 = '包治百病'
v3 = "包'治百病"
v4 = '包"治百病'
v5 = """
这是一个段落
可以由多行组成
"""
# 三个引号,可以支持多行/换行表示一个字符串,其他的都只能在一行中表示一个字符串。
3.2 常见方法
Python中给属于字符串的所有的值都提供了一些功能(方法),从而可以快速对字符串进行一些方便的操作。
注意:这是字符串类型独有的功能,其他类型中没有此功能。
-
判断字符串是否以 XX 开头?得到一个布尔值
v1 = "叨逼叨的一天,烦死了" result = v1.startswith("叨逼") print(result) # 值为True
# 案例 v1 = input("请输入住址:") if v1.startswith("北京市"): print("北京人口") else: print("非北京人口")
-
判断字符串是否以 XX 结尾?得到一个布尔值
v1 = "叨逼叨的一天,烦死了" result = v1.endswith("烦死") print(result) # 值为False
# 案例 address = input("请输入地址:") if address.endswith('村'): print("农业户口") else: print("非农户口")
-
判断字符串是否为十进制数?得到一个布尔值
v1 = "1238871" result = v1.isdecimal() print(result) # True
# 案例 v1 = input("请输入值:") v2 = input("请输入值:") if v1.isdecimal() and v2.isdecimal(): data = int(v1) + int(v2) print(data) else: print("请正确输入数字")
-
去除字符串两边的 空格、换行符、制表符,得到一个新字符串
msg = " H e ll o啊,树哥 " data = msg.strip() print(data) # 将msg两边的空白去掉,得到"H e ll o啊,树哥"
code = input("请输入4位验证码:") data = code.strip() if data == "FB87": print('验证码正确') else: print("验证码错误")
-
字符串变大写,得到一个新字符串
msg = "my name is oliver queen" data = msg.upper() print(data) # 输出为:MY NAME IS OLIVER QUEEN
# 案例 code = input("请输入4位验证码:") data = code.strip() value = data.upper() # value = code.strip().upper() if value == "FB87": print('验证码正确') else: print("验证码错误")
-
字符串变小写,得到一个新字符串
msg = "My Name Is Oliver Queen" data = msg.upper() print(data) # 输出为:my name is oliver queen
# 案例 code = input("请输入4位验证码:") value = code.strip().lower() if value == "fb87": print('验证码正确') else: print("验证码错误")
-
字符串内容替换,得到一个新的字符串
data = "你是个好人,但是好人不合适我" value = data.replace("好人","贱人") print(value) # "你是个贱人,但是贱人不合适我"
# 案例 video_file_name = "高清无码爱情动作片.mp4" new_file_name = video_file_name.replace("mp4","avi") final_file_name = new_file_name.replace("无码","步兵") print(final_file_name)
# 案例 content = input("请输入评论信息") content = content.replace("草","**") content = content.replace("泥马","***") print(content)
-
字符串切割,得到一个列表
data = "Jesse|root|moakey@qq.com" result = data.split('|') print(result) # 输出 ["Jesse","root","moakey@qq.com"] 根据特定字符切开之后保存在列表中,方便以后的操作
# 案例:判断用户名密码是否正确 info = "jesse|root" # 备注:字符串中存储了用户名和密码 user_list = info.split('|') # 得到一个包含了2个元素的列表 [ "jesse" , "root" ] user = input("请输入用户名:") pwd = input("请输入密码:") if user == user_list[0] and pwd == user_list[1]: print("登录成功") else: print("用户名或密码错误")
-
字符串拼接,得到一个新的字符串
data_list = ["中国","特朗普","小日本"] result = "干掉".join(data_list) print(result) # 输出:中国干掉特朗普干掉小日本(通过`干掉`把列表中的值拼接起来)
-
格式化字符串,得到新的字符串
name = "{0}的喜欢干很多行业,例如有:{1}、{2} 等" data = name.format("老王","护士","嫩模") print(data) # 老王的喜欢干很多行业,例如有:护士、嫩模 等
name = "{}的喜欢干很多行业,例如有:{}、{} 等" data = name.format("老王","护士","嫩模") print(data) # 老王的喜欢干很多行业,例如有:护士、嫩模 等
name = "{name}的喜欢干很多行业,例如有:{h1}、{h2} 等" data = name.format(name="老王",h1="护士",h2="嫩模") print(data) # 老王的喜欢干很多行业,例如有:护士、嫩模 等
3.3 转换为字符串
以后的python开发中经常的用是:数字 转 为字符串类型。
number = 888
data = str(number)
print(data)
3.4 转义字符
在需要在字符中使用特殊字符时,python 用反斜杠 ** 转义字符。如下表:
转义字符 | 描述 |
---|---|
(在行尾时) | 续行符 |
\ | 反斜杠符号 |
’ | 单引号 |
" | 双引号 |
\a | 响铃 |
\b | 退格(Backspace) |
\e | 转义 |
\000 | 空 |
\n | 换行 |
\v | 纵向制表符 |
\t | 横向制表符 |
\r | 回车 |
\f | 换页 |
\oyy | 八进制数,yy代表的字符,例如:\o12代表换行 |
\xyy | 十六进制数,yy代表的字符,例如:\x0a代表换行 |
\other | 其它的字符以普通格式输出 |
3.5 字符串的常见操作
序号 | 方法 | 描述 |
---|---|---|
1 | str.capitalize() | 将字符串首字母大写,其他小写 |
2 | str.center(width[, fillchar]) | 返回一个指定宽度width居中的字符串,fillchar为填充的字符,默认空格 |
3 | count(str,beg=0,end=len(string)) | 返回str在string里面出现的次数,如果beg或者end指定则返回指定范围内str出现的次数 |
4 | bytes.decode(encoding=“utf-8”,error=“strict”) | python3中没有decode方法,但我们可以使用bytes对象的decode()方法来解码给定的bytes对象,这个byte对象可以由str.encode()来编码返回 |
5 | encode(encoding=“UTF-8”,error=“strict”) | 以encoding指定的编码格式编码字符串,如果出错默认报一个ValueError的异常,除非errors指定的是ignore或者replace |
6 | endswith(suffix,beg=0,end=len(string)) | 检查字符串是否以obj结束,如果beg或者end指定则检查指定范围内是否以obj结束,如果是,返回True,否则返回False |
7 | expandtabs(tabsize=8) | 把字符串string中的tab符号转为空格,tab符号默认的空格数是8 |
8 | find(str,beg=0,end=len(string)) | 检测str是否包含在字符串中,如果指定范围beg和end,则检查是否包含在指定范围,如果包含就返回开始的索引值,否则返回-1 |
9 | index(str,beg=0,end=len(string)) | 同find()方法,只不过如果str不在字符串中会报一个异常 |
10 | isalnum() | 如果字符串中至少有一个字符并且所有字符都是字母或者数字则返回True,否则返回False |
11 | isalpha() | 如果字符串中至少有一个字符并且所有字符都是字母则返回True,否则返回False |
12 | isdigit() | 如果字符串只包含数字则返回True,否则返回False |
13 | islower() | 如果字符串中包含至少有一个区分大小写的字符,并且所有这些区分大小写的字符都是小写,则返回True,否则返回False |
14 | isnumeric() | 如果字符串中只包含数字字符,则返回True,否则返回False |
15 | isspace() | 如果字符串中只包含空白,则返回True,否则返回False |
16 | istitle() | 如果字符串是标题化的(见title()),则返回True,否则返回False |
17 | isupper() | 如果字符串中包含至少有一个区分大小写的字符,并且所有这些区分大小写的字符都是大写,则返回True,否则返回False |
18 | join(seq) | 以指定字符串作为分隔符,将seq中所有的元素(的字符串表示)合并为一个新的字符串 |
19 | len(string) | 返回字符串长度 |
20 | [ljust(width,fillchar)] | 返回一个元字符串左对齐,并使用fillchar填充至长度width的新字符串,fillchar默认为空格 |
21 | lower() | 转换字符串中所有大写字符为小写 |
22 | lstrip() | 返回截掉字符串左边的空格或指定字符后生成的新字符串 |
23 | maketrans() | 返回字符串转换后生成的新字符串 |
24 | max(str) | 返回字符串str中最大的字母 |
25 | min(str) | 返回字符串str中最小的字母 |
26 | [replace(old,new,max)] | 把将字符串中的str1替换成str2,如果max指定,则替换不超过max次 |
27 | rfind(str,beg=0,end=len(string)) | 类似于find()函数,不过是从右边开始查找 |
28 | rindex(str,beg=0,end=len(string)) | 类似于index()函数,不过是从右边开始查找 |
29 | str.rjust(width[, fillchar]) | 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串。如果指定的长度小于字符串的长度则返回原字符串 |
30 | rstrip() | 删除字符串末尾的空格 |
31 | split(str="",num=string.count(str)num=string.count(str)) | 以str为分隔符截取字符串,如果num有指定值,则仅截取num+1个子字符串 |
32 | str.splitlines([keepends]) | 返回一个包含各行作为元素的列表。keepends – 在输出结果里是否保留换行符(’\r’, ‘\r\n’, \n’),默认为 False,不包含换行符,如果为 True,则保留换行符。 |
33 | startwith(substr,beg=0,end=len(string)) | 检查字符串是否是以指定子字符串substr开头,是则返回True,否则返回False. |
34 | [strip(chars)] | 在字符串上执行lstrip()和rstrip() |
35 | swapcase() | 将字符串中大写转换为小写,小写转换为大写 |
36 | title() | 返回标题化的字符串,也就是所有单词都是大写开头,其余字母均小写,见istitle() |
37 | translate(table,deletechars="") | 根据str给出的表转换string的字符,要过滤掉的字符放到deletechars参数中 |
38 | upper() | 转换字符串中的小写字母为大写 |
39 | zfill(wifth) | 返回长度为width的字符串,原字符串右对齐,前面填充0 |
40 | isdecimal() | 检查字符串是否只包含十进制字符,如果是则返回True,否则返回False |
3.6 其他
字符串除了有上述那些字符串独有的功能以外,还有一个其他“公共的功能”,某些其他的类型也具有的功能。
-
获取字符串长度
name = "张三丰" name_length = len(name) print(name_length) # 输出:3
nickname = "jesse" length = len(nickname) print(length) # 输出:5
-
索引,获取字符串中某个字符的值。
name = "来做点py交易" print( name[0] ) # 输出 来 print( name[1] ) # 输出 做 print( name[6] ) # 输出 易 (默认索引是从0向后逐步向后增加,索引超出最大范围会报错) print( name[-1] ) # 输出 易 (如果索引为负值,则表示从后向前,-1表示最后一个) print( name[-3] ) # 输出 y print( name[len(name)-1]) # 输出 易
# 案例:循环字符串的所有字符 content = "长江以北晓峰最美山海关以外晓峰最帅" index = 0 while index < len(content): char = content[index] print(char) index += 1
# 案例:循环字符串的所有字符 content = "你瞅啥" index = -1 while index >= - len(content): char = content[index] print(char) index -= 1
-
切片,获取字符串中n连续的字符的值。
name = "你是风儿我是沙。不,我不是沙而是你爸" print( name[0:2] ) # 输出:你是 (根据索引 `前`按开区间 `后`按闭区间,即:前取后不取) print( name[2:5] ) # 输出:风儿我 [起始位置:结束位置:步长值] print( name[2:]) # 输出:风儿我是沙。不,我不是沙而是你爸(后面不写表示到最后) print( name[:6]) # 输出:你是风儿我是(前面不是表示从头开始) print( name[2:-1]) # 输出:风儿我是沙。不,我不是沙而是你 print( name[2:-2]) # 输出:风儿我是沙。不,我不是沙而是 print( name[0:len(name)]) # 输出:你是风儿我是沙。不,我不是沙而是你爸
-
步长,相当于我们生活中的跳步选择数据。
name = "生活不是电影,生活比电影苦" print( name[ 0:5:2 ] ) # 输出:生不电 【前两个值表示区间范围,最有一个值表示步长】 print( name[ :8:2 ] ) # 输出:生不电,活 【区间范围的前面不写则表示起始范围为0开始】 print( name[ 2::3 ] ) # 输出:不影活影 【区间范围的后面不写则表示结束范围为最后】 print( name[ ::2 ] ) # 输出:生不电,活电苦 【区间范围不写表示整个字符串】 print( name[ 8:1:-1 ] ) # 输出:活生,影电是不 【倒序】 print( name[ ::-1 ] ) # 输出:苦影电比活生,影电是不活生 【倒序】
-
for循环
想要循环显示字符串的每个字符,通过之前的 while循环 + 索引 可以实现,现在通过for循环则可以更方便的实现。
content = "三分天注定,七分靠滤镜"
for item in content:
print(item)
案例:判断用输入的值中有多少个字符 a(不区分大小写,即:A、a)
total_count = 0
content = input("请输入内容:")
for char in content:
if char.upper() == 'A':
total_count += 1
message = "您输入的内容中A/a共有{}个".format(total_count)
# 案例:break和continue也可以应用在for循环中
data = "像我这样优秀的人,本该灿烂过一生"
for item in data:
print(item)
if item == "人":
break
- 其他
print("hello\nchengdu") #使用反斜杠,实现转义字符的功能
print(r"hello\nchengdu") #在字符串前面加r,表示直接显示原始字符串,不进行转义