Python 编程开发 实用经验和技巧大放送

Python 编程开发 实用经验和技巧大放送

文章目录

  • 一、小数保留指定位小数
    • 1.%f 方法
    • 2.format函数
    • 3.round()函数
    • 4.直接截断
  • 二、判断变量的数据类型
    • 1.type():
    • 2.isinstance()
    • 3.__class__.__name__属性
  • 三、Python中的类方法(@classmethod)
  • 四、str.format与制表符t设置中文对齐
  • 五、datetime模块timedelta类的使用
  • 六、获取抛出的异常具体信息
  • 七、使用BeautifulSoup库去掉字符串中的HTML标签

(免费学习推荐:python视频教程

一、小数保留指定位小数

1.%f 方法

f = 1.23456f1 = '%.4f' % f
f2 = '%.2f' % fprint(f1,type(f1))print(f2,type(f2))

打印

1.2346 1.23 

易知,这种方法会进行四舍五入,但是将浮点型转化成了字符串值,已不再是原始的数值。

2.format函数

f = 1.23456f1 = format(f,'.4f')f2 = format(f,'.2f')print(f1,type(f1))print(f2,type(f2))

打印

1.2346 1.23 

同理,这种方法也会进行四舍五入,但是将浮点型转化成了字符串值,已不再是原始的数值。

3.round()函数

a = 1.23456b = 2.355c = 3.5d = 2.5a1 = round(a, 3)b1 = round(b, 2)c1 = round(c)d1 = round(d)print(a1,type(a1))print(b1,type(b1))print(c1,type(c1))print(d1,type(d1))

打印

1.235 2.35 4 2 

可以看出,round()函数最后得到的是数值(浮点型或整型),但是在“舍”和“入”的规律上不一定:
(1)round(x,n)函数中,是否进位或四舍五入,取决于n位以及n+1位小数的值
(2)只有当n+1位数字是5的时候,容易混淆,如果n为偶数,则n+1位数是5,则进位,例如round(1.23456,3)最终变为1.235
(3)如果n为奇数,则n+1位是数5,那不进位,例如round(2.355,2),最终为2.35
(4)如果n为0,即没有填写n的时候,最终结果与上面相反,即整数部分为偶数的时候,小数位5不进位,例如(round(2.5)变为2)。
(5)整数部分为奇数的时候,小数位5进位。(round(3.5)变为4)

4.直接截断

a = int(1.23456 * 1000) / 1000print(a)

打印1.234
这种方法简单粗暴,直接去掉后边的,不管是否大于5。

二、判断变量的数据类型

1.type():

a = 1.23print(type(a))

打印。

2.isinstance()

原型为isinstance(x, A_tuple),

a = 1.23tp = isinstance(a,float)print(tp)

打印True。

3.class.__name__属性

使用变量的__class__.__name__属性 ,这也是type()方法的实质:

num = 1.23print(num.__class__.__name__)

打印:

float

三、Python中的类方法(@classmethod)

python做面向对象编程的时候,经常需要使用classmethod类方法,这并不是类中的方法。
类方法也算一种实用的技巧,简单描述之:“类方法让类模板具有记忆力”。
类模板就是我们所定义的类。在普通情况下,不使用类方法对类进行实例化,类本身是不具有记忆性的。只是当一个静态模板被套用多次而已。如果我们想让类在每一次实例化之后,都能记载一些记忆,会对很多操作很有用。

class Man:
    id = 0 # 类变量
    def __init__(self, name):
        self.name = name
        self.id = self.id_number()
 
    @classmethod
    def id_number(cls):
        cls.id += 1
        return cls.id
 a = Man('A')print(a.id)b = Man('B')print(b.id)

打印

12

对Man这个类进行实例化2次,每个实例的id都不一样。这就依靠类方法来实现了:首先,用@classmethod描述类方法,然后用"cls"代表本类。类方法对类属性进行的处理是有记忆性的。

需要注意的是,类方法处理的变量一定要是类变量。因为在类方法里你用不了self来寻址实例变量,所以需要把类变量放到最前面描述,如上面的"id=0"所示。类变量是可以被self访问的,所以,在类变量定义好了以后,不需要在_init_函数里对类变量再一次描述。所以,上面代码里self.id不一定需要。

四、str.format与制表符t设置中文对齐

str.format对字符串进行格式化,{:x}为右对齐,{:^x}为居中),少于x位自动补齐(默认为空格补齐),但是对于中文字符并不能很好地支持,所以会导致有多行中文字符串时出现不能对齐的现象,需要考虑到字符串所占长度并将中文字符串进行编码后再计算。

