當前位置:首頁 » 編程語言 » pythonwith上下文

pythonwith上下文

發布時間: 2022-05-07 10:46:29

① 如何用python 中with 用法

要使用 with 語句,首先要明白上下文管理器這一概念。有了上下文管理器,with 語句才能工作。
下面是一組與上下文管理器和with 語句有關的概念。
上下文管理協議(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持
該協議的對象要實現這兩個方法。
上下文管理器(Context Manager):支持上下文管理協議的對象,這種對象實現了
__enter__() 和 __exit__() 方法。上下文管理器定義執行 with 語句時要建立的運行時上下文,
負責執行 with 語句塊上下文中的進入與退出操作。通常使用 with 語句調用上下文管理器,
也可以通過直接調用其方法來使用。
運行時上下文(runtime context):由上下文管理器創建,通過上下文管理器的 __enter__() 和
__exit__() 方法實現,__enter__() 方法在語句體執行之前進入運行時上下文,__exit__() 在
語句體執行完後從運行時上下文退出。with 語句支持運行時上下文這一概念。
上下文表達式(Context Expression):with 語句中跟在關鍵字 with 之後的表達式,該表達式
要返回一個上下文管理器對象。

② 如何系統地自學 Python

是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?

幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。

Python 的設計哲學之一就是簡單易學,體現在兩個方面:

  • 語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。

  • 切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。


  • 廢話不多說,學會一門語言的捷徑只有一個: Getting Started

    ¶ 起步階段
    任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。

    硬知識
    「硬知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到 Python 中來,因此能夠快速掌握 Python 中面向對象的特性。

    如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。

    下面列出了一些適合初學者入門的教學材料:

    廖雪峰的 Python 教程 Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。

    笨方法學 Python 這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。

    The Hitchhiker』s Guide to Python! 這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。

    Python 的哲學:

  • 用一種方法,最好是只有一種方法來做一件事。
  • 學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。

    必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。

    軟知識
    「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。

    對這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7 一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django 什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想聖潔的性能安全通用性健壯性全部滿分的解決方案。

    很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
    還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。

    選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。

    自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...

    更重要的是,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。

    技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?

    因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。

    起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。

    ¶ 發展階段
    完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。

    沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
    發展階段的核心任務,就是「跳出 Python,擁抱世界」。

    在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。

    拿爬蟲舉例,如果你對計算機網路,HTTP 協議,HTML,文本編碼,JSON 一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。

    在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。

    類庫方面
    「Awesome Python 項目」:vinta/awesome-python · GitHub
    這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:

    vinta/awesome-python

    你可以按照實際需求,尋找你需要的類庫。

    至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。

    書籍方面
    這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:

    科學和數據分析:
    ❖「集體智慧編程」:集體智慧編程 (豆瓣)
    ❖「數學之美」:數學之美 (豆瓣)
    ❖「統計學習方法」:統計學習方法 (豆瓣)
    ❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
    ❖「數據科學實戰」:數據科學實戰 (豆瓣)
    ❖「數據檢索導論」:信息檢索導論 (豆瓣)

    爬蟲:
    ❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)

    Web 網站:
    ❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)

    ...

    列到這里已經不需要繼續了。

    聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。

    事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。

    ¶ 深入階段
    這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。

    可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。

    這里推薦一本書:
    「Python 源碼剖析」:Python源碼剖析 (豆瓣)
    這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。

    另外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java 基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python 中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。

    這里推薦一門公開課
    「編程範式」:斯坦福大學公開課:編程範式
    講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。

    值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。

    Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。

    ¶ 最後的話
    每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人!

    希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,

    Just Getting Started !!!

③ Python with as為什麼無法捕獲異常

with在打開文件的這個操作中的作用是保證每次正常打開文件後,不論遇到什麼,最後都會執行文件的關閉操作,避免腳本中遺漏。但是他自身並沒有抓取異常的處理機制。

with open("asdasdas") as a:

