python 数值和字符串的一些进阶操作

一、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

这样是不是更简单

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值