#name是包含中文的字符串,22是整个字符串一行的总长度,一般要顾及测试才能得到,t后的x是一标记字符,可换为别的所需的字符串print('[{string:<{len}}tx'.format(string=string+']',len=22-len(string.encode('GBK'))+len(string)))

具体可参考https://blog.csdn.net/excaliburrr/article/details/76794451

五、datetime模块timedelta类的使用

timedelta对象表示两个不同时间之间的差值, 这个差值的单位可以是:天、秒、微秒、毫秒、分钟、小时、周。
如果使用time模块对时间进行算术运算,只能将字符串格式的时间和struct_time格式的时间对象先转换为时间戳格式,然后对该时间戳加上或减去n秒,最后再转换回struct_time格式或字符串格式,这显然很不方便。而datetime模块提供的timedelta类可以让我们很方面的对datetime.date, datetime.time和datetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。
datetime.timedelta类的定义:

class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)

所有参数都是默认参数,因此都是可选参数。参数的值可以是整数或浮点数,也可以是正数或负数。内部值存储days、seconds 和 microseconds,其他所有参数都将被转换成这3个单位:

  • 1毫秒转换为1000微秒
  • 1分钟转换为60秒
  • 1小时转换为3600秒
  • 1周转换为7天

然后对这3个值进行标准化,使得它们的表示是唯一的:

  • microseconds : [0, 999999]
  • seconds : [0, 86399]
  • days : [-999999999, 999999999]

类属性

类属性名称 描述

timedelta.min
timedelta(-999999999)

timedelta.max
timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)

timedelta.resolution
timedelta(microseconds=1)

实例方法和属性

实例方法/属性名称 描述

td.days
天 [-999999999, 999999999]

td.seconds
秒 [0, 86399]

td.microseconds
微秒 [0, 999999]

td.total_seconds()
时间差中包含的总秒数,等价于: td / timedelta(seconds=1)

方法/属性 描述

datetime.datetime.now()
返回当前本地时间(datetime.datetime对象实例)

datetime.datetime.fromtimestamp(timestamp)
返回指定时间戳对应的时间(datetime.datetime对象实例)

datetime.timedelta()
返回一个时间间隔对象,可以直接与datetime.datetime对象做加减操作

>>> import datetime>>>>>> datetime.timedelta(365).total_seconds() # 一年包含的总秒数31536000.0>>> dt = datetime.datetime.now()>>> dt + datetime.timedelta(3) # 3天后datetime.datetime(2020, 1, 22, 11, 17, 0, 214877)>>> dt + datetime.timedelta(-3) # 3天前datetime.datetime(2020, 1, 16, 11, 17, 0, 214877)>>> dt + datetime.timedelta(hours=3) # 3小时后datetime.datetime(2020, 1, 19, 14, 17, 0, 214877)>>> dt + datetime.timedelta(hours=-3) # 3小时前datetime.datetime(2020, 1, 19, 8, 17, 0, 214877)>>> dt + datetime.timedelta(hours=3, seconds=30) # 3小时30秒后 datetime.datetime(2020, 1, 19, 14, 17, 30, 214877)

更多关于Python对日期、时间的处理可参考https://www.jb51.net/article/105840.htm。

六、获取抛出的异常具体信息

很多时候,在Python运行抛出异常并接收到之后需要显示异常的具体信息,包括异常内容、异常所在的行数和异常所在的Python文件等等,分别使用args[0]、__traceback__.tb_lineno和__traceback__.tb_frame.f_globals["__file__"]属性即可,示意如下:

def get_exception_info():
    try:
        s = 2 / 0
    except Exception as e:
        print('异常内容:', e.args[0])
        print('异常行数:', e.__traceback__.tb_lineno)
        print('异常文件:', e.__traceback__.tb_frame.f_globals["__file__"])get_exception_info()

打印:

异常内容: pision by zero
异常行数: 8异常文件: XXX/test.py

七、使用BeautifulSoup库去掉字符串中的HTML标签

有时候,字符串中含有HTML标签,如

text = """

Title

A long text........

a link

"""

需要得到'nTitlenA long text........ n a link n',可以使用正则表达式匹配,但是稍嫌麻烦,此时可以直接使用BeautifulSoup库进行转化,更加简单,如下:

from bs4 import BeautifulSoup