print("打開成功")

do_something()

這段代碼的含義,相當於打開了文件「asdasdas」後列印了「打開成功」的字樣後,又處理了do_something()這段邏輯。不論do_something()這段邏輯正常執行結束,還是拋出異常,都會保證最終「asdasdas」這個文件都會被關閉。避免因為文件未被關閉而導致的種種問題。


你的代碼可以改為以下部分,這樣就可以catch到讀取文件中的異常了。

try:

with open("asdasdas") as a:

print("打開成功")

except:

print("打開失敗")

④ Python 有什麼奇技淫巧

Python奇技淫巧
當發布python第三方package時, 並不希望代碼中所有的函數或者class可以被外部import, 在 __init__.py 中添加 __all__ 屬性,

該list中填寫可以import的類或者函數名, 可以起到限制的import的作用, 防止外部import其他函數或者類

#!/usr/bin/env python
# -*- coding: utf-8 -*-

frombaseimportAPIBase
fromclientimportClient
fromdecoratorimportinterface, export, stream
fromserverimportServer
fromstorageimportStorage
fromutilimport(LogFormatter, disable_logging_to_stderr,
enable_logging_to_kids, info)

__all__ = ['APIBase','Client','LogFormatter','Server',
'Storage','disable_logging_to_stderr','enable_logging_to_kids',
'export','info','interface','stream']

with的魔力

with語句需要支持 上下文管理協議的對象 , 上下文管理協議包含 __enter__ 和 __exit__ 兩個方法. with語句建立運行時上下文需要通過這兩個方法執行 進入和退出 操作.

其中 上下文表達式 是跟在with之後的表達式, 該表示大返回一個上下文管理對象
# 常見with使用場景
withopen("test.txt","r")asmy_file:# 注意, 是__enter__()方法的返回值賦值給了my_file,
forlineinmy_file:
print line

詳細原理可以查看這篇文章, 淺談 Python 的 with 語句

知道具體原理, 我們可以自定義支持上下文管理協議的類, 類中實現 __enter__ 和 __exit__ 方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-

classMyWith(object):

def__init__(self):
print"__init__ method"

def__enter__(self):
print"__enter__ method"
returnself# 返回對象給as後的變數

def__exit__(self, exc_type, exc_value, exc_traceback):
print"__exit__ method"
ifexc_tracebackisNone:
print"Exited without Exception"
returnTrue
else:
print"Exited with Exception"
returnFalse

deftest_with():
withMyWith()asmy_with:
print"running my_with"
print"------分割線-----"
withMyWith()asmy_with:
print"running before Exception"
raiseException
print"running after Exception"

if__name__ =='__main__':
test_with()

執行結果如下:
__init__ method
__enter__ method
running my_with
__exit__ method
ExitedwithoutException
------分割線-----
__init__ method
__enter__ method
running before Exception
__exit__ method
ExitedwithException
Traceback(most recent call last):
File"bin/python", line34,in<mole>
exec(compile(__file__f.read(), __file__, "exec"))
File"test_with.py", line33,in<mole>
test_with()
File"test_with.py", line28,intest_with
raiseException
Exception

證明了會先執行 __enter__ 方法, 然後調用with內的邏輯, 最後執行 __exit__ 做退出處理, 並且, 即使出現異常也能正常退出

filter的用法

相對 filter 而言, map和rece使用的會更頻繁一些, filter 正如其名字, 按照某種規則 過濾 掉一些元素
#!/usr/bin/env python
# -*- coding: utf-8 -*-

lst = [1,2,3,4,5,6]
# 所有奇數都會返回True, 偶數會返回False被過濾掉
print filter(lambda x: x % 2!=0, lst)

#輸出結果
[1,3,5]

一行作判斷

當條件滿足時, 返回的為等號後面的變數, 否則返回else後語句
lst = [1,2,3]
new_lst = lst[0]iflstisnotNoneelseNone
printnew_lst

