这篇是一篇没有尽头的文章,每当过段时间,再次打开就会看到不一样的内容,有新东西在更新啊。是啊,之所以取名为高级用法,就是因为它是连载的,一个个有趣的知识点就像是一个个故事。每读一遍都有新的收获。
在定义数值字面量时,如果数字特别长可以通过插入_分隔符来让他变得更易读
# 格式化数值:在定义数值字面量时,如果数字特别长,可以通过插入_分隔符来变得更易读
# 以千为分隔单位,输出结果(num值为:10000)
num = 1_000_0
print(f'num值为:{num}')
# 输出结果
num值为:10000
布尔值的True和False这两个值可以直接当做1和0来使用,利用这个特点,最常用来简化统计总数操作。
# 统计列表中一共有多少个偶数
number = [1, 2, 3, 4, 5]
count = sum(i % 2 == 0 for i in number)
print(f'输出统计被2整除的总数:{count}')
浮点数是双精度,当计算浮点数时会出现补0的结果,可以使用decimal模块提供的方法代替普通浮点数做运算,它的结果不会损失精度。
# 使用浮点数进行计算时,结果显示一个近似值 0.30000000000000004,为了解决这个为题我们可以使用decimal.Decimal()模块提供的
# 方法做运算,他不会损失精度。
f1 = 0.1
f2 = 0.2
print(f'f1浮点数加上f2浮点数的和是:{f1}+{f2} =', f1 + f2)
from decimal import Decimal
# 注意 Decimal的参数必须是字符串类型,否则计算结果就会失效。
# 结果:0.3
print(f'使用decimal模块方法对浮点数做运算,计算结果为:', Decimal(str(f1)) + Decimal(str(f2)))
python语言有三种主要的字符串格式化方法
# C语言格式化风格
username, score = 'zhanghua', 18
print('C语言格式化风格: Welcome %s, you score is %d' % (username, score))
# str.format格式化风格
username, score = 'zhanghua', 18
print('str.format格式化风格:Welcome {}, you score is {:d}'.format(username, score))
# str.format通过索引重复使用同一个变量
username, score = 'zhanghua', 18
print('str.format重复使用变量方式:you are {0}? Yes I am {0}, you score is {1}'.format(username, score))
# f-string 格式化风格
username, score = 'zhanghua', 18
print(f'f-string格式化风格:Welcome {username}, you score is {score}')
假如要拼接字符串,首先创建一个空列表,然后把需要拼接的字符串都放假列表,最后调用str.join来拼接字符串
words = []
str = 'abcdefg'
for i in str:
words.append(i)
print('-'.join(words))
# 判断字符串是否只包含数字
only_str_contain_num = '123'
print(only_str_contain_num.isdigit())
str.partition(sep) 方法的功能是按照分隔符sep切分字符串,返回一个包含三个成员的数组(分隔符前的内容,分隔符,分隔符后的内容)。
# 假如将字符串按照分隔符:切分字符串,如果有冒号则输出冒号后面的值,如果没有则输出空。使用split方法需要判断是否有冒号,
# 使用split方法需要对参数做判断。
def extract_value(s: str):
item = s.split(':')
# 因为字符串不一定包含冒号,所以需要对字符串长度进行判断。
if len(item) == 2:
print(item[1])
else:
print('')
extract_value('name:zhangsan')
extract_value('name')
# 使用partition方法则一行就能完成任务,代码非常的优雅。
def extract_vale2(s: str):
# 当s包含分隔符:时,元组最后一个成员刚好是value
# 若是没有分隔符,最后一个字符串默认是空字符串
return s.partition(':')[-1]
print(extract_vale2('name : zhangsan'))
str.translate(table)方法可以按照规则一次性替换多个字符,比使用replace方法更简单。
# translate(table)方法一次性替换多个字符,比replace方法更简单
s = '这是中文,为什么要用英文符号.'
# 创建替换规则表
table = s.maketrans(',.', ',。')
print(s.translate(table))
# 使用replace需要两次才能替换完成。
s1 = s.replace(',', '-')
print(s1.replace('.', '!'))
字符串:字符串是给人看的,对应python中的str类型,str使用Unicode标准,可通过.encode()方法编码为字节串
字节串:二进制字符串是给机器看的,对应python的bytes类型。bytes一定包含某种字符串编码格式,默认为UTF-8,可通过.decode()方法解码为字符串。
# 字符串与字节串转换
str_obj = 'Hello 世界'
print('字符串', type(str_obj))
bin_str = str_obj.encode('UTF-8')
print('字节串', type(bin_str))
# 创建字面量字节串,只需要在字符串前加一个字母b做前缀
bin_obj = b'Hello'
print('定义字面量字节串:', bin_obj)
当代码中出现很多数字,且数字代表的意义不是数字本身而是其他的含义,比如1代表普通用户,2代表临时用户,3代表VIP用户,像这样的数字在代码中会让阅读代码的读者感觉晦涩难懂,没有可读性。
通常使用常量和枚举类代替数字,提升代码的可读性。下面举个常量和枚举类代替数字的例子。
使用常量和枚举类代替数字的好处:
def add_daily_points(user):
'''
用户每天完成第一次登录后,为其增加积分。这段代码用数字代表了不同的含义,
阅读这段代码的时候根本无法从数字中了解代码逻辑,阅读晦涩难懂。
:param user:
:return:
'''
# 代码中用数字表示不同类型的用户和不同类型的积分,无法从代码中看出它的含义,阅读代码晦涩难懂。这样的代码需要优化
if user.type == 13:
return
if user.type == 3:
user.points += 120
return
user.points += 100
return
'''
常量代表不同类型的积分,枚举类将不同类型的用户进行分类。
下面优化后的代码阅读起来简单易懂,提升了代码的阅读性。
'''
# python里没有真正的常量常量类型,一般把大写的字母全局变量当常量来用
# 用户每日奖励积分数量
DAILY_POINTS_REWARDS = 100
# VIP用户每日额外奖励分数
VIP_EXTRA_POINTS = 20
from enum import Enum
class UserType(int, Enum):
'''
在定义枚举类型时,如果同时继承基础类型,比如int,str 枚举类就能同时
充当该基础类型使用。比如这里UserType就当int使用。
'''
# VIP用户
VIP = 3
# 小黑屋用户
BANNED = 13
def add_daily_pointsd(user):
if user.type == UserType.BANNED:
return
if user.type == UserType.VIP:
user.points = DAILY_POINTS_REWARDS + VIP_EXTRA_POINTS
return
user.points = DAILY_POINTS_REWARDS
return
# 不必预计算字面量表达式,当我们需要用到复杂计算的数字字面量时,不需要提前计算出结果,保留整个算式即可。
def do_something(delta_seconds):
# 提前计算出11天是多少秒,这就是预计算字面量。对于读者来说并不知道这个数字是怎么来的,还需要加上注释。
if delta_seconds < 950400:
return
# 所以建议不必预计算字面量的值,下面是优化后的代码.当我们需要用到复杂计算的数字字面量时,请保留整个算式把。
# 这样做对性能没有任何影响,会让代码更易阅读。
if delta_seconds < 11 * 24 * 3600:
return