text = """

Title

A long text........

a link

"""clean_text = BeautifulSoup(text, "lxml").textprint(clean_text)

打印:

Title
A long text........ 
 a link

显然,此时已经去掉了字符串中的HTML标签。

相关免费学习推荐:python教程(视频)

以上就是Python 编程开发 实用经验和技巧大放送的详细内容,更多请关注昆居客【www.kunjuke.com】。

相关推荐:

我的世界指令如何获得经验

我的世界用指令获得经验的方法是:输入/XP 10000 myword就可以获得经验了,/xp后面的数字代表了经验数量,你想要多少经验就输入多少数字,非常的简单。 详细答案: 我的世界用指令获得经验的方法是:输入/XP 10000 myword就可以获得经验了,/xp后面的数字代表了经验数量,你想要多少经验就输入多少数字,非常的简单。 进入后,按回车键打开聊天框。 打开后,输入/xp。 然后输入一个...

《真魂修仙》经验本挑战玩法

真魂修仙怎么快速获取经验,通关经验剑家,可获得海量经验,迅速提升角色等级。挑战经验剑家时,还可额外获得20%经验加成,收益更上一层楼,副本期间若意外掉线,无需担心。系统将自动协助通关,并将剩余的经验奖励通过邮件发放,离线也有收益。 《真魂修仙》经验本挑战玩法: 一、开启方式 主界面【日常】-【副本】-【单人副本】-【经验本】进入 二、玩法介绍 灵境洞开,神兵有灵。挑战装备灵境,海量经验等你来取,助...

零基础小白靠QoderWake做自媒体:从0到1的实战经验分享

零基础小白可通过QoderWake四步开启自媒体:一注册激活并配置原创声明与同步开关;二用AI模板按序填充三段素材并加字幕;三发布时勾选扶持计划、精准打标并人工触发播放与提问评论;四24小时后调取日志解析stage值判断推荐状态。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果您是零基础小白,希望借助QoderWake平台开启自媒体创作...
· AI · 240833

WorkBuddy怎么用来做员工的知识沉淀和经验共享?

WorkBuddy通过五步实现员工知识沉淀与共享:一、自动归集本地多格式文件构建个人知识库;二、注入身份与场景上下文绑定知识适用性;三、将标准化操作封装为可复用Skill技能包;四、接入ima平台实现跨角色秒级调用与可信溯源;五、调度多Agent协同生成结构化经验文档。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜ 如果企业员工在日常工作中...

《farever》战士经验速刷点位分享

《farever》中的战士经验想要刷难度是很大的,需要找到一个合适的点位,而想要快速刷战士经验可以去恩里皮特之巅那里,到地方之后使用花炮台弹射到附近的城堡要塞那里,进去之后不要打,先聚怪。 farever战士经验怎么快速刷 本文内容来源于互联网,如有侵权请联系删除。

如何在Python中为测试用例添加自定义标记_通过pytest.mark进行分类执行

pytest.mark 必须作为装饰器直接作用于测试函数或类,不可写在函数外部;可叠加多个标记,执行时用 -m "mark1 and mark2" 等布尔表达式筛选;未注册标记会触发警告,需在 pytest.ini 或 pyproject.toml 中声明以避免。 pytest.mark 能不能直接用在函数外面 不能。所有 pytest.mark 必须装饰在测试函数或类上,写在函数定义之外会报 S...
· Python · 175908

如何在Python中构建树状结构的递归生成器_使用yield from简化递归代码

yield from 在树遍历中省去了手动展开子生成器的繁琐与风险,自动处理委托调用、异常传播、StopIteration 捕获及协程方法转发,确保扁平化输出和行为一致性。 yield from 在树遍历中到底省了什么 直接说结论:yield from 不是语法糖,它把递归生成器的“委托调用”从手动循环 + yield 拆解成一条语句,避免了中间迭代器被提前耗尽、异常传播断裂、或 StopIter...
· Python · 48358

如何解决Python中的UnboundLocalError局部变量引用错误_使用global或nonlocal关键字声明

Python函数内同名变量报UnboundLocalError,因编译期将赋值变量标记为局部,读取在赋值前则出错;global用于模块级变量,nonlocal用于最近外层函数变量,二者不可混用且需提前声明。 为什么在函数里修改同名变量会报 UnboundLocalError Python 在编译函数时,只要看到某个变量在函数体内有赋值操作(哪怕只在 if 分支里),就会把它标记为局部变量。之后如果...
· Python · 4051