# 列印結果
1

裝飾器之單例

使用裝飾器實現簡單的單例模式

# 單例裝飾器
defsingleton(cls):
instances = dict() # 初始為空
def_singleton(*args, **kwargs):
ifclsnotininstances:#如果不存在, 則創建並放入字典
instances[cls] = cls(*args, **kwargs)
returninstances[cls]
return_singleton

@singleton
classTest(object):
pass

if__name__ =='__main__':
t1 = Test()
t2 = Test()
# 兩者具有相同的地址
printt1, t2

staticmethod裝飾器

類中兩種常用的裝飾, 首先區分一下他們

普通成員函數, 其中第一個隱式參數為 對象
classmethod裝飾器 , 類方法(給人感覺非常類似於OC中的類方法), 其中第一個隱式參數為 類
staticmethod裝飾器 , 沒有任何隱式參數. python中的靜態方法類似與C++中的靜態方法
#!/usr/bin/env python
# -*- coding: utf-8 -*-

classA(object):

# 普通成員函數
deffoo(self, x):
print "executing foo(%s, %s)"% (self, x)

@classmethod# 使用classmethod進行裝飾
defclass_foo(cls, x):
print "executing class_foo(%s, %s)"% (cls, x)

@staticmethod# 使用staticmethod進行裝飾
defstatic_foo(x):
print "executing static_foo(%s)"% x

deftest_three_method():
obj = A()
# 直接調用噗通的成員方法
obj.foo("para")# 此處obj對象作為成員函數的隱式參數, 就是self
obj.class_foo("para")# 此處類作為隱式參數被傳入, 就是cls
A.class_foo("para")#更直接的類方法調用
obj.static_foo("para")# 靜態方法並沒有任何隱式參數, 但是要通過對象或者類進行調用
A.static_foo("para")

if__name__=='__main__':
test_three_method()

# 函數輸出
executing foo(<__main__.Aobject at0x100ba4e10>, para)
executing class_foo(<class'__main__.A'>,para)
executing class_foo(<class'__main__.A'>,para)
executing static_foo(para)
executing static_foo(para)

property裝飾器

定義私有類屬性

將 property 與裝飾器結合實現屬性私有化( 更簡單安全的實現get和set方法 )
#python內建函數
property(fget=None, fset=None, fdel=None, doc=None)

fget 是獲取屬性的值的函數, fset 是設置屬性值的函數, fdel 是刪除屬性的函數, doc 是一個字元串(like a comment).從實現來看,這些參數都是可選的

property有三個方法 getter() , setter() 和 delete() 來指定fget, fset和fdel。 這表示以下這行
classStudent(object):

@property #相當於property.getter(score) 或者property(score)
defscore(self):
returnself._score

@score.setter #相當於score = property.setter(score)
defscore(self, value):
ifnotisinstance(value, int):
raiseValueError('score must be an integer!')
ifvalue <0orvalue >100:
raiseValueError('score must between 0 ~ 100!')
self._score = value

iter魔法

通過yield和 __iter__ 的結合, 我們可以把一個對象變成可迭代的
通過 __str__ 的重寫, 可以直接通過想要的形式列印對象
#!/usr/bin/env python
# -*- coding: utf-8 -*-

classTestIter(object):

def__init__(self):
self.lst = [1,2,3,4,5]

defread(self):
foreleinxrange(len(self.lst)):
yieldele

def__iter__(self):
returnself.read()

def__str__(self):
return','.join(map(str, self.lst))

__repr__ = __str__

deftest_iter():
obj = TestIter()
fornuminobj:
printnum
printobj

if__name__ =='__main__':
test_iter()

神奇partial

partial使用上很像C++中仿函數(函數對象).

在stackoverflow給出了類似與partial的運行方式
defpartial(func, *part_args):
defwrapper(*extra_args):
args = list(part_args)
args.extend(extra_args)
returnfunc(*args)

