国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Pythonic 到底是什么,從 try finally 到 with 的感悟

不要費(fèi)心編寫 Python 已經(jīng)完成的東西,因?yàn)槟鸁o法編寫更好的東西。

學(xué)習(xí) Python 的第一節(jié)課不僅僅是 “Hello World”,相信也有“Python 之禪”。當(dāng)你在交互解釋器中輸入 import this 就會(huì)顯示 Tim Peters 的 The Zen of Python:

>>>import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

在網(wǎng)上找了篇排名靠前的翻譯,發(fā)現(xiàn)不完整,還是谷歌翻譯湊合看吧:


美麗勝于丑陋。

顯式勝于隱式。

簡(jiǎn)單勝于復(fù)雜。

復(fù)雜勝于復(fù)雜。

扁平比嵌套更好。

稀疏勝于密實(shí)。

可讀性很重要。

特殊情況還不足以打破規(guī)則。

盡管實(shí)用性勝過純度。

錯(cuò)誤絕不能默默傳遞。

除非明確地保持沉默。

面對(duì)模棱兩可,拒絕猜測(cè)的誘惑。

應(yīng)該有一種-最好只有一種-明顯的方式來做到這一點(diǎn)。

盡管除非您是荷蘭人,否則一開始這種方式可能并不明顯。

現(xiàn)在總比沒有好。

盡管從來沒有什么比現(xiàn)在“正確”更好。

如果實(shí)現(xiàn)難以解釋,那是個(gè)壞主意。

如果實(shí)現(xiàn)易于解釋,則可能是個(gè)好主意。

命名空間是一個(gè)很棒的主意-讓我們做更多這些吧!

而在 Python 幾十年的發(fā)展過程中,禪被包裹了一層又一層,混雜了更多東西,最后出現(xiàn)了 Pythonic 這個(gè)新創(chuàng)的單詞,是 Python 之禪的解釋和體現(xiàn)。

就像 ComputerHope 網(wǎng)站解釋的那樣:

Pythonic 是一個(gè)形容詞,它描述了一種與 Python 編程語言的創(chuàng)立哲學(xué)一致的計(jì)算機(jī)編程方法。在 Python 中有很多方法可以完成相同的任務(wù),但是通常有一種首選的方法可以完成此任務(wù)。這種首選方式稱為“Pythonic”。

但是這對(duì)于大家來說依然是一個(gè)籠統(tǒng)的概念,就像迷霧之中的燈塔,讓人看不清楚,就算有一天偶爾觸摸到了,你可能也意識(shí)不到。

只有直接通過 Python 的方法解決一個(gè)問題的時(shí)候,或許才會(huì)明悟。

try finally

下面就說說我從try finally 到 with 中學(xué)到的 Pythonic:

2019年的時(shí)候,工作需要我接觸了 xlwings 這個(gè) Python 庫(kù),當(dāng)然我是使用的 Python2.7 版本。

簡(jiǎn)單介紹一下該庫(kù),不然下面講不下去,xlwings 庫(kù)是一個(gè)可以直接調(diào)用電腦上 Excel 的接口的庫(kù),用戶可以通過 xlwings 新建 Excel 表格、修改、計(jì)算其中的數(shù)據(jù)等等。

不同于其他處理 Excel 表格的庫(kù),由于 xlwings 是直接在后臺(tái)調(diào)用 Excel 程序來打開需要處理的表格,所以處理過程中,我在任務(wù)管理器中是可以看到一個(gè) Excel 程序被啟動(dòng)了。

當(dāng)然這沒有什么問題,xlwings 很強(qiáng)大,Excel 有的功能基本上都能調(diào)用,也沒有其它庫(kù)關(guān)于 xls、xlsx 這種弱智的文件版本問題,但是:在代碼運(yùn)行過程中報(bào)錯(cuò)的話,后臺(tái)的 Excel 程序不會(huì)自動(dòng)銷毀,而會(huì)變成僵尸程序,永遠(yuǎn)留在系統(tǒng)中除非人為干預(yù)刪除。

