字符串、整型与浮点类型
浏览 2517
课文
字符串的索引
我们在之前已经接触过字符串,它在 python 是str
类型。现在让我我们来更深入地了解一下。
一个字符串是一系列字符的组合,因此我们可以通过方括号
操作符号加上序号来获取单个字符。
words = '小明爱吃瓜'
print(words[1])
明
咦,第一个字符不是小
吗?为什么这里打印了明
,我的 python 坏掉了吗?
你的 python 没有坏掉,因为在绝大多数包括 python 的程序语言中,计数都是从 0
开始的。
这意味着我们使用序号0
才能拿到小
字。
words = '小明爱吃瓜'
print(words[1])
明
我们取最后一个字符岂不是要先数下字符串有多少个字符,如果字符串是一篇论文,我们不是要数到脑壳疼?
这样子的话让 python 帮我们数吧,内建的len
函数可以帮我们数出字符串的长度。由于序号从 0 开始,长度减 1 就是我们最后一个字符的序号。
words = '小明爱吃瓜'
length = len(words)
print('长度:', length)
print('最后一个元素是:', words[length-1])
长度: 5
最后一个元素是: 瓜
拿最后一个字符除了数长度之外我们还有更好的办法,就是用 -1
作为序号。
因为 python 里同时有另一种取值方式,那就是 -1 作为最后一个元素的序号,往前逐个递减。
words = '小明爱吃瓜'
print('最后一个元素是:', words[-1])
最后一个元素是: 瓜
字符串切片
字符串中的一部分叫作切片,例如"爱吃"
相对于"小明爱吃瓜"
。我们同样可以用方括号操作符去获取字符串的切片, 获取方式为 [a:b]
。其中 a
为起始序号,b
为结束序号。
注意的是获取的切片包含 a
不包含 b
。
例如要获取"爱吃"
。
words = '小明爱吃瓜'
sliced = words[2:4]
print(sliced)
爱吃
当我们将 a
置为空时,切片结果为 b
之前不包含 b
的所有字符。当我们将 b
置为空时,切片的结果就为 a
之后并包含 a
的所有字符。
words = '小明爱吃瓜'
print(words[:4])
print(words[2:])
小明爱吃
爱吃瓜
当 a
等于 b
时返回结果为空字符串,当 a
与 b
都置空时返回当前字符串的拷贝对象。
words = '小明爱吃瓜'
print(words[2:2])
print(words[:])
输出
小明爱吃瓜
in 操作符
in
操作符可以左右各接收一个字符串,判断左边的字符串是否被包含在右边的字符串中,返回结果是一个 bool
对象。
words = '小明爱吃瓜'
print('小明' in words)
print('小红' in words)
输出
True
False
字符串相关函数
我们依旧可以用dir
查看字符串中有哪些可用的函数,并且使用 help
查看其帮助文档。
words = '小明爱吃瓜'
print(dir(words))
print(help(words.upper))
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Help on built-in function upper:
upper() method of builtins.str instance
Return a copy of the string converted to uppercase.
我们介绍几个常用的方法。首先是upper
,将字符串的字母转换成大写。
words = 'happy'
print(words.upper())
HAPPY
很显示,对应的 lower
就是小写。
words = 'HAPPY'
print(words.lower())
happy
isdigit
的用法是判断字符串是否是书面意思上的数字。
words = '10'
print(words.isdigit())
words = '10ab'
print(words.isdigit())
help(str.isdigit)
True
False
Help on method_descriptor:
isdigit(self, /)
Return True if the string is a digit string, False otherwise.
A string is a digit string if all characters in the string are digits and there
is at least one character in the string.
很多内置函数的学习可以用 help
函数去查看和了解。建议同学们可以经常使用,这里就不过多赘述了。
字符串的格式化
python 中格式化字符串的方法挺多,而且很多都大同小异,可以按照自己的习惯来选择性掌握。
% 格式符
result = '%s同学,现在已经%d点了。' % ('小明', 10)
print(result)
小明同学,现在已经10点了。
这种方法是在字符串中置入占位符也就是 %类型码
,然后用 %
格式符号接一个元组的形式完成格式化,元组的长度应该与字符串中的 %类型码
的数量一致,此时会按顺序替换字符串中的占位符。
以下列出几种常用的类型码:
- %s:字符串
- %c:单个字符
- %b:二进制整数
- %o:八进制整数
- %d:十进制整数
- %x:十六进制整数
- %f:浮点数
- %%:输出
%
本身
有关类型码有很多高阶的写法,在入门阶段不宜过多深入介绍,可以参考文档 https://docs.python.org/zh-cn/3/library/string.html
比如日常需要随机一个4位的数字验证码,当随机出来的数字不足4位时,则需要在前面补 0,用类型码则可以很方便地实现。
# 随机字符串
ran_1 = 12
# 随机字符串
ran_2 = 456
print('您的注册验证码是:%04d' % ran_1)
print('您的登录验证码是:%(ran)04d' % {'ran': ran_2})
您的注册验证码是:0012
您的登录验证码是:0456
当然我们也可以用字典,来使用字符串格式化更形象。
result = '%(name)s同学,现在已经%(hour)d点了。' % {'hour': 10, 'name': '小明'}
print(result)
小明同学,现在已经10点了。
format 方法
format 与 % 格式符挺类似,不过在使用上显得更规范。
首先是顺序格式化的方式。
result = '{}同学,现在已经{}点了。'.format('小明', 10)
print(result)
小明同学,现在已经10点了。
或者通过 {索引}
的形式。
result = '{0}同学,现在已经{1}点了。是吧{0}同学?'.format('小明', 10)
print(result)
小明同学,现在已经10点了。是吧小明同学?
当然类型码与格式化也是不可少的。
# 随机字符串
ran_1 = 12
# 随机字符串
ran_2 = 456
print('您的注册验证码是:{:04d}'.format(ran_1))
print('您的登录验证码是:{ran:04d}'.format(ran=ran_2))
您的注册验证码是:0012
您的登录验证码是:0456
字符串插值
使用插值的方式可以使代码更简洁,可以使我们直接在字符串中插入变量或表达式。
# 随机字符串
ran_1 = 12
# 随机字符串
ran_2 = 400
print(f'您的注册验证码是:{ran_1:04d}')
print(f'您的登录验证码是:{ran_2 + 66 :04d}')
您的注册验证码是:0012
您的登录验证码是:0466
Template类
Template 与 format 有点类似。
from string import Template
template = Template('${name}同学,现在已经${hour}点了。')
print(template.substitute(name='小明', hour='10'))
小明同学,现在已经10点了。
数字类型
常见的数字类型包括 int
(整型)和 float
(浮点型)。在之前我们已经用 str
类型来表示我们生活中的一些常见内容了,比如姓名、地址、小说等我们都用 str
类型进行保存。
我们还需要一些类型,来表示我们的体重、年龄、商品的价格等数据,并且能对他们进行数学上的运算。这时就需要int
和 float
类型。为什么需要定义两种类型呢?
因为对于 int
(整型)的数据,它可以用来表达次数的概念。我去了两次北京,而不能说我去了 2.5 次北京。因此在使用上整数与带小数的数字必须有所区分,所以把数字分成 int
与 float
两个类型。
int 整型
当我们给变量赋值一个不带小数点的数字时,这个变量就默认为int
(整型)。
n = 12
print(type(n))
<class 'int'>
注意,两个整型经过除法运算后,不管结果是不是意义上的整数,其都为 float
(浮点型)。
n = 4 / 2
print(type(n))
<class 'float'>
有个整除运算符 //
能只保留整数部分,并且返回 int
类型。
n = 5 // 2
print(n)
print(type(n))
2
<class 'int'>
很多时候我们接收用户输入的数字时,返回的是一个字符串类型。
比如
n = input('请输入数字:')
print(n / 2)
请输入数字:6
TypeError: unsupported operand type(s) for /: 'str' and 'int'
此时是无法进行数学运算的, 必须得先用 int()
方法将其进行类型转换。
n = input('请输入数字:')
n = int(n)
print(n / 2)
请输入数字:6
3
float 浮点型
一个数字只有带有 .
都为浮点型。
f1 = 1.5
f2 = 1.
f3 = .5
print(f1, type(f1))
print(f2, type(f2))
print(f3, type(f3))
1.5 <class 'float'>
1.0 <class 'float'>
0.5 <class 'float'>
同理我们接收用户输入的浮点类型时,也必须先用 float()
进行类型转换。
f = input('请输入小数:')
f = float(f)
print(f * 2)
请输入小数:12.2
24.4
实战
1.定义姓名、年龄、身高三个变量来保存关于你自身的数据,你能说出他们分别属于什么类型吗?
2.打印出你姓名中的姓,假设你是慕容XX
复姓的话又该如何?
解析
1.定义姓名、年龄、身高三个变量来保存关于你自身的数据,你能说出他们分别属于什么类型吗?
name = '小明'
age = 18
height = 1.8
print('name 的类型是:', type(name))
print('age 的类型是:', type(age))
print('height 的类型是:', type(height))
name 的类型是: <class 'str'>
age 的类型是: <class 'int'>
height 的类型是: <class 'float'>
2.打印出你姓名中的姓,假设你是慕容XX
复姓的话又该如何?
name = '王小明'
print('姓:', name[0])
name = '慕容小明'
print('姓:', name[:2])
姓: 王
姓: 慕容
舟
2021-04-05
西瓜lalavilaxxww
2021-04-06