returnwrapper

利用用閉包的特性綁定預先綁定一些函數參數, 返回一個可調用的變數, 直到真正的調用執行
#!/usr/bin/env python
# -*- coding: utf-8 -*-

fromfunctoolsimportpartial

defsum(a, b):
returna + b

deftest_partial():
fun = partial(sum, 2)# 事先綁定一個參數, fun成為一個只需要一個參數的可調用變數
printfun(3)# 實現執行的即是sum(2, 3)

if__name__ =='__main__':
test_partial()

# 執行結果
5

神秘eval

eval我理解為一種內嵌的python解釋器(這種解釋可能會有偏差), 會解釋字元串為對應的代碼並執行, 並且將執行結果返回

看一下下面這個例子
#!/usr/bin/env python
# -*- coding: utf-8 -*-

deftest_first():
return3

deftest_second(num):
returnnum

action = { # 可以看做是一個sandbox
"para":5,
"test_first": test_first,
"test_second": test_second
}

deftest_eavl():
condition = "para == 5 and test_second(test_first) > 5"
res = eval(condition, action) # 解釋condition並根據action對應的動作執行
printres

if__name__ =='_

exec

exec在Python中會忽略返回值, 總是返回None, eval會返回執行代碼或語句的返回值
exec 和 eval 在執行代碼時, 除了返回值其他行為都相同
在傳入字元串時, 會使用 compile(source, '<string>', mode) 編譯位元組碼. mode的取值為 exec 和 eval
#!/usr/bin/env python
# -*- coding: utf-8 -*-

deftest_first():
print"hello"

deftest_second():
test_first()
print"second"

deftest_third():
print"third"

action = {
"test_second": test_second,
"test_third": test_third
}

deftest_exec():
exec"test_second"inaction

if__name__ =='__main__':
test_exec() # 無法看到執行結果

getattr

getattr(object, name[, default]) Return the value of
the named attribute of object. name must be a string. If the string is
the name of one of the object』s attributes, the result is the value of
that attribute. For example, getattr(x, 『foobar』) is equivalent to
x.foobar. If the named attribute does not exist, default is returned if
provided, otherwise AttributeError is raised.

通過string類型的name, 返回對象的name屬性(方法)對應的值, 如果屬性不存在, 則返回默認值, 相當於object.name
# 使用範例
classTestGetAttr(object):

test = "test attribute"

defsay(self):
print"test method"

deftest_getattr():
my_test = TestGetAttr()
try:
printgetattr(my_test,"test")
exceptAttributeError:
print"Attribute Error!"
try:
getattr(my_test, "say")()
exceptAttributeError:# 沒有該屬性, 且沒有指定返回值的情況下
print"Method Error!"

if__name__ =='__main__':
test_getattr()

# 輸出結果
test attribute
test method

命令行處理
defprocess_command_line(argv):
"""
Return a 2-tuple: (settings object, args list).
`argv` is a list of arguments, or `None` for ``sys.argv[1:]``.
"""
ifargvisNone:
argv = sys.argv[1:]

# initialize the parser object:
parser = optparse.OptionParser(
formatter=optparse.TitledHelpFormatter(width=78),
add_help_option=None)

# define options here:
parser.add_option( # customized description; put --help last
'-h','--help', action='help',
help='Show this help message and exit.')

settings, args = parser.parse_args(argv)

# check number of arguments, verify values, etc.:
ifargs:
parser.error('program takes no command-line arguments; '
'"%s" ignored.'% (args,))

# further process settings & args if necessary

returnsettings, args

defmain(argv=None):
settings, args = process_command_line(argv)
# application code here, like:
# run(settings, args)
return0# success

if__name__ =='__main__':
status = main()
sys.exit(status)

