一、float类型的精度计算
1、我们可能会看到这样的奇景
def sum(self, number1: float, number2: float):
print(number1+number2)
if __name__ == "__main__":
sum(0.1,0.2)
输出结果为:0.30000000000000004
原因是计算机对浮点精度处理的问题,解决方式如下,使用decimal
特别注意,decimal必须使用字符串来表示数字
from decimal import Decimal
def sum1(self, number1: float, number2: float):
print(Decimal(str(number1))+Decimal(str(number2)))
if __name__ == "__main__":
sum1(0.1,0.2)
输出结果:0.3
二、布尔值也是数字
我们现在打印一下布尔值
print(int(True))
print(int(False))
print(True+1)
1
0
2
我们现在看下面典型例子,求一个列表里的偶数有多少个,我们通常会这样写
numbers = [1,4,5,6,8]
count = 0
for number in numbers:
if number%2==0:
count = count+1
print("偶数个数是{}".format(str(count)))
偶数个数是3
知道了布尔值的属性我们就可以一句话
numbers = [1, 4, 5, 6, 8]
count = sum(number % 2 == 0 for number in numbers)
#遍历numbers数组,然后number%2会返回一个布尔值,0或1,然后将这些值用sum求和
print("偶数个数是{}".format(str(count)))
偶数个数是3
三、字符串格式化操作
1、两种返转字符串的操作
sentence = "hello world"
print(sentence[::-1])
print("".join(reversed(sentence)))
dlrow olleh
dlrow olleh
2 、几种格式化字符串的方式
student_name,score = "明明",80
print("学生的名子是{},学生的分数是{}".format(student_name,score))
print("{0}的名子是:{0},年纪是{1}".format(student_name,score))
print(f"学生的名子是{student_name},学生的分数是{score}")
学生的名子是明明,学生的分数是80
明明的名子是:明明,年纪是80
学生的名子是明明,学生的分数是80
student_name = "明明"
print("{:>20},你好".format(student_name)) #靠右对齐,不足的补空格,一共20个字符
print("{:20},你好".format(student_name))#靠左对齐,不足的补空格,一共20个字符
print(f"{student_name:>20},你好")#靠右对齐,不足的补空格,一共20个字符
print(f"{student_name:20},你好")#靠左对齐,不足的补空格,一共20个字符
明明,你好
明明 ,你好
明明,你好
明明 ,你好
我们在测试用例id的设计中,经常会有00032这样的字样
number = 23
print(str(number).zfill(5)) #总共5位字符,不足的前面补零
print("index_{}".format(str(number).zfill(5)))
00023
index_00023
三、几种不常用但特别好用的字符串方法
1、判断一个字符串中,是否只包含数字
def is_only_contain_digit(data:str):
print(data.isdigit())
if __name__ == '__main__':
is_only_contain_digit("134")
is_only_contain_digit("1324jkjls")
True
False
2。split和partition
split:将字符串按某个特定字符分开,返回一组列表
partition:将字符串按某他特定字符分开,返回一个元组,元组内容是(分隔前内容,分隔符,分隔后内容)
这两个看上去没什么差别,有些情况就不一样了。例如
我们有如下需求
我有一个字符串,我可能会向里传如下字符串
1、你好:朋友
2、你好
我要取按 : 分隔后的第二个字符串
(1)看一下split怎么实现
def divide_sentences_by_split(sentence:str):
results = sentence.split(":")
if len(results) ==2: #加一步判断
print(results[-1])
else:
print("")
if __name__ == "__main__":
divide_sentences_by_split("你好:朋友") #输出 你好
divide_sentences_by_split("你好") #输出 “”
(2)看一下partition
def divide_sentences_by_partition(sentence:str):
results = sentence.partition(":")
print(results[-1])
if __name__ == "__main__":
divide_sentences_by_partition("你好:朋友") #输出朋友
divide_sentences_by_partition("你好") #输出空,因为partition没有找到分隔符,最后一个成员某认是空字符串
3、字符串的连续替换 translate
如果有一个字符串:”你是一个爸爸,还是一个妈妈“,我现在要把”爸爸“换成”儿子“,”妈妈“换成”女儿“
你一般是不是会这么做
sentence = "你明明是中国字,还有英文的标点."
result = sentence.replace(",",",").replace(".","。")
print(result)
你明明是中国字,还有英文的标点。
那我要是替换得多了呢,那你就会看到replace排长龙的奇景,那有没有方式代替呢
sentence = "你明明是中国字,还有英文的标点."
table = sentence.maketrans(',.',",。") #先创建一个替换规则表
result = sentence.translate(table) #换规则表替换
print(result)
你明明是中国字,还有英文的标点。
但是这种方式有一个缺点
sentence.maketrans 的规则定义只能一个字符对应一个字符,如果按汉字就会有这样的错误
sentence = "你是爸爸还是妈妈"
result = sentence.replace("爸爸","儿子").replace("妈妈","女儿")
print(result)
sentence = "你是爸爸还是妈妈"
table = sentence.maketrans('爸爸妈妈',"女儿儿子")
result = sentence.translate(table)
print(result)
你是儿子还是女儿
你是儿儿还是子子
所以想好再用
4、dedent()
看一段代码和输出
def demo1():
message = '''
welcome .today:
-jaw
-the
-saw
'''
print(message)
def demo2():
message = dedent('''
welcome .today:
-jaw
-the
-saw
''')
print(message)
if __name__ == '__main__':
demo1()
demo2()
输出:
welcome .today:
-jaw
-the
-saw
welcome .today:
-jaw
-the
-saw
dedent 可以删除整段字符串的左边的空白锁进,看起来整段内容更好看
5、split和rsplit
split 是正向切割
rsplit 是反向切割
比如说我们有一个记录 ”this is a log 2021-03-06“ ,我想把日志内容和日期分开
line = "this is a log 2021-03-06"
items = line.split(" ")
message = " ".join(items[:-1]) #有于空格很多,我们还得搞一个连接的过程
date = items[-1]
print(message)
print(date)
this is a log
2021-03-06
我们用反向切割看一下
line = "this is a log 2021-03-06"
items = line.rsplit(" ",maxsplit=1) #表示只切割一次
message = items[0]
data = items[1]
print(message)
print(date)
this is a log
2021-03-06
这样是不是更简单