首頁 > 後端開發 > Python教學 > Python 程式設計開發 實用經驗與技巧大放異彩

Python 程式設計開發 實用經驗與技巧大放異彩

coldplay.xixi
發布: 2021-03-23 11:27:25
轉載
2970 人瀏覽過

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 <class &#39;str&#39;>1.23 <class &#39;str&#39;>
登入後複製
登入後複製

易知,這種方法會進行四捨五入,但是將浮點型轉換成了字串值,已不再是原始的數值。

2.format函數

f = 1.23456f1 = format(f,'.4f')f2 = format(f,'.2f')print(f1,type(f1))print(f2,type(f2))
登入後複製
列印

1.2346 <class &#39;str&#39;>1.23 <class &#39;str&#39;>
登入後複製
登入後複製

同理,這種方法也會進行四捨五入,但是將浮點型轉換成了字串值,已不再是原始的數值。

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 <class &#39;float&#39;>2.35 <class &#39;float&#39;>4 <class &#39;int&#39;>2 <class &#39;int&#39;>
登入後複製

可以看出,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))
登入後複製
列印

< class 'float'>

2.isinstance()

原型為

isinstance(x, A_tuple)

<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">a = 1.23tp = isinstance(a,float)print(tp)</pre><div class="contentsignin">登入後複製</div></div>列印

#True

3.class.__name__屬性

使用變數的

__class__.__name__

屬性,這也是type()方法的實質:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">num = 1.23print(num.__class__.__name__)</pre><div class="contentsignin">登入後複製</div></div>列印:

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}為右對齊,<code>{:^x}為居中),少於x位元自動補齊(默認為空格補齊),但是對於中文字符並不能很好地支持,所以會導致有多行中文字符串時出現不能對齊的現象,需要考慮到字符串所佔長度並將中文字符串進行編碼後再計算。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">#name是包含中文的字符串,22是整个字符串一行的总长度,一般要顾及测试才能得到,\t后的x是一标记字符,可换为别的所需的字符串print('[{string:&lt;{len}}\tx&amp;#39;.format(string=string+&amp;#39;]&amp;#39;,len=22-len(string.encode(&amp;#39;GBK&amp;#39;))+len(string)))</pre><div class="contentsignin">登入後複製</div></div>可參考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类的定义:

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.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对象做加减操作
>>> 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 = """<p>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</p>"""
登入後複製

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

from bs4 import BeautifulSoup

text = """<p>
<h1>Title</h1>
<p>A long text........ </p>
<a href=""> a link </a>
</p>"""clean_text = BeautifulSoup(text, "lxml").textprint(clean_text)
登入後複製

打印:

Title
A long text........ 
 a link
登入後複製

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

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

以上是Python 程式設計開發 實用經驗與技巧大放異彩的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板