讀寫csv文件
# 從csv中讀取文件, 基本和傳統文件讀取類似
importcsv
withopen('data.csv','rb')asf:
reader = csv.reader(f)
forrowinreader:
printrow
# 向csv文件寫入
importcsv
withopen('data.csv','wb')asf:
writer = csv.writer(f)
writer.writerow(['name','address','age'])# 單行寫入
data = [
( 'xiaoming ','china','10'),
( 'Lily','USA','12')]
writer.writerows(data) # 多行寫入

各種時間形式轉換

只發一張網上的圖, 然後差文檔就好了, 這個是記不住的

字元串格式化

一個非常好用, 很多人又不知道的功能
>>>name ="andrew"
>>>"my name is {name}".format(name=name)
'my name is andrew'

⑤ 關於Python的文件上close的問題

一般來說,可以使用上下文的情況下,優先使用上下文來管理文件流,好處是不需要考慮關閉的問題,在with塊結束時,無論是正常結束塊還是因為錯誤跳出塊。

不要為了少寫一行代碼而寫出不穩定或不易讀的代碼。對於python來說,易讀性是很重要的。

並且,with 是可以同時管理多個上下文的,寫法類似這樣:

with open(...) as a,open(....) as b....

⑥ 如何解決的Python類型錯誤

1.Python異常類

Python是面向對象語言,所以程序拋出的異常也是類。常見的Python異常有以下幾個,大家只要大致掃一眼,有個映像,等到編程的時候,相信大家肯定會不只一次跟他們照面(除非你不用Python了)。

異常 描述
NameError 嘗試訪問一個沒有申明的變數
ZeroDivisionError 除數為0
SyntaxError 語法錯誤
IndexError 索引超出序列范圍
KeyError 請求一個不存在的字典關鍵字
IOError 輸入輸出錯誤(比如你要讀的文件不存在)
AttributeError 嘗試訪問未知的對象屬性
ValueError 傳給函數的參數類型不正確,比如給int()函數傳入字元串形
2.捕獲異常
Python完整的捕獲異常的語句有點像:
復制代碼 代碼如下:

try:
try_suite
except Exception1,Exception2,...,Argument:
exception_suite
...... #other exception block
else:
no_exceptions_detected_suite
finally:
always_execute_suite

額...是不是很復雜?當然,當我們要捕獲異常的時候,並不是必須要按照上面那種格式完全寫下來,我們可以丟掉else語句,或者finally語句;甚至不要exception語句,而保留finally語句。額,暈了?好吧,下面,我們就來一一說明啦。
2.1.try...except...語句
try_suite不消我說大家也知道,是我們需要進行捕獲異常的代碼。而except語句是關鍵,我們try捕獲了代碼段try_suite里的異常後,將交給except來處理。
try...except語句最簡單的形式如下:
復制代碼 代碼如下:

try:
try_suite
except:
exception block

上面except子句不跟任何異常和異常參數,所以無論try捕獲了任何異常,都將交給except子句的exception block來處理。如果我們要處理特定的異常,比如說,我們只想處理除零異常,如果其他異常出現,就讓其拋出不做處理,該怎麼辦呢?這個時候,我們就要給except子句傳入異常參數啦!那個ExceptionN就是我們要給except子句的異常類(請參考異常類那個表格),表示如果捕獲到這類異常,就交給這個except子句來處理。比如:
復制代碼 代碼如下:

try:
try_suite
except Exception:
exception block

舉個例子:
復制代碼 代碼如下:

>>> try:
... res = 2/0
... except ZeroDivisionError:
... print "Error:Divisor must not be zero!"
...
Error:Divisor must not be zero!

看,我們真的捕獲到了ZeroDivisionError異常!那如果我想捕獲並處理多個異常怎麼辦呢?有兩種辦法,一種是給一個except子句傳入多個異常類參數,另外一種是寫多個except子句,每個子句都傳入你想要處理的異常類參數。甚至,這兩種用法可以混搭呢!下面我就來舉個例子。
復制代碼 代碼如下:

