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

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

一、小数保留指定位小数

1.%f 方法

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

打印

1.2346 <class 'str'>
1.23 <class 'str'>

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

2.format函数

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

打印

1.2346 <class 'str'>
1.23 <class 'str'>

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

3.round()函数

a = 1.23456
b = 2.355
c = 3.5
d = 2.5
a1 = 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 <class 'float'>
2.35 <class 'float'>
4 <class 'int'>
2 <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.直接截断

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

打印1.234

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

二、判断变量的数据类型

1.type():

a = 1.23
print(type(a))

打印<class 'float'>

2.isinstance()

原型为isinstance(x, A_tuple)

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

打印True

3.class.__name__属性

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

num = 1.23
print(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)

打印

1
2

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

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

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

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

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

五、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]

类属性

image.png

实例方法和属性

image.png

image.png

>>> 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运行抛出异常并接收到之后需要显示异常的具体信息,包括异常内容、异常所在的行数和异常所在的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()

打印:

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

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

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

text = """<div>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</div>"""

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

from bs4 import BeautifulSoup
text = """<div>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</div>"""
clean_text = BeautifulSoup(text, "lxml").text
print(clean_text)

打印:

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

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

相关文章
|
10天前
|
存储 数据挖掘 开发者
Python编程入门:从零到英雄
在这篇文章中,我们将一起踏上Python编程的奇幻之旅。无论你是编程新手,还是希望拓展技能的开发者,本教程都将为你提供一条清晰的道路,引导你从基础语法走向实际应用。通过精心设计的代码示例和练习,你将学会如何用Python解决实际问题,并准备好迎接更复杂的编程挑战。让我们一起探索这个强大的语言,开启你的编程生涯吧!
|
16天前
|
存储 数据库连接 API
Python环境变量在开发和运行Python应用程序时起着重要的作用
Python环境变量在开发和运行Python应用程序时起着重要的作用
61 15
|
16天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
16天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
16天前
|
存储 Python
Python编程入门:打造你的第一个程序
【10月更文挑战第39天】在数字时代的浪潮中,掌握编程技能如同掌握了一门新时代的语言。本文将引导你步入Python编程的奇妙世界,从零基础出发,一步步构建你的第一个程序。我们将探索编程的基本概念,通过简单示例理解变量、数据类型和控制结构,最终实现一个简单的猜数字游戏。这不仅是一段代码的旅程,更是逻辑思维和问题解决能力的锻炼之旅。准备好了吗?让我们开始吧!
|
3天前
|
Python
Python编程入门:从零开始的代码旅程
本文是一篇针对Python编程初学者的入门指南,将介绍Python的基本语法、数据类型、控制结构以及函数等概念。文章旨在帮助读者快速掌握Python编程的基础知识,并能够编写简单的Python程序。通过本文的学习,读者将能够理解Python代码的基本结构和逻辑,为进一步深入学习打下坚实的基础。
|
7天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
10天前
|
存储 人工智能 数据挖掘
Python编程入门:打造你的第一个程序
本文旨在为初学者提供Python编程的初步指导,通过介绍Python语言的基础概念、开发环境的搭建以及一个简单的代码示例,帮助读者快速入门。文章将引导你理解编程思维,学会如何编写、运行和调试Python代码,从而开启编程之旅。
34 2
|
11天前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
24 1
|
18天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####