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

小编目前在做毕业设计,主题为“高考志愿信息交流平台”,面向高中生和大学生,辛苦各位读者大佬朋友们填下问卷,点击链接https://www.wjx.cn/jq/98944127.aspx或扫描二维码、微信小程序码均可,希望各位能提供一些调查数据,先在这里谢过各位了(*^_^*) 问卷1 问卷微信小程序码

一、小数保留指定位小数

1.%f 方法

1f = 1.23456 2f1 = '%.4f' % f 3f2 = '%.2f' % f 4print(f1,type(f1)) 5print(f2,type(f2))

打印

11.2346 <class 'str'> 21.23 <class 'str'>

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

2.format函数

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

打印

11.2346 <class 'str'> 21.23 <class 'str'>

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

3.round()函数

1a = 1.23456 2b = 2.355 3c = 3.5 4d = 2.5 5a1 = round(a, 3) 6b1 = round(b, 2) 7c1 = round(c) 8d1 = round(d) 9print(a1,type(a1)) 10print(b1,type(b1)) 11print(c1,type(c1)) 12print(d1,type(d1))

打印

11.235 <class 'float'> 22.35 <class 'float'> 34 <class 'int'> 42 <class 'int'>

可以看出,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.直接截断

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

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

二、判断变量的数据类型

1.type():

1a = 1.23 2print(type(a))

打印<class 'float'>

2.isinstance()

原型为isinstance(x, A_tuple)

1a = 1.23 2tp = isinstance(a,float) 3print(tp)

打印True

3.class.__name__属性

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

1num = 1.23 2 3print(num.__class__.__name__)

打印:

1float

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

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

1class Man: 2 id = 0 # 类变量 3 def __init__(self, name): 4 self.name = name 5 self.id = self.id_number() 6 7 @classmethod 8 def id_number(cls): 9 cls.id += 1 10 return cls.id 11 12a = Man('A') 13print(a.id) 14b = Man('B') 15print(b.id)

打印

11 22

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

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

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

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

1#name是包含中文的字符串,22是整个字符串一行的总长度,一般要顾及测试才能得到,\t后的x是一标记字符,可换为别的所需的字符串 2print('[{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.timedatetime.datetime对象做算术运算,且两个时间之间的差值单位也更加容易控制。 datetime.timedelta类的定义:

1class 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.mintimedelta(-999999999)
timedelta.maxtimedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999)
timedelta.resolutiontimedelta(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对象做加减操作
1>>> import datetime 2>>> 3>>> datetime.timedelta(365).total_seconds() # 一年包含的总秒数 431536000.0 5>>> dt = datetime.datetime.now() 6>>> dt + datetime.timedelta(3) # 3天后 7datetime.datetime(2020, 1, 22, 11, 17, 0, 214877) 8>>> dt + datetime.timedelta(-3) # 3天前 9datetime.datetime(2020, 1, 16, 11, 17, 0, 214877) 10>>> dt + datetime.timedelta(hours=3) # 3小时后 11datetime.datetime(2020, 1, 19, 14, 17, 0, 214877) 12>>> dt + datetime.timedelta(hours=-3) # 3小时前 13datetime.datetime(2020, 1, 19, 8, 17, 0, 214877) 14>>> dt + datetime.timedelta(hours=3, seconds=30) # 3小时30秒后 15datetime.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__"]属性即可,示意如下:

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

打印:

1异常内容: division by zero 2异常行数: 8 3异常文件: XXX/test.py

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

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

1text = """<div> 2<h1>Title</h1> 3<p>A long text........ </p> 4<a href=""> a link </a> 5</div>"""

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

1from bs4 import BeautifulSoup 2 3text = """<div> 4<h1>Title</h1> 5<p>A long text........ </p> 6<a href=""> a link </a> 7</div>""" 8 9clean_text = BeautifulSoup(text, "lxml").text 10print(clean_text)

打印:

1Title 2A long text........ 3 a link 4

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

本文原文首发来自博客专栏Python实战,由本人转发至https://www.helloworld.net/p/JxpioRhkoCbB,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/103019740查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

Web前端开发 HTML设计 经验与技巧总结

小编目前在做毕业设计,主题为“高考志愿信息交流平台”,面向高中生和大学生,辛苦各位读者大佬朋友们填下问卷,点击链接或扫描二维码、微信小程序码均可,希望各位能提供一些调查数据,先在这里谢过各位了(\\^_\^)1.限制input输入框只能输入纯数字、限制长度、默认显示文字加入oninput事件oninput"valuevalue

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''