try:
floatnum = float(raw_input("Please input a float:"))
intnum = int(floatnum)
print 100/intnum
except ZeroDivisionError:
print "Error:you must input a float num which is large or equal then 1!"
except ValueError:
print "Error:you must input a float num!"
[root@Cherish tmp]# python test.py
Please input a float:fjia
Error:you must input a float num!
[root@Cherish tmp]# python test.py
Please input a float:0.9999
Error:you must input a float num which is large or equal then 1!
[root@Cherish tmp]# python test.py
Please input a float:25.091
4

上面的例子大家一看都懂,就不再解釋了。只要大家明白,我們的except可以處理一種異常,多種異常,甚至所有異常就可以了。
大家可能注意到了,我們還沒解釋except子句後面那個Argument是什麼東西?別著急,聽我一一道來。這個Argument其實是一個異常類的實例(別告訴我你不知到什麼是實例),包含了來自異常代碼的診斷信息。也就是說,如果你捕獲了一個異常,你就可以通過這個異常類的實例來獲取更多的關於這個異常的信息。例如:
復制代碼 代碼如下:

>>> try:
... 1/0
... except ZeroDivisionError,reason:
... pass
...
>>> type(reason)
<type 'exceptions.ZeroDivisionError'>
>>> print reason
integer division or molo by zero
>>> reason
ZeroDivisionError('integer division or molo by zero',)
>>> reason.__class__
<type 'exceptions.ZeroDivisionError'>
>>> reason.__class__.__doc__
'Second argument to a division or molo operation was zero.'
>>> reason.__class__.__name__
'ZeroDivisionError'

上面這個例子,我們捕獲了除零異常,但是什麼都沒做。那個reason就是異常類ZeroDivisionError的實例,通過type就可以看出。
2.2try ... except...else語句
現在我們來說說這個else語句。Python中有很多特殊的else用法,比如用於條件和循環。放到try語句中,其作用其實也差不多:就是當沒有檢測到異常的時候,則執行else語句。舉個例子大家可能更明白些:
復制代碼 代碼如下:

>>> import syslog
>>> try:
... f = open("/root/test.py")
... except IOError,e:
... syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
... syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
...
>>> f.close()

2.3 finally子句
finally子句是無論是否檢測到異常,都會執行的一段代碼。我們可以丟掉except子句和else子句,單獨使用try...finally,也可以配合except等使用。
例如2.2的例子,如果出現其他異常,無法捕獲,程序異常退出,那麼文件 f 就沒有被正常關閉。這不是我們所希望看到的結果,但是如果我們把f.close語句放到finally語句中,無論是否有異常,都會正常關閉這個文件,豈不是很 妙
復制代碼 代碼如下:

>>> import syslog
>>> try:
... f = open("/root/test.py")
... except IOError,e:
... syslog.syslog(syslog.LOG_ERR,"%s"%e)
... else:
... syslog.syslog(syslog.LOG_INFO,"no exception caught\n")
... finally:
>>> f.close()

大家看到了沒,我們上面那個例子竟然用到了try,except,else,finally這四個子句!:-),是不是很有趣?到現在,你就基本上已經學會了如何在Python中捕獲常規異常並處理之。
3.兩個特殊的處理異常的簡便方法
3.1斷言(assert)
什麼是斷言,先看語法:
復制代碼 代碼如下:

assert expression[,reason]

其中assert是斷言的關鍵字。執行該語句的時候,先判斷表達式expression,如果表達式為真,則什麼都不做;如果表達式不為真,則拋出異常。reason跟我們之前談到的異常類的實例一樣。不懂?沒關系,舉例子!最實在!
復制代碼 代碼如下:

>>> assert len('love') == len('like')
>>> assert 1==1
>>> assert 1==2,"1 is not equal 2!"
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
AssertionError: 1 is not equal 2!

我們可以看到,如果assert後面的表達式為真,則什麼都不做,如果不為真,就會拋出AssertionErro異常,而且我們傳進去的字元串會作為異常類的實例的具體信息存在。其實,assert異常也可以被try塊捕獲:
復制代碼 代碼如下:

