字符串、整型与浮点类型

浏览 1895

课文

字符串的索引

我们在之前已经接触过字符串,它在 python 是str类型。现在让我我们来更深入地了解一下。

一个字符串是一系列字符的组合,因此我们可以通过方括号操作符号加上序号来获取单个字符。

words = '小明爱吃瓜'
print(words[1])

咦,第一个字符不是吗?为什么这里打印了,我的 python 坏掉了吗?

你的 python 没有坏掉,因为在绝大多数包括 python 的程序语言中,计数都是从 0 开始的。

image

这意味着我们使用序号0才能拿到字。

words = '小明爱吃瓜'
print(words[1])

我们取最后一个字符岂不是要先数下字符串有多少个字符,如果字符串是一篇论文,我们不是要数到脑壳疼?

这样子的话让 python 帮我们数吧,内建的len函数可以帮我们数出字符串的长度。由于序号从 0 开始,长度减 1 就是我们最后一个字符的序号。

words = '小明爱吃瓜'
length = len(words)
print('长度:', length)
print('最后一个元素是:', words[length-1])
长度: 5
最后一个元素是: 瓜

拿最后一个字符除了数长度之外我们还有更好的办法,就是用 -1 作为序号。

因为 python 里同时有另一种取值方式,那就是 -1 作为最后一个元素的序号,往前逐个递减。

image

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 时返回结果为空字符串,当 ab 都置空时返回当前字符串的拷贝对象。

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 类型进行保存。

我们还需要一些类型,来表示我们的体重、年龄、商品的价格等数据,并且能对他们进行数学上的运算。这时就需要intfloat类型。为什么需要定义两种类型呢?

因为对于 int(整型)的数据,它可以用来表达次数的概念。我去了两次北京,而不能说我去了 2.5 次北京。因此在使用上整数与带小数的数字必须有所区分,所以把数字分成 intfloat两个类型。

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

回复

共 2 条
  • 1
前往
  • 1