這就很搞笑了,留了一個(gè) Excel 程序在后臺(tái),打開任務(wù)管理器可以看到:

然后我試著重新打開那個(gè) Excel 文件,會(huì)出錯(cuò),錯(cuò)誤提示:在另一個(gè)應(yīng)用程序打開。請(qǐng)將其關(guān)閉,然后重試。

所以這個(gè) Excel 文件直接就不能正常打開了,xlwings 當(dāng)然也不能打開這個(gè)表格了,因?yàn)檫@個(gè)表格已經(jīng)被后臺(tái)中的僵尸程序占用了,所以我只能在任務(wù)管理器中將 Excel 進(jìn)程關(guān)閉,然后才能繼續(xù)操作。

非常麻煩,代碼在編寫過程中運(yùn)行出錯(cuò)是很常見的,難道每出錯(cuò)一次就手動(dòng)終止進(jìn)程一次?

所以使用 try - finally 語句塊,在 finally 語句下寫退出代碼,這樣就算是報(bào)錯(cuò)還是怎么樣都是沒有問題的,程序都會(huì)退出(除非你連退出程序的代碼都寫錯(cuò)了)。

這里還是放上示例代碼吧:

# -*- coding:utf-8 -*-
import xlwings as xw
import os

try:
   path = "test.xlsx"
   app1 = xw.App(visible=False,
                 add_book=False)
   app1.display_alerts = False
   wb = app1.books.open(path)
   wb_sheet1 = wb.sheets[0]
   
   cell = wb_sheet1.range("A1")
   cell.nonono()
   cell.value = 2
   wb.save()
   
finally:
   app1.quit()

那么這就是 Pythonic 的寫法嘛?當(dāng)然不是,我從來不覺得加了 try- finally 就很優(yōu)雅了,因?yàn)橄?try-else-except-finally 這些是程序語言的錯(cuò)誤處理機(jī)制,在很多語言中都存在,并且個(gè)人不是很喜歡設(shè)置過多的縮進(jìn)級(jí)別。

我只是為了能讓程序跑起來,先整上再說。

with

而真正將其寫的比較 Pythonic 是幾個(gè)月后吧,應(yīng)該:

后來頻繁的使用 xlwings 來處理 Excel 表格,我想把涉及到的代碼模塊化,方便復(fù)用,可以就是由于這個(gè)煩人的 try-finally 語句塊導(dǎo)致讀取模塊化工作做不出來,因?yàn)?try 和 finally 是相連的,且finally   中就是程序退出代碼(可能我技術(shù)有限吧,先把這句話說出來,免得被噴)。

這怎么能行呢?思來想去,就像前面說的:

“Pythonic 是一個(gè)形容詞,它描述了一種與 Python 編程語言的創(chuàng)立哲學(xué)一致的計(jì)算機(jī)編程方法”

我直接好家伙,使用上下文管理器不就行了嘛,一個(gè) with 解決一切煩惱,這不就是保持與 Python 編程語言的創(chuàng)立哲學(xué)一致嘛!

使用上下文管理器就可以自動(dòng)在程序結(jié)束后、或者出錯(cuò)后,自動(dòng)將后臺(tái)程序退出。并且只用 with 即可,上下文使用非常廣泛,比如 with open(file) as p: ,見過吧。

創(chuàng)建上下文管理器有兩種方式,一種是使用內(nèi)置方法 __enter____exit__ 實(shí)現(xiàn),我沒用過;

我使用的是第二種較為簡(jiǎn)單的方法,名稱比較長(zhǎng):上下文管理器裝飾器;就像名字一樣,添加一個(gè)裝飾器再添加一個(gè) yield 關(guān)鍵字就行了。

看看下面這個(gè)例子:

# -*- coding:utf-8 -*-

from contextlib import contextmanager
import xlwings as xw

@contextmanager
def open_xlwings(input_file, output=None):
   app = xw.App(visible=False, add_book=False)
   app.display_alerts = False
   app.screen_updating = False
   print "input_file:", input_file
   wb = app.books.open(input_file)
   print "File Name: {}".format(app.books)
   print "Pid: {}".format(app.pid)
   sheet = wb.sheets[0]

   yield sheet # 返回 sheet
   
   print "Quit Xlwings"
   app.quit()

被裝飾器裝飾的函數(shù)分為三部分:

  • with語句中的代碼塊執(zhí)行前執(zhí)行函數(shù)中yield之前代碼;

  • yield返回的內(nèi)容復(fù)制給as之后的變量;

  • with代碼塊執(zhí)行完畢后執(zhí)行函數(shù)中yield之后的代碼。

看看下面這個(gè)簡(jiǎn)單例子及其輸出結(jié)果就明白了:

import xlwings as xw
import os
from glwings import open_xlwings

path = "test.xlsx"

with open_xlwings(path) as p:
   # code
   print "ok"

輸出結(jié)果

input_file: test.xlsx
File Name: Books([<Book [test.xlsx]>])
Pid: 11788
ok
Quit Xlwings

但是這樣還是不行哦,如果 with 語句塊的代碼出錯(cuò)的話,后續(xù)的也會(huì)直接停止的,所以在上下文管理器裝飾器所修飾的函數(shù)中需要加入錯(cuò)誤處理模塊:

# -*- coding:utf-8 -*-

from contextlib import contextmanager
import xlwings as xw

@contextmanager
def open_xlwings(input_file, output=None):
   app = xw.App(visible=False, add_book=False)
   app.display_alerts = False
   app.screen_updating = False
   print "input_file:", input_file
   wb = app.books.open(input_file)
   print "File Name: {}".format(app.books)
   print "Pid: {}".format(app.pid)
   sheet = wb.sheets[0]

   try:
       yield sheet # 返回 sheet
   except Exception as e:
       info = "with an error {}".format(e)
       raise
   else:
       if output:
           wb.save(output)
       else:
           wb.save()
   finally:
       print "Quit Xlwings"
       app.quit()

還是非常簡(jiǎn)單的,現(xiàn)在就可以非常安心的使用 with 語句來操控 xlwings 打開 Excel 表格了。

其實(shí)像這種功能 xlwings 庫(kù)應(yīng)該自己就需要實(shí)現(xiàn)的,不知道為什么沒有支持 with 的文件對(duì)象,當(dāng)然咯我說的是對(duì)應(yīng) Python2.7 版本的 xlwings,像現(xiàn)在最新的 Python3 版本對(duì)應(yīng) xlwings 怎么樣了我就不清楚了,不過多半沒什么變化,如果能支持早就支持了,不會(huì)等到現(xiàn)在。

如果以后有人問你,什么是 Pythonic,你叫他多寫 with 就可以了,這就是一種 Pythonic 的寫法,非常的純正,非常的 Pythonic;而編寫5、6層嵌套的簡(jiǎn)直是在犯罪。

優(yōu)美(美麗)是Python 之禪的第一個(gè)詞,這就是我理解的 Pythonic。

這是一篇半心得體會(huì)半技術(shù)的文章,心得體會(huì)部分充斥了本人的主觀臆斷,不可全取;技術(shù)部分可以小心參考。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python xlwings模塊簡(jiǎn)單使用
超全整理|Python 操作 Excel 庫(kù) xlwings 常用操作詳解!
Python提取 “Excel文本框” 內(nèi)容,這個(gè)需求頭一次見,1000個(gè)表,10行代碼!
python excel神器xlwings
語法概述 · xlwings中文文檔 · 看云
詳解python的xlwings庫(kù)讀寫excel操作總結(jié)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服