>>> try:
... assert 1 == 2 , "1 is not equal 2!"
... except AssertionError,reason:
... print "%s:%s"%(reason.__class__.__name__,reason)
...
AssertionError:1 is not equal 2!
>>> type(reason)
<type 'exceptions.AssertionError'>

3.2.上下文管理(with語句)
如果你使用try,except,finally代碼僅僅是為了保證共享資源(如文件,數據)的唯一分配,並在任務結束後釋放它,那麼你就有福了!這個with語句可以讓你從try,except,finally中解放出來!語法如下:
復制代碼 代碼如下:

with context_expr [as var]:
with_suite

是不是不明白?很正常,舉個例子來!
復制代碼 代碼如下:

>>> with open('/root/test.py') as f:
... for line in f:
... print line

上面這幾行代碼幹了什麼?
(1)打開文件/root/test.py
(2)將文件對象賦值給 f
(3)將文件所有行輸出
(4)無論代碼中是否出現異常,Python都會為我們關閉這個文件,我們不需要關心這些細節。
這下,是不是明白了,使用with語句來使用這些共享資源,我們不用擔心會因為某種原因而沒有釋放他。但並不是所有的對象都可以使用with語句,只有支持上下文管理協議(context management protocol)的對象才可以,那哪些對象支持該協議呢?如下表:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
至於什麼是上下文管理協議,如果你不只關心怎麼用with,以及哪些對象可以使用with,那麼我們就不比太關心這個問題:)
4.拋出異常(raise)
如果我們想要在自己編寫的程序中主動拋出異常,該怎麼辦呢?raise語句可以幫助我們達到目的。其基本語法如下:
復制代碼 代碼如下:

raise [SomeException [, args [,traceback]]

第一個參數,SomeException必須是一個異常類,或異常類的實例
第二個參數是傳遞給SomeException的參數,必須是一個元組。這個參數用來傳遞關於這個異常的有用信息。
第三個參數traceback很少用,主要是用來提供一個跟中記錄對象(traceback)
下面我們就來舉幾個例子。
復制代碼 代碼如下:

>>> raise NameError
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
NameError
>>> raise NameError() #異常類的實例
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
NameError
>>> raise NameError,("There is a name error","in test.py")
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
>>> raise NameError("There is a name error","in test.py") #注意跟上面一個例子的區別
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
NameError: ('There is a name error', 'in test.py')
>>> raise NameError,NameError("There is a name error","in test.py") #注意跟上面一個例子的區別
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
NameError: ('There is a name error', 'in test.py')

其實,我們最常用的還是,只傳入第一個參數用來指出異常類型,最多再傳入一個元組,用來給出說明信息。如上面第三個例子。
5.異常和sys模塊
另一種獲取異常信息的途徑是通過sys模塊中的exc_info()函數。該函數回返回一個三元組:(異常類,異常類的實例,跟中記錄對象)
復制代碼 代碼如下:

>>> try:
... 1/0
... except:
... import sys
... tuple = sys.exc_info()
...
>>> print tuple
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or molo by zero',), <traceback object at 0x7f538a318b48>)
>>> for i in tuple:
... print i
...
<type 'exceptions.ZeroDivisionError'> #異常類
integer division or molo by zero #異常類的實例
<traceback object at 0x7f538a318b48> #跟蹤記錄對象

⑦ python3讀取txt時FileNotFoundError

在同一個文件夾下的話,直接寫文件名加後綴就可以了,非要寫全路徑的話,把反斜杠改掉。
另外,讀取文件,with上下文管理器並不是最優選擇,因為文件本身就是一個可迭代對象,嘗試用for line in open(filename): 這樣的結構吧,當你處理超大文本或者需要yield 生成器時,對內存及程序速度性能會有很大的幫助。

⑧ python怎麼實現按照文本順序執行函數

Python讀文本可以用with上下文管理器。根據文本來執行對應名字的函數可以用getatter方法。代碼如下:
首先,新建文本文件test.txt,內容如下:
func1,life is short
func2,use python
func1, hello word

下面是Python代碼,聲明兩個function,功能是列印出傳入的參數。main裡面的把內容就是按照文本的順序,傳入參數執行對應的function:
class Example(object):

def __init__(self):
pass

def func1(self, arg):
print 'this is func1, arg is {}.'.format(arg)

def func2(self, arg):
print 'this is func2, arg is {}.'.format(arg)if __name__ == '__main__':
example_instance = Example()

with open('test.txt', 'r') as f:
for line in f.readlines():
function_name, args = line.strip().split(',')
getattr(example_instance, function_name)(args)

得到這樣的輸出:
this is func1, arg is life is short.
this is func2, arg is use python.
this is func1, arg is hello word.

⑨ Python基本內置數據類型有哪些

內置類型是指任何語言在設計初期定義的類型,如C語言中的int、double、char等。它也是在一種語言中最基本的類型,與編譯器編譯出的代碼具有重大關系。值得一提的是,不同語言也擁有不同的內置類型, 但是所有內置類型的定義都與計算機的運算方式相關。
Python主要內置類型包括數值、序列、映射、類、實例和異常等。
數值類型:全局中只有一個(Python在解釋器啟動的時候,Python會用None類型生成一個None的對象),包括int類型、float類型、complex類型、bool類型。
迭代類型:在Python中,迭代類型可以使用循環來進行遍歷。
序列類型:list(是可變序列,通常用於存放同類項目的集合)、tuple(是不可變序列,通常用於儲存異構數據的多項集)、str(在Python中處理文本數據是使用str對象,也稱為字元串。字元串是由Unicode碼位構成的不可變序列。)、array、range(表示不可變的數字序列,通常用於在for循環中循環指定的次數)、bytes(由單個位元組構成的不可變序列)、bytearray(bytes對象的可變對應物)、memoryvie(二進制序列)
映射類型:映射對象將具有hash的值映射到任意對象。映射是可變的對象。目前只有一種標准映射,即dictionary。字典的鍵幾乎是任意值,也就是說,包含列表、字典或其他可變類型的值。
集合類型:作為一種無序的多項集,集合並不記錄元素位置或插入順序。相應地,集合不支持索引、切片或其他序列類的操作。目前Python有兩種內置集合類型:set和frozenset。
set類型是可變的,其內容可以使用add()和remove()這樣的方法來改變。由於是可變類型,它沒有哈希值,且不能被用作字典的鍵或其他集合的元素。
frozenset類型是不可變並且具有哈希值,其內容在被創建後不能再改變,因此它可以被用作字典的鍵或其他集合的元素。
上下文管理類型:with語句
其他類型:模塊、class、實例、函數、方法、代碼、object對象、type對象、ellipsis(省略號)、notimplemented

熱點內容
手機無線路由器怎麼設置密碼 發布:2025-05-12 05:18:28 瀏覽:813
渝人解壓密碼 發布:2025-05-12 05:18:12 瀏覽:766
備份網站資料庫備份 發布:2025-05-12 05:04:35 瀏覽:51
轉移的存儲卡 發布:2025-05-12 04:51:18 瀏覽:465
c語言大數相加 發布:2025-05-12 04:51:13 瀏覽:587
安卓內存大小有什麼影響 發布:2025-05-12 04:41:36 瀏覽:49
以下c語言常量錯誤的是 發布:2025-05-12 04:40:39 瀏覽:806
怎麼降低qq版本安卓80 發布:2025-05-12 04:40:39 瀏覽:189
一個密碼多少人知道後就不是秘密 發布:2025-05-12 04:26:07 瀏覽:520
ftp埠非21 發布:2025-05-12 04:09:09 瀏覽:228