<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6111972296244562865</id><updated>2024-09-22T16:29:08.452-07:00</updated><title type='text'>Python 3</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-9149151246563646680</id><published>2011-09-10T14:03:00.001-07:00</published><updated>2011-09-10T14:03:41.494-07:00</updated><title type='text'>模組名稱空間</title><content type='html'>&lt;small&gt;在Python中，模組實際的作用之一是作為名稱空間，你所建立的變數，最大有效範圍就是模組範圍，而你所定義的函式名稱、類別名稱，實際上也是以模組作為名稱空間。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;ul&gt;&lt;small&gt;         &lt;/small&gt;
&lt;li&gt;&lt;small&gt;mod.py&lt;/small&gt;&lt;/li&gt;
&lt;small&gt;       &lt;/small&gt;&lt;/ul&gt;&lt;pre&gt;x = 10

def some():
    print(x)
    
class Other:
    def __init__(self, arg):
        self.arg = arg
    def show(self):
        print(self.arg)&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;在這個模組中定義了&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x變數、some函式與Other類別&lt;/span&gt;，你可以在另一個模組中這麼使用它：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import mod

print(mod.x)  # 10

mod.some()    # 10

other = mod.Other(20)
other.show()  # 20&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;實際上，Python中一個可作為名稱空間的物件，都具有&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__dict__&lt;/span&gt;特性（參考 &lt;/small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/PropertyNameSpace.html&quot;&gt;&lt;small&gt;特性名稱空間&lt;/small&gt;&lt;/a&gt;&lt;small&gt; ），模組也不例外。例如，若要存取上例中&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;mod模組的x變數、some函式或Other類別，亦可如下操作：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;pre&gt;import mod

print(mod.__dict__[&#39;x&#39;])            # 10

mod.__dict__[&#39;some&#39;]()              # 10

other = mod.__dict__[&#39;Other&#39;](20)   
other.show()                        # 20
      &lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;from import&lt;/span&gt;語句，於目前模組中建立與被匯入模組相同的變數名稱。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;from mod import *

print(x)              # 10

some()                # 10

other = Other(20) 
other.show()          # 20&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;from import語句時，若最後是&lt;span style=&quot;font-weight: bold;&quot;&gt;*結尾&lt;/span&gt;&lt;/span&gt;，則會將被匯入模組中所有變數，在當前模組中都建立相同的名稱。如果你有些變數，並不想被&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;from import *&lt;/span&gt;建立同名變數，則可以用底線作為開頭。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;ul&gt;&lt;li&gt;&lt;small&gt;mod.py&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;pre&gt;x = 10

def some():
    print(x)
    
class Other:
    def __init__(self, arg):
        self.arg = arg
    def show(self):
        print(self.arg)
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;_y = 10&lt;/span&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;上例中，mod模組有個_y變數，它不會被from import *用來建立同名變數。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;from mod import *&lt;/span&gt;

print(x)            # 10
some()              # 10
other = Other(20)
other.show()        # 20

&lt;span style=&quot;font-weight: bold;&quot;&gt;print(_y)           # NameError: name &#39;_y&#39; is not defined&lt;/span&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;不過這個避免被建立同名變數的方式，僅適用於from import *，其它的import形式就不起作用了。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;from mod import _y
print(_y)           # 10&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;相對的，你可以在模組中建立一個&lt;span style=&quot;font-weight: bold;&quot;&gt;__all__&lt;/span&gt;變數，參考至串列實例，內含想要被其它模組from import *的變數名單，如果有這麼一個__all__變數，則只有名單中的變數，才可以被其它模組from import *。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;__all__ = [&#39;x&#39;, &#39;some&#39;]&lt;/span&gt;

x = 10

def some():
    print(x)
    
class Other:
    def __init__(self, arg):
        self.arg = arg
    def show(self):
        print(self.arg)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;上例中，僅開放x變數與some函式被其它模組from import *。所以：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;from mod import *

print(x)           # 10

some()             # 10

&lt;span style=&quot;font-weight: bold;&quot;&gt;other = Other(20)  # NameError: name &#39;Other&#39; is not defined&lt;/span&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/9149151246563646680/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4560.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/9149151246563646680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/9149151246563646680'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4560.html' title='模組名稱空間'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-1446579069809736911</id><published>2011-09-10T14:02:00.001-07:00</published><updated>2011-09-10T14:02:49.851-07:00</updated><title type='text'>匯入套件</title><content type='html'>&lt;small&gt;如果你在dir1目錄中有有個名為&lt;/small&gt;&lt;small&gt;mod的&lt;/small&gt;&lt;small&gt;模組檔案，而dir2中也有個名為mod的模組檔案。若&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.path&lt;/span&gt;中包括dir1與dir2。如果現在你的應用程式中，撰寫了以下的程式：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;import mod&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
那麼，會匯入的僅有dir1/mod模組檔案。模組檔案的尋找，是以&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.path&lt;/span&gt;中的路徑，先找到符合的名稱就使用。&lt;br /&gt;
&lt;br /&gt;
如果要同時使用到dir1/mod.py與dir2/mod.py，那麼單純僅使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.path&lt;/span&gt;來尋找模組無法達到這個目的。同名模組的名稱衝突問題，可以藉由&lt;span style=&quot;font-weight: bold;&quot;&gt;套件（Package）&lt;/span&gt;的使用來解決。在Python中，套件的實體結構就是目錄，而每個套件目錄中必須放置一個&lt;span style=&quot;font-weight: bold;&quot;&gt;__init__.py&lt;/span&gt;檔案。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;[sys.path 之一]&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; |&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; [dir1]&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp;&amp;nbsp; |__init__.py&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |&amp;nbsp; &amp;nbsp; |mod.py&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp; |helper.py&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; | &amp;nbsp;&amp;nbsp; [subdir1]&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; |__init__.py&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; |ooo.py&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; [dir2]&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; |__init__.py&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; |mod.py&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
每個套件資料夾都要有一個__init__.py。在上面的例子中，若要在程式中使用dir1/mod.py模組檔案，則可以：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;import dir1.mod&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(dir1.mod.name)&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
在上例中，假設&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;mod中有個name&lt;/span&gt;變數，則要取用該變數，則是透過「套件.模組.變數」的方式來取得，透過套件階層的安排，可以為模組分門別類，在程式中則使用「套件.模組」的方式來減少名稱衝突的問題，而若要檢閱模組，套件階層也有助於尋找出模組檔案的正確位置。&lt;br /&gt;
&lt;br /&gt;
若遇到套件階層名稱較長，例如&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;cc.openhome.web.mvc.xxxmodel這樣名稱，在程式中撰寫冗長，則可以透過import as來讓程&lt;/span&gt;式便於撰寫。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;import cc.openhome.web.mvc.xxxmodel as xxxmodel&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;xxxmodel.dosome()&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
或者是透過from import在目前模組中建立想要存取的變數名稱即可。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;from cc.openhome.web.mvc.xxxmodel import dosome&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;dosome()&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
在Python中，如果為同一套件中的模組檔案，無需時完整&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;import&lt;/span&gt;語法來匯入模組，而可以透過相對匯入語法來彼此匯入。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;from .helper import func1&lt;br /&gt;
func1()&lt;br /&gt;
&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
注意，在上面的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;from&lt;/span&gt;語句後面的模組名稱前有個 &lt;span style=&quot;font-weight: bold;&quot;&gt;. &lt;/span&gt;，這表示相對匯入同一套件中的helper.py模組檔案，從而避免了必須從&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.path&lt;/span&gt;中尋找，以及在同一套件中模組彼此引用的語法冗長。&lt;br /&gt;
&lt;br /&gt;
每個套件目錄中都必須有個__init__.py，當你匯入套件時，該套件目錄中的__init__.py也會被執行，你可以在其中作一些匯入套件時所必須進行的初始化動作。&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/1446579069809736911/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4363.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/1446579069809736911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/1446579069809736911'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4363.html' title='匯入套件'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-5481319548046591269</id><published>2011-09-10T14:01:00.003-07:00</published><updated>2011-09-10T14:01:54.872-07:00</updated><title type='text'>import、import as、from import</title><content type='html'>&lt;small&gt;接續&lt;/small&gt; &lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/ImportModule.html&quot;&gt;&lt;small&gt;匯入模組&lt;/small&gt;&lt;/a&gt;&lt;small&gt;，使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;import&lt;/span&gt;匯入模組，會以被匯入的模組名稱在當前模組命名一個同名的名稱，被匯入模組中的變數，其實是以被匯入模組為名稱空間。例如，若有個some.py：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;name = &#39;Justin&#39;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;若你匯入some模組，要存取some模組中的name變數，則必須使用some.name。事實上，你可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;del&lt;/span&gt;刪除與被匯入模組同名的變數：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;import some
print(some.name)  # Justin
&lt;span style=&quot;font-weight: bold;&quot;&gt;del some&lt;/span&gt;
print(some.name)  # NameError: name &#39;some&#39; is not defined&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
上例中，於del some後，由於目前模組中已沒有some變數，因而發生錯誤。你可以在del與被匯入模組同名的變數，之後再度使用import設回該變數。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;import some
print(some.name)  # Justin
&lt;span style=&quot;font-weight: bold;&quot;&gt;del some&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;import some&lt;/span&gt;
print(some.name)  # Justin
      &lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
再次匯入模組，可以設回與被匯入模組的同名變數，但不會再度執行被匯入模組，import模組時只會執行模組一次，再次import是不會再度執行模組的。&lt;br /&gt;
&lt;br /&gt;
如果想要知道現在到底匯入了多少模組，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;sys.modules&lt;/span&gt;得知，這是個字典物件。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; sys.modules.keys()&lt;/span&gt;&lt;br /&gt;
dict_keys([&#39;heapq&#39;, &#39;sre_compile&#39;, &#39;_collections&#39;, &#39;locale&#39;, &#39;_multibytecodec&#39;,&lt;br /&gt;
&#39;functools&#39;, &#39;encodings&#39;, &#39;site&#39;, &#39;operator&#39;, &#39;io&#39;, &#39;__main__&#39;, &#39;copyreg&#39;, &#39;_hea&lt;br /&gt;
pq&#39;, &#39;_weakref&#39;, &#39;abc&#39;, &#39;builtins&#39;, &#39;errno&#39;, &#39;itertools&#39;, &#39;sre_constants&#39;, &#39;re&#39;,&lt;br /&gt;
&amp;nbsp;&#39;encodings.latin_1&#39;, &#39;collections&#39;, &#39;ntpath&#39;, &#39;_sre&#39;, &#39;nt&#39;, &#39;genericpath&#39;, &#39;sta&lt;br /&gt;
t&#39;, &#39;zipimport&#39;, &#39;_codecs&#39;, &#39;_bisect&#39;, &#39;encodings.utf_8&#39;, &#39;sys&#39;, &#39;codecs&#39;, &#39;os.p&lt;br /&gt;
ath&#39;, &#39;_functools&#39;, &#39;_locale&#39;, &#39;keyword&#39;, &#39;bisect&#39;, &#39;_codecs_tw&#39;, &#39;signal&#39;, &#39;wea&lt;br /&gt;
kref&#39;, &#39;_io&#39;, &#39;_weakrefset&#39;, &#39;encodings.cp950&#39;, &#39;encodings.aliases&#39;, &#39;sre_parse&#39;&lt;br /&gt;
, &#39;os&#39;, &#39;_abcoll&#39;])&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;如果你使用del刪除某個與被匯入模組同名的變數，並不會&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;影響&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.modules。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import sys
import some
print(some.name)     # Justin
del some
print(&lt;span style=&quot;font-weight: bold;&quot;&gt;sys.modules[&#39;some&#39;]&lt;/span&gt;.name)  # Justin
print(some.name)    # NameError: name &#39;some&#39; is not defined&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
如果你想要改變被匯入模組在當前模組中的變數名稱，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;import as&lt;/span&gt;。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;import some as other&lt;/span&gt;
print(other.name)   # Justin&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
import as改變的是被匯入模組在當前模組的名稱，而不是sys.modules中的名稱，以上例來說，sys.modules中的名稱仍然是some。上例比較像是：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;import some&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;other = some&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;del some&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(other.name)&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;from  import語&lt;/span&gt;句&lt;span style=&quot;font-weight: bold;&quot;&gt;「複製」&lt;/span&gt;出模組中的名稱。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import some
from some import name

print(name)            # Justin
print(some.name)       # Justin

name = &#39;caterpillar&#39;  
print(name)            # caterpillar
print(some.name)       # Justin&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
上例比較像是：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;import some&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;name = some.name&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(name)&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(some.name)&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;name = &#39;caterpillar&#39;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(name)&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(some.name)&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;你可以一次匯入兩個以上的名稱，例如：&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;from  some import x, y&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
或者是將模組中的名稱全部匯入，例如：&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;from some import *&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;Python&lt;/span&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;是個不斷演進的語言，有些新語法或功能會不相容於舊版本&lt;/span&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;Python，甚至破壞舊版本Python原本的功能，如果你想要體驗一下將來版本可能有的新語法或功能，則可以透過&lt;span style=&quot;font-weight: bold;&quot;&gt;__future__&lt;/span&gt;模組。例如在Python 2.6中，print是個陳述句，而在Python 3中，print是個函式，若要在Python 2.6中使用Python 3中的print函式，則可以：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;small&gt;&lt;span style=&quot;font-family: monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;from __future__ import print_function&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/5481319548046591269/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/importimport-asfrom-import.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/5481319548046591269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/5481319548046591269'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/importimport-asfrom-import.html' title='import、import as、from import'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-7088308811824921032</id><published>2011-09-10T14:01:00.001-07:00</published><updated>2011-09-10T14:01:12.509-07:00</updated><title type='text'>匯入模組</title><content type='html'>&lt;small&gt;接續&lt;/small&gt; &lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/ModuleABC.html&quot;&gt;簡介模組&lt;/a&gt; 的內容。&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;sys.path&lt;/span&gt;陣列中的字串元素其實是由幾個來源所組成：所執行檔案（模組）的所在目錄、&lt;span style=&quot;font-weight: bold;&quot;&gt;PYTHONPATH&lt;/span&gt;環境變數的內容、標準程式庫搜尋目錄、&lt;span style=&quot;font-weight: bold;&quot;&gt;.pth&lt;/span&gt;檔案中所列出的目錄。&lt;br /&gt;
&lt;br /&gt;
例如，若在Windows上，有個模組檔案位於C:\workspace，而Python安裝於C:\winware\python31：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;import sys
print(sys.path)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
若你如下執行程式：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;C:\workspace&amp;gt;c:\winware\python31\python demo.py&lt;br /&gt;
&lt;/span&gt;[&#39;C:\\workspace&#39;, &#39;C:\\Windows\\system32\\python31.zip&#39;, &#39;c:\\winware\\python31\&lt;br /&gt;
\DLLs&#39;, &#39;c:\\winware\\python31\\lib&#39;, &#39;c:\\winware\\python31\\lib\\plat-win&#39;, &#39;c&lt;br /&gt;
:\\winware\\python31&#39;, &#39;c:\\winware\\python31\\lib\\site-packages&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
C:\workspace&amp;gt;set PYTHONPATH=C:\lib&lt;br /&gt;
&lt;br /&gt;
C:\workspace&amp;gt;c:\winware\python31\python demo.py&lt;br /&gt;
&lt;/span&gt;[&#39;C:\\workspace&#39;, &#39;C:\\lib&#39;, &#39;C:\\Windows\\system32\\python31.zip&#39;, &#39;c:\\winware&lt;br /&gt;
\\python31\\DLLs&#39;, &#39;c:\\winware\\python31\\lib&#39;, &#39;c:\\winware\\python31\\lib\\pl&lt;br /&gt;
at-win&#39;, &#39;c:\\winware\\python31&#39;, &#39;c:\\winware\\python31\\lib\\site-packages&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
C:\workspace&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
C:\\workspace是所執行檔案所在目錄、C:\\lib是PYTHONPATH的設定內容，其它是標準程式庫搜尋目錄，至於.pth檔案所列出的目錄，是指你可以在&lt;span style=&quot;font-weight: bold;&quot;&gt;Python安裝目錄&lt;/span&gt;，或者是安裝目錄的&lt;span style=&quot;font-weight: bold;&quot;&gt;lib\site-packages&lt;/span&gt;目錄中建立.pth檔案，當中一行一行列出搜尋模組檔案的目錄，如果該目錄確實存在，則會列為&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sys.path&lt;/span&gt;的內容。例如，若在C:\winware\python31中放置mydir.pth，內容如下：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;C:\lib2
C:\lib3&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
而在c:\winware\python31\lib\site-packages中放置一個mydir.pth，內容如下：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;C:\lib4
C:\lib5&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
如果所列的目錄確實存在，則再度執行demo.py，會顯示如下：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;C:\workspace&amp;gt;c:\winware\python31\python demo.py&lt;br /&gt;
&lt;/span&gt;[&#39;C:\\workspace&#39;, &#39;C:\\lib&#39;, &#39;C:\\Windows\\system32\\python31.zip&#39;, &#39;C:\\Winware&lt;br /&gt;
\\Python31\\DLLs&#39;, &#39;C:\\Winware\\Python31\\lib&#39;, &#39;C:\\Winware\\Python31\\lib\\pl&lt;br /&gt;
at-win&#39;, &#39;C:\\Winware\\Python31&#39;, &#39;C:\\lib2&#39;, &#39;C:\\lib3&#39;, &#39;C:\\Winware\\Python31&lt;br /&gt;
\\lib\\site-packages&#39;, &#39;C:\\lib4&#39;, &#39;C:\\lib5&#39;]&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
C:\workspace&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;會在sys.path中尋找.py或已編譯的.pyc，如果.py尚未編譯則編譯為.pyc，而後載入執行一次，再次&lt;/span&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;同一個模組並不會再執行一次模組，如果找到.py與.pyc，而.pyc的版本並沒有比.py舊，則略過編譯直接執行，如果僅找到.pyc而沒有找到.py，也會直接執行。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
在執行時期，你可以動態地改變sys.path的內容，來改變搜尋模組的路徑。例如，若有個superman.py放在C:\library中，而superman.py的內容如下：&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;print(&#39;superman modulle&#39;)
name = &#39;Justin&#39;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
而你執行的檔案為：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import sys
print(sys.path, end=&#39;\n\n&#39;)

sys.path.append(&#39;c:\library&#39;)
print(sys.path, end=&#39;\n\n&#39;)

import superman
print(superman.name)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
則執行的結果會是：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;C:\workspace&amp;gt;c:\winware\python31\python demo.py&lt;br /&gt;
&lt;/span&gt;[&#39;C:\\workspace&#39;, &#39;C:\\lib&#39;, &#39;C:\\Windows\\system32\\python31.zip&#39;, &#39;C:\\Winware&lt;br /&gt;
\\Python31\\DLLs&#39;, &#39;C:\\Winware\\Python31\\lib&#39;, &#39;C:\\Winware\\Python31\\lib\\pl&lt;br /&gt;
at-win&#39;, &#39;C:\\Winware\\Python31&#39;, &#39;C:\\Winware\\Python31\\lib\\site-packages&#39;]&lt;br /&gt;
&lt;br /&gt;
[&#39;C:\\workspace&#39;, &#39;C:\\lib&#39;, &#39;C:\\Windows\\system32\\python31.zip&#39;, &#39;C:\\Winware&lt;br /&gt;
\\Python31\\DLLs&#39;, &#39;C:\\Winware\\Python31\\lib&#39;, &#39;C:\\Winware\\Python31\\lib\\pl&lt;br /&gt;
at-win&#39;, &#39;C:\\Winware\\Python31&#39;, &#39;C:\\Winware\\Python31\\lib\\site-packages&#39;, &#39;&lt;br /&gt;
c:\\library&#39;]&lt;br /&gt;
&lt;br /&gt;
superman modulle&lt;br /&gt;
Justin&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
C:\workspace&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
Python的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;import&lt;/span&gt;是執行時期的運算，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;import&lt;/span&gt;某個模組，就會執行該模組中定義的內容，被&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;import的模組名稱會成為目前模組的變數，而被import的模組中的變數，就是以被import模組名稱為名稱空間。&lt;/span&gt;&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/7088308811824921032/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_284.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7088308811824921032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7088308811824921032'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_284.html' title='匯入模組'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-8045788637851496636</id><published>2011-09-10T13:45:00.000-07:00</published><updated>2011-09-10T13:45:16.263-07:00</updated><title type='text'>物件相等性</title><content type='html'>如&lt;small&gt;果你定義了類別時沒有定義&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__eq__()&lt;/span&gt;方法，則預設使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;==&lt;/span&gt;比較兩個實例時，會得到與使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;is&lt;/span&gt;比較相同的結果。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = Some()&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s2 = Some()&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 == s2&lt;/span&gt;&lt;br /&gt;
False&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s3 = s1&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 == s3&lt;/span&gt;&lt;br /&gt;
True&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;你可以定義_&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;_eq__()方法，來定義使用==&lt;/span&gt;運算時的實質比較結果。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def __eq__(self, that):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        if not isinstance(that, Point):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return False&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        return self.x == that.x and self.y == that.y&lt;/span&gt;

p1 = Point(1, 1)
p2 = Point(1, 1)
print(p1 == p2)    # True
print(p1 is p2)    # False&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
如果你試圖將以上定義的Point實例置入集合物件，則會發生錯誤：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;pset = {p1} # TypeError: unhashable type: &#39;Point&#39;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
要將實例置入Python的集合物件，該實例必須定義&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__hash__()&lt;/span&gt;方法。&lt;/small&gt;&lt;small&gt;在許多場合，例如將物件加入一些群集 （Collection）時，會同時利用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__eq__()與__hash__()來判斷是否加入的是（實質上）相同的物件。&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;來看看定義__hash__()時必須遵守的約定（&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;取自java.lang.Object的&lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29&quot;&gt;hashCode()  說明&lt;/a&gt; &lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;）：&lt;/small&gt;       &lt;ul style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;li&gt;&lt;small&gt;在同一個應用程式執行期間，對同一物件呼叫 __hash__()方法，必須回傳相同的整數結果。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;如果兩個物件使用__eq__()測試 結果為相等, 則這兩個物件呼叫__hash__()時，必須獲得相同的整數結果。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;如果兩個物件使用 __eq__()測試結果為不相等, 則這兩個物件呼叫__hash__()時，可以獲得不同的整數結果。&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;以集合物件為例，會先使用__hash__()得出該將物件放至哪個雜湊桶（Hash buckets）中，如果&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;雜 湊桶有物件，再進一步使用__eq__()確定實質相等性，從而確定集合中不會有重複的物件。以下是定義了__hash__()的Point版本：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __eq__(self, that):
        if not isinstance(that, Point):
            return False
        return self.x == that.x and self.y == that.y
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def __hash__(self):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        return 41 * (41 + self.x) + self.y&lt;/span&gt;

p1 = Point(1, 1)
p2 = Point(1, 1)
pset = {p1}
print(p2 in pset)    # True&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;一個重要的觀念是，定義&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__eq__()與__hash__()&lt;/span&gt;時，最好 別使用狀態會改變的資料成員&lt;/span&gt;。你可能會想，以這個例子來說，點會移動，如果移動了就不是相同的點了，不是嗎？若&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x、y&lt;/span&gt;是個允許會變動的成 員，那麼就會發生這個情況：&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;p1 = Point(1, 1)&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;pset = {p1}&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(p1 in pset)&amp;nbsp;&amp;nbsp;&amp;nbsp; # True&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;p1.x = 2&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(p1 in pset)&amp;nbsp;&amp;nbsp;&amp;nbsp; # False&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;明 明是記憶體中同一個物件，但置入集合後，最後跟我說不包括p1？這是因為，你改變了x，算出來的__hash__()也就改變了，使用in嘗試比對時，會看看新算出來的雜湊桶中是不是有物件，而根本不是置入p1的雜湊桶中尋找，結果就是False了。&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;       &lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;一個限制修改不可變動成員的方式，是定義__setattr__()方法。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def __setattr__(self, name, value):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        if not name in self.__dict__:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            self.__dict__[name] = value&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        elif name == &#39;x&#39; or name == &#39;y&#39;:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            raise TypeError(&#39;Point(x, y) is immutable&#39;)&lt;/span&gt;
    
    def __eq__(self, that):
        if not isinstance(that, Point):
            return False
        return self.x == that.x and self.y == that.y
        
    def __hash__(self):
        return 41 * (41 + self.x) + self.y

p1 = Point(1, 1)
p2 = Point(1, 1)
pset = {p1}
print(p1 in pset)
&lt;span style=&quot;font-weight: bold;&quot;&gt;p1.x = 2   # TypeError: Point(x, y) is immutable&lt;/span&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;再來看看在實作__eq__()時要遵守的約定（&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;取自java.lang.Object的 &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals%28java.lang.Object%29&quot;&gt;equals()  說明&lt;/a&gt; &lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;）：&lt;/small&gt;       &lt;ul style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;li&gt;&lt;small&gt;反身性 （Reflexive）：x == x的結果要是True。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;對稱性 （Symmetric）：x == y與y == x的結果必須相同。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;傳遞性 （Transitive）：x == y、y == z的結果都是True，則x == z的結果也必須是True。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;一 致性（Consistent）：同一個執行期間，對x == y的多次呼叫，結果必須相同。&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;對 任何非None的x，x == None必須傳回False。&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;目前定義的Point，其__eq__()方法滿足以上幾個約定（你可以自行寫程式測試）。現在考慮繼承的情況，你要定義&lt;/small&gt;&lt;small&gt;3D&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;的點：&lt;/small&gt;&lt;br /&gt;
&lt;pre&gt;class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def __eq__(self, that):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        if not isinstance(that, Point):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return False&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        return self.x == that.x and self.y == that.y&lt;/span&gt;
        

class Point3D(Point):
    def __init__(self, x, y, z):
        super(Point3D, self).__init__(x, y)
        self.z = z
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def __eq__(self, that):        &lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        if not isinstance(that, Point3D):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return False&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        return super(Point3D, self).__eq__(that) and self.z == that.z&lt;/span&gt;
        
        
p1 = Point(1, 1)
p2 = Point3D(1, 1, 1)

print(p1 == p2)&lt;/pre&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;在繼承的情況下，若==兩旁運算元有一個是子類別實例，則會使用子類別的__eq__()版本進行比對&lt;/span&gt;。在上面的定義之下，直接將&lt;/small&gt;&lt;small&gt;2D與3D&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;的點視作不同的類型&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;，這避免了&lt;/small&gt;&lt;small&gt;2D點與3D&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;點（父、子類別）進行比較時，無法符合對稱性、傳遞性合約的問題。&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/8045788637851496636/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_2876.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/8045788637851496636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/8045788637851496636'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_2876.html' title='物件相等性'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-675382497803410394</id><published>2011-09-10T13:43:00.003-07:00</published><updated>2011-09-10T13:43:56.944-07:00</updated><title type='text'>抽象類別</title><content type='html'>&lt;small&gt;定義類別，本身就是在進行抽象化，如果一個類別定義時不完整，有些狀態或行為必須留待子類別來具體實現，則它是個&lt;span style=&quot;font-weight: bold;&quot;&gt;抽象類別（Abstract Class）&lt;/span&gt;。例如，在定義銀行帳戶時，你也許想將 一些帳戶的共同狀態與行為定義在父類別中：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;class Account:
    def withdraw(self, amount):
        if amount &amp;gt;= self.balance:
            self.balance -= amount
        else:
            raise ValueError(&#39;餘額不足&#39;)

    def __str__(self):
        return (&#39;Id:\t\t&#39; + self.id +
               &#39;\nName:\t\t&#39; + self.name +
               &#39;\nBalance:\t&#39; + str(self.balance))&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
顯然地，這個類別的定義不完整，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;self.id、&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;self.name、&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;self.balance&lt;/span&gt;沒有定義，嘗試使用這個類別進行操作時，就會發生直譯錯誤：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;acct = Account()&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;print(acct)&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;       &lt;br /&gt;
你可以繼承這個類別來實作未完整的定義：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class CheckingAccount(Account):
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.balance = 0
        self.overdraftlimit = 30000

    def withdraw(self, amount):
        if amount &amp;lt;= self.balance + self.overdraftlimit:
            self.balance -= amount
        else:
            raise ValueError(&#39;超出信用&#39;)

    def __str__(self):
        return (super(CheckingAccount, self).__str__() + 
                &#39;\nOverdraft limit\t&#39; + str(self.overdraftlimit));
                
acct = CheckingAccount(&#39;E1223&#39;, &#39;Justin Lin&#39;)
print(acct)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;現在的問題是，實際上開發人員還是可以用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Account()實例化，也許您可以修改一下Account&lt;/span&gt;的定義：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;class Account:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__():&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise NotImplementedError(&quot;Account is abstract&quot;)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...略&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
如此，嘗試使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Account()&lt;/span&gt;實例化後，在初始化方法中就會引發錯誤（不過，實際上&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Account&lt;/span&gt;實例確實有產生了，但就這邊的需求來說，目的算已達到）。&lt;br /&gt;
&lt;br /&gt;
像Python這類的動態語言，沒有Java的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;abstract&lt;/span&gt;或&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;interface&lt;/span&gt;這種機制來規範一個類別所需實作的介面，遵循物件之間的協定基本上是開發 人員的自我約束（當然，還得有適當的說明文件）。如果你非得有個方式，強制實現某個公開協定，那該怎麼作？像上面一樣，藉由直譯錯誤是一種方式，實際上&lt;/small&gt;&lt;small&gt;視你的需求而定（是否可實例化、子類別是否定義初始化方法等），&lt;/small&gt;&lt;small&gt;還有許多模擬的方式，不過在Python中，可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;Meta class&lt;/span&gt;與&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;@abstractmethod&lt;/span&gt;來達到規範的需求。&lt;br /&gt;
&lt;br /&gt;
舉個例子來說，&lt;/small&gt;&lt;small&gt;您想要設計一個猜數字遊戲，&lt;/small&gt;&lt;small&gt;猜數字遊戲的流程大致就是：&lt;/small&gt;&lt;br /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;顯示訊息（&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;歡迎&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;）&lt;br /&gt;
隨 機產生數字&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;遊戲迴圈&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;顯示訊息（&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;提示使用者輸入&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;）&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp;  取得使用者輸入&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp; &amp;nbsp; 比較是否猜中&lt;/span&gt;&lt;/small&gt;&amp;nbsp; &amp;nbsp;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;顯示訊息（&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;輸入正確與否&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;）&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;
&lt;small&gt;在描述流程輸廓時，並沒有提及如何顯示訊息、沒有提及如何取得使用者輸 入等具體的作法，只是&lt;span style=&quot;font-weight: bold;&quot;&gt;歸納出一些共同的流程步驟&lt;/span&gt;：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import random
&lt;span style=&quot;font-weight: bold;&quot;&gt;from abc import ABCMeta, abstractmethod&lt;/span&gt;

class GuessGame(&lt;span style=&quot;font-weight: bold;&quot;&gt;metaclass=ABCMeta&lt;/span&gt;):
&lt;span style=&quot;font-weight: bold;&quot;&gt;    @abstractmethod&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def message(self, msg):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        pass&lt;/span&gt;

&lt;span style=&quot;font-weight: bold;&quot;&gt;    @abstractmethod&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def guess(self):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        pass&lt;/span&gt;    &amp;nbsp;

    def go(self):
        self.message(self.welcome)
        number = int(random.random() * 10)
        while True:
            guess = self.guess();
            if guess &amp;gt; number:
                self.message(self.bigger)
            elif guess &amp;lt; number:
                self.message(self.smaller)
            else:
                break
        self.message(self.correct)&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;現在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;GuessGame是&lt;/span&gt;個抽象類別，如果你嘗試實例化&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;GuessGame&lt;/span&gt;：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;game = GuessGame()&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;則會引發錯誤：&lt;/small&gt;&lt;br /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;TypeError: Can&#39;t instantiate abstract class GuessGame with abstract methods gues&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;s, message&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;如果是個文字模式下的猜數字遊戲，可以將顯示訊息、取得使用者輸入等以文字模式下的具體作法實現出來。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class ConsoleGame(GuessGame):
    def __init__(self):
        self.welcome = &quot;歡迎&quot;
        self.prompt = &quot;輸入數字：&quot;
        self.correct = &quot;猜中了&quot;
        self.bigger = &quot;你猜的比較大&quot;
        self.smaller = &quot;你猜的比較小&quot;
    
    def message(self, msg):
        print(msg)
    
    def guess(self):
        return int(input(self.prompt))

game = ConsoleGame()
game.go()&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
如果子類別忘了實作某個方法，則該子類別仍被視為一個抽象類別，如果嘗試實例化抽象類別就會引發錯誤。例如若忘了實作&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;message()&lt;/span&gt;，就會發生以下錯誤：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;TypeError: Can&#39;t instantiate abstract class ConsoleGame with abstract methods message&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
所以，如果你真的想要模擬Java中&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;interface&lt;/span&gt;的作用，則可以定義一個抽象類別，完全沒有實作的方法即可。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import random
from abc import ABCMeta, abstractmethod

&lt;span style=&quot;font-weight: bold;&quot;&gt;class Flyer(metaclass=ABCMeta): # 就像是Java中的interface&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;    @abstractmethod&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;    def fly(self):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        pass&lt;/span&gt;

class Bird:
    pass
    
class Sparrow(Bird, Flyer):  # 就像Java中繼承Bird類別並實作Flyer介面
    def fly(self):
        print(&#39;麻雀飛&#39;)

s = Sparrow()
s.fly()&lt;/pre&gt;&lt;small&gt; &lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/675382497803410394/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_8685.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/675382497803410394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/675382497803410394'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_8685.html' title='抽象類別'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-6539414968763062708</id><published>2011-09-10T13:43:00.001-07:00</published><updated>2011-09-10T13:43:19.364-07:00</updated><title type='text'>繼承</title><content type='html'>&lt;small&gt;你建立了一個銀行帳戶類別：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;class Account:
    def __init__(self, id, name):
        self.id = id
        self.name = name
        self.balance = 0
        
    def deposit(self, amount):
        self.balance += amount
    
    def withdraw(self, amount):
        if amount &amp;gt;= self.balance:
            self.balance -= amount
        else:
            raise ValueError(&#39;餘額不足&#39;)

    def __str__(self):
        return (&#39;Id:\t\t&#39; + self.id +
               &#39;\nName:\t\t&#39; + self.name +
               &#39;\nBalance:\t&#39; + str(self.balance))&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;在這個類別中，雖然沒有聲明，但你已經使用了繼承，在Python中，所有類別都繼承自&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;object&lt;/span&gt;類別。上例其實相當於：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;class Account(object):&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...略&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
在Python中繼承的語法，是在類別名稱旁使用括號表明要繼承的父類別。例如，&lt;/small&gt;&lt;small&gt;你為以上的類別建立了一個支票帳戶：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class CheckingAccount(&lt;span style=&quot;font-weight: bold;&quot;&gt;Account&lt;/span&gt;):
    def __init__(self, id, name):
        &lt;span style=&quot;font-weight: bold;&quot;&gt;super(CheckingAccount, self).__init__(id, name)&lt;/span&gt; # 呼叫父類別__init__()
        self.overdraftlimit = 30000

    def withdraw(self, amount):
        if amount &amp;lt;= self.balance + self.overdraftlimit:
            self.balance -= amount
        else:
            raise ValueError(&#39;超出信用&#39;)

    def __str__(self):
        return (&lt;span style=&quot;font-weight: bold;&quot;&gt;super(CheckingAccount, self).__str__()&lt;/span&gt; + 
                &#39;\nOverdraft limit\t&#39; + str(self.overdraftlimit));&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
在上例中，你繼承了Account來定義一個CheckingAccount子類別。如果在子類別中，需要呼叫父類別的某個方法，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;super()&lt;/span&gt;指定類別名稱與物件，這會將目前實例綁定至所指定父類別方法的第一個引數。&lt;br /&gt;
&lt;br /&gt;
在上例中，你重新定義了withdraw()與__str__()方法，在操作實例方法時，是從子類別開始尋找是否有定義，否則就搜尋父類別中是否有定義方法。所以：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;acct = CheckingAccount(&#39;E1234&#39;, &#39;Justin Lin&#39;)&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(acct, end=&#39;\n\n&#39;)&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;acct.deposit(1000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 使用 Account 的 deposit() 定義&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(acct, end=&#39;\n\n&#39;)&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;acct.withdraw(2000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt; 使用 CheckingAccount 的 withdraw() 定義&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(acct, end=&#39;\n\n&#39;)&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在呼叫acct的deposit()方法時，由於CheckingAccount並沒有定義，所以呼叫的是Account的deposit()，而呼叫withdraw()時，則是使用CheckingAccount上有定義的withdraw()。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
在Python中，可以進行多重繼承，這個時候要注意搜尋的順序，是從子類別開始，接著是同一階層父類別由左至右搜尋，再至更上層同一階層父類別由左至右搜尋，直到達到頂層為止。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class A(object):
    def method1(self):
        print(&#39;A.method1&#39;)
        
    def method2(self):
        print(&#39;A.method2&#39;)
        
class B(A):
    def method3(self):
        print(&#39;B.method3&#39;)
        
class C(A):
    def method2(self):
        print(&#39;C.method2&#39;)
        
    def method3(self):
        print(&#39;C.method3&#39;)
        
class D(B, C):
    def method4(self):
        print(&#39;C.method4&#39;)

d = D()
d.method4() # 在 D 找到，C.method4
d.method3() # 以 D-&amp;gt;B 順序找到，B.method3
d.method2() # 以 D-&amp;gt;B-&amp;gt;C 順序找到，C.method2
d.method1() # 以 D-&amp;gt;B-&amp;gt;C-&amp;gt;A 順序找到，A.method1&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
在Python中，類別有個&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;__bases__&lt;/span&gt;特性，記錄著所繼承的父類別，__bases__&lt;/span&gt;是個 &lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/TupleType.html&quot;&gt;&lt;small&gt;Tuple&lt;/small&gt;&lt;/a&gt;&lt;/big&gt;，有趣的是，你可以改變&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__bases__&lt;/span&gt;來&lt;/small&gt;&lt;small&gt;動態改變繼承的父類別。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class A:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def method(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;A method&#39;)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; class B:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def method(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;B method&#39;)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; class C(A):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; c = C()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; c.method()&lt;br /&gt;
&lt;/span&gt;A method&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; C.__bases__&lt;br /&gt;
(&amp;lt;class &#39;__main__.A&#39;&amp;gt;,)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; C.__bases__ = (B,)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; c.method()&lt;br /&gt;
&lt;/span&gt;B method&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，C原本來繼承自A類別，透過修改__bases__實際參考的Tuple，C改變繼承B，而尋找特性或方法時，也就改尋找B父類別，因此最後執行的是從B繼承下來的method()。&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;       &lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/6539414968763062708/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_2526.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/6539414968763062708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/6539414968763062708'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_2526.html' title='繼承'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4981322333879563200</id><published>2011-09-10T13:42:00.001-07:00</published><updated>2011-09-10T13:42:32.633-07:00</updated><title type='text'>建構、初始與消滅</title><content type='html'>&lt;small&gt;在之前的文件中所提到的，&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__init__()&lt;/span&gt;方法是定義物件建立後初始化的流程，也就是執行到&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__init__()&lt;/span&gt;方法時，物件實際上已建構完成，傳入&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__init__()&lt;/span&gt;的引數，並不是作為建構物件之用，而是作為初始物件之用。&lt;br /&gt;
&lt;br /&gt;
實際上要決定如何建構物件，必須定義&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__new__()&lt;/span&gt;方法，這個方法的第一個參數總是傳入類別本身，之後可接任意參數作為建構物件之用。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__new__() 方法可以傳回物件，如果傳回的物件是第一個參數的類別實例，則會執行__init__()方法（如果有定義的話），而__init__()方法的第一個參 數綁定所傳回的物件。如果沒有傳回第一個參數的類別實例（傳回別的實例或None），則不會執行__init__()方法（即使有定義）。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
一個簡單測試建構與初始流程的例子如下所示：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                     &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __new__(clz, isClzInstance):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;__new__&#39;)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if isClzInstance:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return object.__new__(clz)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return None&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self, isClzInstance):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;__init__&#39;)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(isClzInstance)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Some(True)&lt;br /&gt;
&lt;/span&gt;__new__&lt;br /&gt;
__init__&lt;br /&gt;
True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Some(False)&lt;br /&gt;
&lt;/span&gt;__new__&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;由於若傳回__new__()第一個參數的類別實例，就會執行__init__()方法，所以__new__()與__init__()通常會具有相同個數的&lt;/span&gt;參數。&lt;/small&gt;&lt;small&gt;藉由定義__new__()方法，可以決定如何建構物件與初始物件，一個應用的例子，就是實作 &lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/DesignPattern/SingletonPattern.htm&quot;&gt;Singleton  模式&lt;/a&gt;&lt;/small&gt;&lt;small&gt;。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;pre&gt;class Singleton:
    __single = None
    def __new__(clz):
        if not Singleton.__single:
            Singleton.__single = object.__new__(clz)
        return Singleton.__single
        
    def doSomething(self):
        print(&quot;do something...XD&quot;)

singleton1 = Singleton()
singleton1.doSomething()  # do something...XD

singleton2 = Singleton()
singleton2.doSomething()  # do something...XD

print(singleton1 is singleton2)  # True&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
在上面的程式中，一旦&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Singleton.__single&lt;/span&gt;有參考至物件，則直接傳回，從客戶端的角度則如常執行&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Singleton()&lt;/span&gt;來建構物件，但實際上傳回的都會是同一個物件（&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;由於傳回的是Singleton實例，所以若有定義__init__()則會被執行，就單例物件來說，可於__init__()中進行狀態的回復&lt;/span&gt;）。&lt;br /&gt;
&lt;br /&gt;
如果要定義物件被垃圾收集（Garbage collection）時，所要進行的資源清除動作，則可以定義&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__del__()&lt;/span&gt;方法，物件會被資源回收的資格，基本上就是參考至物件的變數計數為0的時候。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                     &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __del__(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;__del__&#39;)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = None&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;__del__&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s1 = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s2 = s1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del s1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del s2&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;__del__&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，將s參考至None時，原先所參考的物件其變數計數就為0，所以在回收物件前執行了__del__()，而使用del刪除s1時，s2仍參考至物件，直到s2也被del刪除，物件符合回收資格，回收物件前執行了__del__()。&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4981322333879563200/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_6800.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4981322333879563200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4981322333879563200'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_6800.html' title='建構、初始與消滅'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4555551560052272310</id><published>2011-09-10T13:41:00.001-07:00</published><updated>2011-09-10T13:41:23.427-07:00</updated><title type='text'>特殊方法名稱</title><content type='html'>&lt;small&gt;在Python中定義類別時，有些&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__name__&lt;/span&gt;的特殊函式名稱，是用定義運算子或特定操作的行為。舉個例子來說，可以定義一個有理數類別，並定義其+、-、*、/等行為：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;class Rational:
    def __init__(self, n, d):  # 物件建立之後所要建立的初始化動作
        self.numer = n
        self.denom = d
    
    def __str__(self):   # 定義物件的字串描述
        return str(self.numer) + &#39;/&#39; + str(self.denom)
    
    def __add__(self, that):  # 定義 + 運算
        return Rational(self.numer * that.denom + that.numer * self.denom, 
                        self.denom * that.denom)
    
    def __sub__(self, that):  # 定義 - 運算
        return Rational(self.numer * that.denom - that.numer * self.denom,
                        self.denom * that.denom)
                           
    def __mul__(self, that):  # 定義 * 運算
        return Rational(self.numer * that.numer, 
                        self.denom * that.denom)
        
    def __truediv__(self, that):   # 定義 / 運算
        return Rational(self.numer * that.denom,
                        self.denom * that.denom)

    def __eq__(self, that):   # 定義 == 運算
        return self.numer * that.denom == that.numer * self.denom

x = Rational(1, 2)
y = Rational(2, 3)
z = Rational(2, 3)
print(x)       # 1/2
print(y)       # 2/3
print(x + y)   # 7/6
print(x - y)   # -1/6
print(x * y)   # 2/6
print(x / y)   # 3/6
print(x == y)  # False
print(y == z)  # True&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;__init__()&lt;/span&gt;定義物件建立後要執行的初始化過程，相對它的是&lt;span style=&quot;font-weight: bold;&quot;&gt;__del__()&lt;/span&gt;方法，在物件被回收前會被執行（因為回收物件的時間不一定，所以不建議用在要求立即性的情況）。常見的+、-、*、/、==等操作，則分別是由&lt;span style=&quot;font-weight: bold;&quot;&gt;__add__()&lt;/span&gt;、&lt;span style=&quot;font-weight: bold;&quot;&gt;__sub__()&lt;/span&gt;、&lt;span style=&quot;font-weight: bold;&quot;&gt;__mul__()&lt;/span&gt;、&lt;span style=&quot;font-weight: bold;&quot;&gt;__truediv__()&lt;/span&gt;（//則是由&lt;span style=&quot;font-weight: bold;&quot;&gt;__floordiv__()&lt;/span&gt;定義）與&lt;span style=&quot;font-weight: bold;&quot;&gt;__eq__()&lt;/span&gt;定義。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;__str__()&lt;/span&gt;用來定義傳回物件描述字串，通常用來描述的字串是對使用者友善的說明文字，如果對物件&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;使用str()，所呼叫的就是__str__()。如果要定義對開發人員較有意義的描述，例如傳回產生實例的類別名稱之類的，則可以定義&lt;span style=&quot;font-weight: bold;&quot;&gt;__repr__()&lt;/span&gt;，如果對物件使用repr()，則所呼叫的就是__repr__()。&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
在 &lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/PropertyNameSpace.html&quot;&gt;&lt;small&gt;特性名稱空間&lt;/small&gt;&lt;/a&gt;&lt;/big&gt; 中看過的例子則是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;__getattr__()&lt;/span&gt;方法，相對它的方法是&lt;span style=&quot;font-weight: bold;&quot;&gt;__setattr__()&lt;/span&gt;&lt;/span&gt;，而用來定義實例的特性被設定時該作什麼動作。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __setattr__(self, name, value):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(name, value)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.x = 10&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&lt;/span&gt;x 10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.w = 100&lt;br /&gt;
&lt;/span&gt;w 100&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.__dict__[&#39;z&#39;] = 200&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;z&#39;: 200}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;一旦有定義__setattr__()，則所有以&lt;span style=&quot;font-weight: bold;&quot;&gt; . &lt;/span&gt;運算子來設定特性的操作，都會呼叫__setattr__()，但直接對實例的__dict__操作則不會。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;__getitem__()&lt;/span&gt;與&lt;span style=&quot;font-weight: bold;&quot;&gt;__setitem__()&lt;/span&gt;則用來設定[]運算子的行為。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.inner = {}&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __setitem__(self, name, value):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.inner[name] = value&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __getitem__(self, name):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self.inner[name]&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s[0] = 100&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s[&#39;Justin&#39;] = &#39;Message&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s[0]&lt;br /&gt;
&lt;/span&gt;100&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s[&#39;Justin&#39;]&lt;br /&gt;
&lt;/span&gt;&#39;Message&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在設計程式的過程中，經常有的需求之一，就是希望逐一取得某物件內部的所有資料（或物件），像是取得串列中所有的資料，或取 得集合中所有的資料。&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;br /&gt;
因為串列是有序結構並有索引特性，而集合則為無序不重複的特性，兩者所提供的公開存取方法也不相同，&lt;/small&gt;&lt;small&gt;如 何以一致方式取得不同資料結構的群集物件是個問題。&lt;br /&gt;
&lt;br /&gt;
在Python中，你可以讓物件實作&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__iter__()&lt;/span&gt;方法，這個方法可以傳回一個迭代器（Iterator），一個具有&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__next__()&lt;/span&gt;方法的物件。迭代器走訪物件內容收集物件後傳回，每次呼叫迭代器物件的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__next__()&lt;/span&gt;方法，必須傳回群集的下一個元素，如果沒有下一個元素了，則丟出&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;StopIteration&lt;/span&gt;物件。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Some:
    class Iterator:
        def __init__(self, length):
            self.length = length
            self.number = -1
        &lt;span style=&quot;font-weight: bold;&quot;&gt;def __next__(self):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            self.number = self.number + 1&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            if self.number == self.length:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;                raise StopIteration&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return self.number&lt;/span&gt;
    
    def __init__(self, length):
        self.length = length

    &lt;span style=&quot;font-weight: bold;&quot;&gt;def __iter__(self):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        return Some.Iterator(self.length)&lt;/span&gt;

s = Some(3)
it = &lt;span style=&quot;font-weight: bold;&quot;&gt;iter(s)&lt;/span&gt;
print(&lt;span style=&quot;font-weight: bold;&quot;&gt;next(it)&lt;/span&gt;)   # 0
print(next(it))   # 1
print(next(it))   # 2
print(next(it))   # StopIteration&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
實際上，你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;iter()&lt;/span&gt;來代為呼叫物件的__iter__()方法，使用&lt;span style=&quot;font-weight: bold;&quot;&gt;next()&lt;/span&gt;方法代為呼叫物件的__next__()方法&lt;/span&gt;。事實上，你&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;可以結合for in迴圈來提取物件，for in迴圈會透過__iter__()取得迭代器，然後在每次迴圈中呼叫__next__()方法，而後遇到StopIteration丟出後離開迴圈。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;for n in Some(10):&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt; &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(n)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 顯示 0 到 9&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;以上先簡介一些簡單的特殊方法名稱，詳細的特殊方法說明，可以參考 &lt;a href=&quot;http://docs.python.org/dev/3.0/reference/datamodel.html#specialnames&quot;&gt;Special method names&lt;/a&gt;。&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4555551560052272310/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4018.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4555551560052272310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4555551560052272310'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4018.html' title='特殊方法名稱'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-8625703172161653408</id><published>2011-09-10T13:40:00.001-07:00</published><updated>2011-09-10T13:40:42.121-07:00</updated><title type='text'>特性名稱空間</title><content type='html'>&lt;small&gt;一個事實是：&lt;span style=&quot;font-weight: bold;&quot;&gt;類別（Class）或實例（Instance）本身的作用是作為特性（Property）的名稱空間（Namespace）&lt;/span&gt;。類別或實例本身會擁有一個&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__dict__&lt;/span&gt;特性參考至一個字典物件，其中記錄著類別或實例所擁有的特性。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Math:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI = 3.14159&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Math.PI&lt;br /&gt;
&lt;/span&gt;3.14159&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(Math.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;__dict__&#39;: &amp;lt;attribute &#39;__dict__&#39; of &#39;Math&#39; objects&amp;gt;, &#39;__module__&#39;: &#39;__main__&#39;,&lt;br /&gt;
&amp;nbsp;&#39;PI&#39;: 3.14159, &#39;__weakref__&#39;: &amp;lt;attribute &#39;__weakref__&#39; of &#39;Math&#39; objects&amp;gt;, &#39;__d&lt;br /&gt;
oc__&#39;: None}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Math.__dict__[&#39;PI&#39;]&lt;br /&gt;
&lt;/span&gt;3.14159&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，Math類別上定義了PI特性，這記錄在Math.__dict__中，你嘗試使用Math.PI，則使用Math.__dict__[&#39;PI&#39;]來尋找出對應的值。如果你試著透過實例來取得PI：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; m = Math()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; m.PI&lt;br /&gt;
&lt;/span&gt;3.14159&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(m.__dict__)&lt;br /&gt;
&lt;/span&gt;{}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;實際上m所參考的實例，其__dict__中並沒有PI，此時會到Math.__dict__中找看看有無PI。這是&lt;/small&gt;&lt;small&gt;Python&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;中尋找特性的順序：&lt;span style=&quot;font-weight: bold;&quot;&gt;如果實例的__dict__中沒有，則到產生實例的類別__dict__中尋找&lt;/span&gt;。如果你試著在m實例上設定PI特性：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; m.PI&lt;br /&gt;
&lt;/span&gt;3.14&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; Math.PI&lt;br /&gt;
&lt;/span&gt;3.14159&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(m.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;PI&#39;: 3.14}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(Math.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;__dict__&#39;: &amp;lt;attribute &#39;__dict__&#39; of &#39;Math&#39; objects&amp;gt;, &#39;__module__&#39;: &#39;__main__&#39;,&lt;br /&gt;
&amp;nbsp;&#39;PI&#39;: 3.14159, &#39;__weakref__&#39;: &amp;lt;attribute &#39;__weakref__&#39; of &#39;Math&#39; objects&amp;gt;, &#39;__d&lt;br /&gt;
oc__&#39;: None}&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;實際上你並沒有改變Math.__dict__中的PI，而是在實例m.__dict__中新增一個PI，而你嘗試使用實例存取PI時，由於m.__dict__中已經有了，就直接取得該值。&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;這也說明了，為什麼實例方法的第一個參數會綁定至實例：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def setx(self, x):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.x = x&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(Some.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;__dict__&#39;: &amp;lt;attribute &#39;__dict__&#39; of &#39;Some&#39; objects&amp;gt;, &#39;__weakref__&#39;: &amp;lt;attribute&lt;br /&gt;
&amp;nbsp;&#39;__weakref__&#39; of &#39;Some&#39; objects&amp;gt;, &#39;__module__&#39;: &#39;__main__&#39;, &#39;setx&#39;: &amp;lt;function s&lt;br /&gt;
etx at 0x018FA078&amp;gt;, &#39;__doc__&#39;: None}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.setx(10)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;x&#39;: 10}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;類別中所定義的函式，其實就是類別的特性，也就是在類別的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__dict__&lt;/span&gt;中可以找到該名稱。實例方法的第一個參數&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;self綁定實例，透過self.x來設定特性值，也就是在self.__dict__中添增特性。&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;由於Python可以動態地為類別添加屬性，即使是未&lt;/small&gt;&lt;small&gt;添加屬性前就已建立的物件，在類別動態添加屬性之後， 也可依Python的名稱空間搜尋順序套用上新的屬性，用這種方式，您可以為類別動態地添加方法。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Some:
    def __init__(self, x):
        self.x = x
        
s = Some(1)
Some.service = lambda self, y: print(&#39;do service...&#39;, self.x + y)
s.service(2)    # do service... 3&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;       &lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;如果你要刪除物件上的某個特性，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;del&lt;/span&gt;。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pass&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;x&#39;: 10}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del s.x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;如果你試著在實例上呼叫某個方法，而該實例上沒有該綁定方法時（被@staticmethod或@classmethod修飾的函式），則會試著去類別__dict__中尋找，並以類別呼叫方式來執行函式。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @staticmethod&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def service():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;XD&#39;)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.service()&lt;br /&gt;
&lt;/span&gt;XD&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，嘗試執行s.service()，由於s並沒有service()的綁定方法（因為被@staticmethod修飾），所以嘗試尋找Some.service()執行。&lt;br /&gt;
&lt;br /&gt;
實際上，&lt;span style=&quot;font-weight: bold;&quot;&gt;如果嘗試透過實例取得某個特性，如果實例的__dict__中沒有，則到產 生實例的類別__dict__中尋找，如果類別__dict__仍沒有，則會試著呼叫__getattr__()來傳回，如果沒有定義 __getattr__()方法，則會引發AttributeError，如果有__getattr__()，則看__getattr__()如何處理&lt;/span&gt;。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; w = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __getattr__(self, name):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name == &#39;w&#39;:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 20&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.w&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __getattr__(self, name):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if name == &#39;w&#39;:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 20&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise AttributeError(name)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.w&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.x&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 6, in __getattr__&lt;br /&gt;
AttributeError: x&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在類別中的函式執行過程中若有定義實例特性時，具特性名稱是以__開頭，則該名稱會被加工處理。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.__x = 10&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s.__x&lt;/span&gt;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
AttributeError: &#39;Some&#39; object has no attribute &#39;__x&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(s.__dict__)&lt;br /&gt;
&lt;/span&gt;{&#39;_Some__x&#39;: 10}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s._Some__x&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;實例變數若以__name這樣的名稱，則會自動轉換為「_類別名__name」這樣的名稱儲存在實例的__dict__中，以__開頭的變數名稱，&lt;/small&gt;&lt;small&gt;Python&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;沒有真正阻止你存取它，但&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;這提示不希望你直接存取。&lt;/small&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;       &lt;br /&gt;
如果不想要直接使用實例的__dict__來取得特性字典物件，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;vars()&lt;/span&gt;，vars()會代為呼叫實例的__dict__。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                     &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; class Some:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.x = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.y = 20&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; s = Some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; vars(s)&lt;br /&gt;
&lt;/span&gt;{&#39;y&#39;: 20, &#39;x&#39;: 10}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/8625703172161653408/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_7672.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/8625703172161653408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/8625703172161653408'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_7672.html' title='特性名稱空間'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4465202542174935017</id><published>2011-09-10T13:39:00.002-07:00</published><updated>2011-09-10T13:39:54.723-07:00</updated><title type='text'>靜態方法、類別方法</title><content type='html'>&lt;small&gt;如果你定義了一個類別：&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;class Some:
    def __init__(self, x):
        self.x = x
    
    def service(self, y):
        print(&#39;do service...&#39;, self.x + y)&lt;/pre&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;你可以透過Some實例來操作service()方法。例如：&lt;/small&gt;&lt;br /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;s = Some(10)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;s.service(2)&amp;nbsp; # do service... 12&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;表面上，上例像是：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;s = Some(10)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;Some.service(s, 2)&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
s所參考的實例，會綁定至service()的第一個參數，而所給定的引數，會指定service()方法的第二個參數，實際上在這類的情況下，service()方法是一個&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;綁定方法（Bound method）&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;，而每個實例會有自己的綁定方法。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;s1 = Some(10)&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;service = s1.service&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;service(5)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 15&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;s2 = Some(20)&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;service = s2.service&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;service(5)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;而Some類別本身亦擁有一個service()函式，例如：&lt;/span&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace;&quot; /&gt;       &lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;s1 = Some(10)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Some.service(s1, 5)&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 15&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;s2 = Some(20)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Some.service(s2, 5)&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;service = Some.service&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;service(s1, 5)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 15&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;service(s2, 5)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
如果在定義類別時，類別中的函式沒有任何參數，則該函式無法成為綁定方法，因為試圖將實例作為第一個參數時會發生錯誤。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Other:
    def service():
        print(&#39;do service...&#39;)
        
o = Other()
o.service()  # TypeError: service() takes no arguments (1 given)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;像上例中service()只能作為Other上的一個函式來使用：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;Other.service()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service...&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
如果你在定義類別時希望某個函式，完全不要作為實例的綁定方法，也就是不要將第一個參數綁定為所建立的實例，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;@staticmethod&lt;/span&gt;加以修飾。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Some:
&lt;span style=&quot;font-weight: bold;&quot;&gt;    @staticmethod&lt;/span&gt;
    def service(x, y):
        print(&#39;do service...&#39;, x + y)

Some.service(10, 20) &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;/span&gt;

s = Some()
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;s.service(10, 20)    &lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;/span&gt;
s.service(10)        &lt;small&gt;# TypeError: service() takes exactly 2 positional arguments (1 given)&lt;/small&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
雖然你可以透過實例來呼叫&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;@staticmethod&lt;/span&gt;所修飾的靜態方法，但建議透過類別名稱來呼叫。類似的，建議透過實例來呼叫實例的綁定方法。一個沒有使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;@staticmethod&lt;/span&gt;宣告而又帶有參數的函式，就如先前所看到的，可以用實例方法來使用，也可以用靜態方法的方式呼叫，這是Python3給的方便性，讓你不一定得使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;@staticmethod&lt;/span&gt;來區別，只要你知道自己在作什麼。事實上，你還可以這麼作：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Some:
    def __init__(self, x):
        self.x = x
    
    def service(self, y):
        print(&#39;do service...&#39;, self.x + y)

class Other:
    pass

o = Other()
o.x = 100
Some.service(o, 200)    &lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;# do service... 25&lt;/span&gt;
      &lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Some.service()的第一個參數可以任何物件，只要它有個x屬性。&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;你還可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;@classmethod&lt;/span&gt;來修飾一個函式成為類別方法，這樣的方法第一個參數永遠綁定為類別物件本身，無論是以實例方法來呼叫，或是以靜態方法來呼叫。例如：&lt;/small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;       &lt;pre&gt;class Some:
    def __init__(self, x):
        self.x = x
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;    @classmethod&lt;/span&gt;
    def service(clz, y):
        print(&#39;do service...&#39;, clz, y)

s = Some(10)
s.service(20)      # do service... &amp;lt;class &#39;__main__.Some&#39;&amp;gt; 20
Some.service(30)   # do service... &amp;lt;class &#39;__main__.Some&#39;&amp;gt; 30&lt;/pre&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4465202542174935017/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_5152.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4465202542174935017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4465202542174935017'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_5152.html' title='靜態方法、類別方法'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4762122425010692033</id><published>2011-09-10T13:39:00.000-07:00</published><updated>2011-09-10T13:39:02.994-07:00</updated><title type='text'>定義類別</title><content type='html'>&lt;small&gt;在Python中要定義類別非常的簡單，例如你可以定義一個帳戶（Account）類別：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;class Account:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;    pass&lt;/span&gt;

def deposit(acct, amount):
    if amount &amp;lt;= 0:
        raise ValueError(&#39;must be positive&#39;)
    acct.balance += amount
       
def withdraw(acct, amount):
    if amount &amp;lt;= acct.balance:
        acct.balance -= amount
    else:
        raise RuntimeError(&#39;balance not enough&#39;)
        
&lt;span style=&quot;font-weight: bold;&quot;&gt;acct = Account()&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;acct.number = &#39;123-456-789&#39;&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;acct.name = &#39;Justin&#39;&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;acct.balance = 0&lt;/span&gt;

&lt;span style=&quot;font-weight: bold;&quot;&gt;print(acct.number)    # 123-456-789&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;print(acct.name)      # Justin&lt;/span&gt;

&lt;span style=&quot;font-weight: bold;&quot;&gt;deposit(acct, 100)&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;print(acct.balance)   # 100&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;withdraw(acct, 50)&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;print(acct.balance)   # 50&lt;/span&gt;&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;上例中，&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;class&lt;/span&gt;用來定義一個類別，現在還沒有要定義類別特性（Property）等，所以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;pass&lt;/span&gt;先略過。要建立類別的實例（Instance），直接呼叫&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Account()&lt;/span&gt;來建立。建立物件之後，你可以直接在物件上添增特性，透過&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt; . &lt;/span&gt;來存取特性。&lt;br /&gt;
&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;上面這個例子的帳號、名稱、餘額是在程式碼中自行建立，並透過函式來作存提款的動作。事實上，你可以將物件建立後的初始化動作，以及會用到的相關操作定義在類別之中。來看看下面這個例子：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;class Account:
    def __init__(self, number, name):
        self.number = number
        self.name = name
        self.balance = 0
        
    def deposit(self, amount):
        if amount &amp;lt;= 0:
            raise ValueError(&#39;must be positive&#39;)
        self.balance += amount
        
    def withdraw(self, amount):
        if amount &amp;lt;= self.balance:
            self.balance -= amount
        else:
            raise RuntimeError(&#39;balance not enough&#39;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;這個類別已包含幾個Python中定義類別的觀念。首先是：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;def __init__(self, number, name):&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.number = number&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.name = name&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.balance = 0&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;__init__&lt;/span&gt;這個特定的名稱，用來定義類別的實例建立之後，要進行的初始化動作。第一個&lt;span style=&quot;font-weight: bold;&quot;&gt;self&lt;/span&gt;&lt;/span&gt;參數代表建立的類別實例，在Python中，實例可操作的方法，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;第一個參數必須明確作為接受實例之用，慣例上取名為self名稱。__init__之後則可指定初始化時所必須給定的資料。在上面的例子中，會在建立的實例上增加number、name與balance特性。&lt;/span&gt;&lt;/small&gt;&lt;small&gt;你可以用以下方式來建構物件：&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;acct = Account(&#39;123-456-789&#39;, &#39;Justin&#39;)&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;每個建構出來的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;Account&lt;/span&gt;實例，都會擁有自己的資料狀態，可以直接透過物件及&lt;span style=&quot;font-weight: bold;&quot;&gt; . &lt;/span&gt;來存取特性：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(acct.number)&amp;nbsp;&amp;nbsp;&amp;nbsp; # 123-456-789&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;print(acct.name)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Justin&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
再來看到方法（Method）定義：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;def deposit(self, amount):&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if amount &amp;lt;= 0:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise ValueError(&#39;must be positive&#39;)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.balance += amount&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;def withdraw(self, amount):&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if amount &amp;lt;= self.balance:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.balance -= amount&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise RuntimeError(&#39;balance not enough&#39;)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;/div&gt;&lt;small&gt;&lt;br /&gt;
同樣的道理，&lt;/small&gt;&lt;small&gt;在Python中，實例可操作的方法，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;第一個參數必須明確作為接受實例之用，之後若要在方法中存取物件特性或呼叫物件方法，則必須明確以傳入的物件搭配.運算，例如self.balance這樣的方式。以下則是呼叫方法的幾個例子：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;acct.deposit(100)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;print(acct.balance)&amp;nbsp;&amp;nbsp; # 100&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;acct.withdraw(50)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;print(acct.balance)&amp;nbsp;&amp;nbsp; # 50&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;在Python中，函式是物件，對於定義在類別中的方法也是一種函式，自然你也可以將之指定給別的變數。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;acct1 = Account(&#39;123-456-789&#39;, &#39;Justin&#39;)&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;deposit1 = acct1.deposit&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;       &lt;span style=&quot;color: red;&quot;&gt;withdraw1 = acct1.withdraw&lt;/span&gt;&lt;br /&gt;
deposit1(100)&lt;br /&gt;
withdraw1(50)&lt;br /&gt;
print(acct1.balance)&lt;br /&gt;
&lt;br /&gt;
acct2 = Account(&#39;987-654-321&#39;, &#39;Momor&#39;)&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;deposit2 = acct2.deposit&lt;/span&gt;&lt;br style=&quot;color: red;&quot; /&gt;       &lt;span style=&quot;color: red;&quot;&gt;withdraw2 = acct2.withdraw&lt;/span&gt;&lt;br /&gt;
deposit2(200)&lt;br /&gt;
withdraw2(100)&lt;br /&gt;
print(acct2.balance)&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;acct1.deposit = acct2.deposit&lt;/span&gt;&lt;br /&gt;
acct1.deposit(1000)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 你其實是將錢存到 acct2 去&lt;br /&gt;
print(acct1.balance)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 50&lt;br /&gt;
print(acct2.balance)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # 1100&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;上面這個例子其實也指出了，在Python中，方法總是跟隨著物件而建立，而&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;self&lt;/span&gt;是綁定為所建立的物件，別以為將方法指定給另一個物件可以欺騙Python，就如上面的例子中，倒數第三行的結果，其實是將錢存到&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;acct2&lt;/span&gt;所參考的物件。&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4762122425010692033/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_9216.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4762122425010692033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4762122425010692033'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_9216.html' title='定義類別'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-7705489655789598557</id><published>2011-09-10T13:22:00.002-07:00</published><updated>2011-09-10T13:22:22.580-07:00</updated><title type='text'>yield 產生器</title><content type='html'>&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;你可以在函式中包括&lt;span style=&quot;font-weight: bold;&quot;&gt;yield&lt;/span&gt;來「產生」值，表面上看來，yield就像是return會傳回值，但又不中斷函式的執行：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def myrange(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while True:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x += 1&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if x == n:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for i in myrange(10):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(i, end=&#39;&#39;)&lt;br /&gt;
... print()&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;0123456789&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;上面的程式模擬了內建函式&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;range()&lt;/span&gt;的作用。表面上看來，你在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;myrange()函式中使用yield傳回值，然後執行for in迴圈，接著再使用myrange()傳回下一個值，再執行for in迴圈，就好似myrange()執行過後沒有結束似的。&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;實際上，在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;def&lt;/span&gt;所定義的本體中，若包括&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;yield&lt;/span&gt;運算式，則Python會將之編譯為一個產生器（Generator）。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; myrange(10)&lt;br /&gt;
&lt;/span&gt;&amp;lt;generator object myrange at 0x01C98440&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir(myrange(10))&lt;br /&gt;
&lt;/span&gt;[&#39;__class__&#39;, &#39;__delattr__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__get&lt;br /&gt;
attribute__&#39;, &#39;__gt__&#39;, &#39;__hash__&#39;, &#39;__init__&#39;, &#39;__iter__&#39;, &#39;__le__&#39;, &#39;__lt__&#39;,&lt;br /&gt;
&#39;__name__&#39;, &#39;__ne__&#39;, &#39;__new__&#39;, &#39;__next__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__r&lt;br /&gt;
epr__&#39;, &#39;__setattr__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__subclasshook__&#39;, &#39;close&#39;, &#39;gi&lt;br /&gt;
_code&#39;, &#39;gi_frame&#39;, &#39;gi_running&#39;, &#39;send&#39;, &#39;throw&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;產生器物件是個具有迭代器（Iterator）介面的物件，也就是說，它具有&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__next__()方法，可以使用next()函式來取出下一個值，若無法產生下一個值，則會丟出StopIteration物件。例如：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; g = myrange(3)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
StopIteration&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;這也就是為何在第一個例子中，在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for in迴圈呼叫myrange()&lt;/span&gt;會有那樣的結果。一個函式若包括&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;yield&lt;/span&gt;，則會傳回產生器物件，而該函式基本上可以包括&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;return&lt;/span&gt;，不過不可以指明傳回值（也就是只能傳回&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;None&lt;/span&gt;）。&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;return&lt;/span&gt;只是用來結束函式的執行流程。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def myrange(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while True:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; yield x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g = myrange(3)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
StopIteration&lt;br style=&quot;font-weight: bold;&quot; /&gt; &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，第一個next(g)後，函式的執行流程就因return而結束了，嘗試再執行next(g)，就函式定義來看，無法再執行到yield運算式，所以就函式定義來看，StopIteration是因為無法執行到yield運算式而丟出的。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
先前談過 &lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/ForComprehension.html&quot;&gt;&lt;small&gt;for 包含式（Comprehension）&lt;/small&gt;&lt;/a&gt;&lt;/big&gt;，實際上，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;包含式與迭代器都是一個叫產生器運算式的語言特性。在&lt;big&gt; &lt;/big&gt;&lt;/small&gt;&lt;small&gt;&lt;small&gt;&lt;big&gt;&lt;big&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/ForComprehension.html&quot;&gt;&lt;small&gt;for 包含式（Comprehension）&lt;/small&gt;&lt;/a&gt;&lt;/big&gt; 中最後一個例子也有提到，使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;()與for&lt;/span&gt;包含式時，實際上是建立一個產生器。例如：&lt;/big&gt;&lt;/small&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; (i ** 2 for i in range(3))&lt;br /&gt;
&amp;lt;generator object &amp;lt;genexpr&amp;gt; at 0x01C98440&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g = (i ** 2 for i in range(3))&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
StopIteration&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for p in (i ** 2 for i in range(3)):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(p)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;0&lt;br /&gt;
1&lt;br /&gt;
4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;從Python 2.5開始，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;yield從陳述改為運算式，也就是yield除了「產生」指定的值之外，會有一個運算結果，yield運算結果預設是None，你可以透過產生器的&lt;span style=&quot;font-weight: bold;&quot;&gt;send()&lt;/span&gt;方法傳入一個值，這個值就成為yield的運算結果。這給了你一個與產生器溝通的機會。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def myrange(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 0&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while True:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; val = (yield x)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if val is not None:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = val&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x += 1&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if x &amp;gt;= n:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break&lt;br /&gt;
&lt;/span&gt;...&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g = myrange(10)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g.send(0)&lt;br /&gt;
&lt;/span&gt;0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; g.send(5)&lt;br /&gt;
&lt;/span&gt;5&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;6&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; next(g)&lt;br /&gt;
&lt;/span&gt;7&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/7705489655789598557/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/yield.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7705489655789598557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7705489655789598557'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/yield.html' title='yield 產生器'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4554005930365708497</id><published>2011-09-10T13:22:00.000-07:00</published><updated>2011-09-10T13:22:00.664-07:00</updated><title type='text'>變數範圍</title><content type='html'>&lt;small&gt;在Python中，變數無需宣告就可以直接使用並指定值，除非特別使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;global&lt;/span&gt;或&lt;span style=&quot;font-weight: bold;&quot;&gt;nonlocal&lt;/span&gt;&lt;/span&gt;指明，否則變數範圍（Scope）總是在指定值時建立。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def some():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 20&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(x)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(y)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some()&lt;br /&gt;
&lt;/span&gt;20&lt;br /&gt;
10&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; print(x)&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(y)&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在 上例中，some()函式中的x，其實是在函式範圍中所建立的新x，其覆蓋了外部的x範圍，所以你所設定的是區域變數x，指定值給變數時，就是在該範圍中 建立該變數，就是指這樣的情況。如果取用變數時，也是從當時的範圍開始尋找，若沒有，才找尋外部範圍，例如上例中，取用x時，在區域範圍找到區域變數x， 所以顯示的是區域變數x的值，而不是外部變數x，取用y時，由於區域範圍找不到，所以取得外部y的值。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
記得變數範圍的建立是在指定時發生，而不是在取用時發生，所以像下面這個例子：&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 20&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def some(x = x):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(x)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some()&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some(30)&lt;br /&gt;
&lt;/span&gt;30&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(x)&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;是定義了一個some()函式，將當時外部變數x的值20設定給參數x作為預設值。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
實際上，在Python中變數可以在四個範圍中建立或尋找。內建（Builtin）、全域（Global）、外包函式（Endosing function）、函式（Local functon）。一個例子如下：&lt;br /&gt;
&lt;/small&gt;       &lt;ul&gt;&lt;li&gt;demo.py&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;pre&gt;x = 10       　　# 全域

def outer():
   y = 20        # 在 outer() 函式範圍
   
   def inner():
       z = 30    # 在 inner() 函式範圍
       print(x)  # 內建範圍 print，全域的 x
   　　print(y)  # 內建範圍 print，外包 outer() 函式的 y
   
   prnt(x)       # 內建範圍 print，全域的 x&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
取用名稱時（而不是指定），一定是從最內層往外尋找。Python中所謂全域，實際上是以模組檔案為界，以上例來說，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x&lt;/span&gt;實際上是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;demo&lt;/span&gt;模組範圍中的變數，不會橫跨所有模組範圍。&lt;br /&gt;
&lt;br /&gt;
注意，到&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;print&lt;/span&gt;名稱，實際上它是內建範圍，在Python 3中有個&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;builtins&lt;/span&gt;模組，該模組中的變數，會自動被所有的模組所擁有。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import builtins&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dir(builtins)&lt;br /&gt;
&lt;/span&gt;[&#39;ArithmeticError&#39;, &#39;AssertionError&#39;, &#39;AttributeError&#39;, &#39;BaseException&#39;, &#39;Buffer&lt;br /&gt;
Error&#39;, &#39;BytesWarning&#39;, &#39;DeprecationWarning&#39;, &#39;EOFError&#39;, &#39;Ellipsis&#39;, &#39;Environme&lt;br /&gt;
ntError&#39;, &#39;Exception&#39;, &#39;False&#39;, &#39;FloatingPointError&#39;, &#39;FutureWarning&#39;, &#39;Generato&lt;br /&gt;
rExit&#39;, &#39;IOError&#39;, &#39;ImportError&#39;, &#39;ImportWarning&#39;, &#39;IndentationError&#39;, &#39;IndexErr&lt;br /&gt;
or&#39;, &#39;KeyError&#39;, &#39;KeyboardInterrupt&#39;, &#39;LookupError&#39;, &#39;MemoryError&#39;, &#39;NameError&#39;,&lt;br /&gt;
&amp;nbsp;&#39;None&#39;, &#39;NotImplemented&#39;, &#39;NotImplementedError&#39;, &#39;OSError&#39;, &#39;OverflowError&#39;, &#39;P&lt;br /&gt;
endingDeprecationWarning&#39;, &#39;ReferenceError&#39;, &#39;RuntimeError&#39;, &#39;RuntimeWarning&#39;, &#39;&lt;br /&gt;
StopIteration&#39;, &#39;SyntaxError&#39;, &#39;SyntaxWarning&#39;, &#39;SystemError&#39;, &#39;SystemExit&#39;, &#39;Ta&lt;br /&gt;
bError&#39;, &#39;True&#39;, &#39;TypeError&#39;, &#39;UnboundLocalError&#39;, &#39;UnicodeDecodeError&#39;, &#39;Unicod&lt;br /&gt;
eEncodeError&#39;, &#39;UnicodeError&#39;, &#39;UnicodeTranslateError&#39;, &#39;UnicodeWarning&#39;, &#39;UserW&lt;br /&gt;
arning&#39;, &#39;ValueError&#39;, &#39;Warning&#39;, &#39;WindowsError&#39;, &#39;ZeroDivisionError&#39;, &#39;__build_&lt;br /&gt;
class__&#39;, &#39;__debug__&#39;, &#39;__doc__&#39;, &#39;__import__&#39;, &#39;__name__&#39;, &#39;__package__&#39;, &#39;abs&#39;&lt;br /&gt;
, &#39;all&#39;, &#39;any&#39;, &#39;ascii&#39;, &#39;bin&#39;, &#39;bool&#39;, &#39;bytearray&#39;, &#39;bytes&#39;, &#39;chr&#39;, &#39;classmetho&lt;br /&gt;
d&#39;, &#39;compile&#39;, &#39;complex&#39;, &#39;copyright&#39;, &#39;credits&#39;, &#39;delattr&#39;, &#39;dict&#39;, &#39;dir&#39;, &#39;div&lt;br /&gt;
mod&#39;, &#39;enumerate&#39;, &#39;eval&#39;, &#39;exec&#39;, &#39;exit&#39;, &#39;filter&#39;, &#39;float&#39;, &#39;format&#39;, &#39;frozens&lt;br /&gt;
et&#39;, &#39;getattr&#39;, &#39;globals&#39;, &#39;hasattr&#39;, &#39;hash&#39;, &#39;help&#39;, &#39;hex&#39;, &#39;id&#39;, &#39;input&#39;, &#39;int&lt;br /&gt;
&#39;, &#39;isinstance&#39;, &#39;issubclass&#39;, &#39;iter&#39;, &#39;len&#39;, &#39;license&#39;, &#39;list&#39;, &#39;locals&#39;, &#39;map&#39;&lt;br /&gt;
, &#39;max&#39;, &#39;memoryview&#39;, &#39;min&#39;, &#39;next&#39;, &#39;object&#39;, &#39;oct&#39;, &#39;open&#39;, &#39;ord&#39;, &#39;pow&#39;, &#39;pr&lt;br /&gt;
int&#39;, &#39;property&#39;, &#39;quit&#39;, &#39;range&#39;, &#39;repr&#39;, &#39;reversed&#39;, &#39;round&#39;, &#39;set&#39;, &#39;setattr&#39;&lt;br /&gt;
, &#39;slice&#39;, &#39;sorted&#39;, &#39;staticmethod&#39;, &#39;str&#39;, &#39;sum&#39;, &#39;super&#39;, &#39;tuple&#39;, &#39;type&#39;, &#39;va&lt;br /&gt;
rs&#39;, &#39;zip&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;所以許多Python中可以直接使用的函式，其名稱實際上是在builtins模組之中。基本上，你也可以將變數建立至builtins中。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import builtins
import sys
builtins.argv = sys.argv
print(argv[1])&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
變數指定值的同時就確立其所在的範圍。如果你希望指定值的變數是全域範圍的話，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;global&lt;/span&gt;指明（雖然並不鼓勵全域變數）。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def some():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; global x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 20&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(x)&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;來看看以下這個會發生什麼事情？&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def some():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(x)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 20&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some()&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 2, in some&lt;br /&gt;
UnboundLocalError: local variable &#39;x&#39; referenced before assignment&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在some()函式中，print(x)中的x其實是some()函式中的區域變數x，因為範圍建立總是在指定時發生，在some()函式的第二行中，有個x指定，所以&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;直譯器看到的是這個x，而你在指定x值之前，就要顯示其值，就會發生錯誤。上面這個錯誤可以這麼修改：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; def some():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; global x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(x)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 20&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在Python 3中新增了&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;nonlocal&lt;/span&gt;，可以讓你指明變數並非區域變數，請依照&lt;/small&gt;&lt;small&gt;函式（Local functon）&lt;/small&gt;&lt;small&gt;、外包函式（Endosing function）、&lt;/small&gt;&lt;small&gt;全域（Global）、&lt;/small&gt;&lt;small&gt;內建（Builtin）的順序來尋找，即使是指定運算。例如：&lt;/small&gt;&lt;br /&gt;
&lt;pre&gt;x = 10
def outer():
   x = 100         # 這是在 outer() 函式範圍的 x
   def inner():
       &lt;span style=&quot;font-weight: bold;&quot;&gt;nonlocal&lt;/span&gt; x
       x = 1000    # 改變的是 outer() 函式的 x
   inner()
   print(x)        # 顯示 1000

outer()
print(x)           # 顯示 10&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
因此，在 &lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/LambdaExpression.html&quot;&gt;lambda 運算式&lt;/a&gt; 看過的一個例子：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;  def func():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def getX():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def setX(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = n&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (getX, setX)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX, setX = func()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; setX(20)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在 上例中，func()中的setX()宣告的x，其實是setX()中的區域變數x，其覆蓋了外部func()的x，所以你的n是指定給區域變數x。如果你要改變func()中的x值，則可以在setX()函式中宣告nonlocal。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def func():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def getX():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def setX(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nonlocal x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = n&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (getX, setX)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX, setX = func()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; setX(20)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4554005930365708497/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_10.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4554005930365708497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4554005930365708497'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_10.html' title='變數範圍'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4939575919753506889</id><published>2011-09-10T13:21:00.003-07:00</published><updated>2011-09-10T13:21:39.165-07:00</updated><title type='text'>lambda 運算式</title><content type='html'>&lt;small&gt;在Python中，函式是一級（First-class）公民，也就是說，&lt;span style=&quot;font-weight: bold;&quot;&gt;在Python中，函式是物件，為&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;function&lt;/span&gt;的實例&lt;/span&gt;。如果你要定義一個函式，基本上是使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;def&lt;/span&gt;來定義，如同&lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/DefStatement.html&quot;&gt;&lt;small&gt; &lt;big&gt;def 陳述句&lt;/big&gt;&lt;/small&gt;&lt;/a&gt; &lt;/small&gt;&lt;small&gt;中所說明過的，例如你要定義一個最大值的函式：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;def max(m, n):
    return m if m &amp;gt; n else n

print(max(10, 3))  # 顯示 10&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;你可以用&lt;span style=&quot;font-weight: bold;&quot;&gt;lambda&lt;/span&gt;運算式來定義函式，執行運算式時將會產生函式物件。 例如，上面的max函式，可以用以下的方式定義：&lt;/small&gt;&lt;br /&gt;
&lt;pre&gt;max = &lt;span style=&quot;font-weight: bold;&quot;&gt;lambda m, n: m if m &amp;gt; n else n&lt;/span&gt;print(max(10, 3))  # 顯示 10
      &lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;lambda&lt;/span&gt;的語法是：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;lambda arg1, arg2, ....: expression&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;lambda中arg1、arg2等就相當於定義函式時的參數，之後你可以在expression中使用這些參數。&lt;/small&gt;&lt;small&gt;注意！&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;lambda&lt;/span&gt;是運算式，不是陳述句，你在&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;:&lt;/span&gt;之後的也必須是運算式，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;lambda中也不能有區塊，這表示一些小的運算任務你可以使用lambda，而較複雜的邏輯你可以使用def來定義。&lt;br /&gt;
&lt;br /&gt;
基本上，lambda會產生function的實例，所以在&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/DefStatement.html&quot;&gt;&lt;small&gt;&lt;big&gt;def 陳述句&lt;/big&gt;&lt;/small&gt;&lt;/a&gt; 中所提到的參數定義與引數指定方式，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;對於lambda所產生的function實例都是適用的。&lt;/span&gt;&lt;/small&gt;&lt;/big&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;在Python中缺少其它語言中的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;switch陳述句，以下結合字典物件與lambda模擬switch的示範：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;score = int(input(&#39;請輸入分數：&#39;))
level = score // 10
{
    10 : lambda: print(&#39;Perfect&#39;),
    9  : lambda: print(&#39;A&#39;),
    8  : lambda: print(&#39;B&#39;),
    7  : lambda: print(&#39;C&#39;),
    6  : lambda: print(&#39;D&#39;)
}.get(level, lambda: print(&#39;E&#39;))()&lt;/pre&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
在上例中，字典物件中的值的部份是lambda所建立的函式物件，你使用get()方法指定鍵，如果有符合的鍵，就傳回對應的函式物件並執行，否則就傳回get()第二個引數所指定的函式並執行，這模擬了switch中default的陳述。&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace;&quot; /&gt;       &lt;br /&gt;
&lt;small&gt;在Python中，函式是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;function&lt;/span&gt;的實例，所以你可以自由傳遞，將一個函式中所定義的函式傳回也是常見的應用。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;def add(n1):
    def func(n2):
        return n1 + n2
    return func

print(add(1)(2))  # 顯示 3&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;從一個函式中呼叫另一個函式，這是函式程設中&lt;span style=&quot;font-weight: bold;&quot;&gt;鞣制（Curry）&lt;/span&gt;的概念。&lt;/small&gt;&lt;small&gt;所謂鞣製，是指將接受多個參數的函式，改為接受單一參數的函式，在函式執行過後傳回一個函式物件再套用剩下的參數，就像是將兩個函式鞣製在一起。&lt;br /&gt;
&lt;br /&gt;
另一個值得注意的是，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;n1參數的存活期間，本應跟隨著add()函式呼叫完成就結束，不過因為n1被綁定在func()函式之中，&lt;/span&gt;形成了一個&lt;span style=&quot;font-weight: bold;&quot;&gt;閉包（Closure）&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;所謂的&lt;span style=&quot;font-weight: bold;&quot;&gt;閉包（Closure）&lt;/span&gt;，是指一個函式物件（或 函式值）在建立時，綁定了當時作用範圍（Scope）下有效的&lt;span style=&quot;font-weight: bold;&quot;&gt;自由變數（Free  variable）&lt;/span&gt;。所 以支援閉包的語言，必須有支援一級函式（First-class function），建立函式物件並不等於建立閉包，建立函式物件時同時綁定了某個（些）自由變數，該函式物件才稱之為閉包。&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;在Python中，確實支援閉包的概念。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def outer():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def inner():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(x)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inner()&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 20&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return inner&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; f = outer()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; f()&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，inner()確實綁定了區域變數x，在outer()內部呼叫inner()時顯示的是10，而後改變了x為20，由於inner()綁定了x，所以傳回的函式執行時，顯示x的值為20。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
不過實際上在應用時，還是得小心一點。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def func():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def getX():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return x&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; def setX(n):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = n&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (getX, setX)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX, setX = func()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; setX(20)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; getX()&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，func()中的setX()宣告的x，其實是setX()中的區域變數x，其覆蓋了外部func()的x，所以你的n是指定給區域變數x。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
回到鞣製的討論，實際上其應用，在於先針對既有的資料先行作運算並傳回未運算的函式，待後續資料備妥後再完成整個所需的運算結果。一個例子像是 &lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/GCDPNumber.htm&quot;&gt;因 式分解&lt;/a&gt;，可以先準備好一定長度的質數表，之後利用該質數表來進行因式分解。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import math

def prepare_factor(max):
    prime = [1] * max
    for i in range(2, int(math.sqrt(max))):
        if prime[i] == 1:
            for j in range(2 * i, max):
                if j % i == 0:
                    prime[j] = 0
    primes = [i for i in range(2, max) if prime[i] == 1] # 質數表
           
    def factor(num):
        list = []
        i = 0
        while primes[i] ** 2 &amp;lt;= num:
            if num % primes[i] == 0:
                list.append(primes[i])
                num //= primes[i]
            else:
                i += 1
        list.append(num)
        f = [0] * len(list)
        for i in range(len(f)):
            f[i] = list[i]
        return f
        
    return factor

factor = prepare_factor(1000)
print(factor(100))  # 顯示 [2, 2, 5, 5]
print(factor(500))  # 顯示 [2, 2, 5, 5, 5]
print(factor(800))  # 顯示 [2, 2, 2, 2, 2, 5, 5]&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4939575919753506889/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/lambda.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4939575919753506889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4939575919753506889'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/lambda.html' title='lambda 運算式'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-7685510058126948058</id><published>2011-09-10T13:21:00.001-07:00</published><updated>2011-09-10T13:21:12.753-07:00</updated><title type='text'>def 陳述句</title><content type='html'>&lt;small&gt;在Python中要定義函式，是使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;def&lt;/span&gt;來定義，例如，以下是個求最大公因數的函式定義：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;def gcd(m, n):
    if n == 0:
        return m
    else:
        return gcd(n, m % n)

print(gcd(20, 30)) # 顯示 10&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，gcd是函式名稱，m與n為參數（&lt;/span&gt;Parameter&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;）名稱，如果要傳回值則使用&lt;span style=&quot;font-weight: bold;&quot;&gt;return&lt;/span&gt;，如果函式執行完畢但沒有使用return傳回值，則傳回&lt;span style=&quot;font-weight: bold;&quot;&gt;None&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
實際上，def是個陳述句，&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;執行到def時，會產生一個函式物件，為function的實例，即然函式是個物件，它可以指定給其它的變數，例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;def gcd(m, n):
    if n == 0:
        return m
    else:
        return gcd(n, m % n)

print(gcd(20, 30))         # 顯示 10
print(type(gcd))           # 顯示 &amp;lt;class &#39;function&#39;&amp;gt;

gcd2 = gcd
print(gcd2(20, 30))        # 顯示 10
print(id(gcd), id(gcd2))   # 兩個顯示的數字相同&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
在&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;中不支援其它語言函式重載的概念（例如&lt;/span&gt;Java&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;），也就是在&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;中同一個名稱空間中，不能有相同的函式名稱。如果你定義了兩個函式具有相同的名稱但擁有不同的參數個數，則後者定義會覆蓋前者定義。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def sum(a, b):&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a + b&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def sum(a, b, c):&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return a + b + c&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; sum(1, 2, 3)&lt;/span&gt;&lt;br /&gt;
6&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; sum(1, 2)&lt;/span&gt;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
TypeError: sum() takes exactly 3 positional arguments (2 given)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;       由於&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;是動態語言，只需在設計時確認傳入函式的物件所擁有的特性或方法，無需採&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;函式重載中，依型態不同來區別所呼叫函式的部份，至於依函式個數不同來區別的函式重載概念，在&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;中可以使用預設引數（&lt;/span&gt;Argument&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;）來解決。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;def sum(a, b, &lt;span style=&quot;font-weight: bold;&quot;&gt;c = 0&lt;/span&gt;):
    return a + b + c

print(sum(10, 20, 30))   # 顯示 60
print(sum(10, 20))       # 顯示 30&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，如果沒有指定第三個參數c的值，則預設值是0。事實上，在呼叫函式時，並不一定要依參數宣告順序來傳入引數，而可以指定參數名稱來設定其引數值，稱之為關鍵字引數。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;def sum(a, b, c = 0):
    return a + b + c

print(sum(&lt;span style=&quot;font-weight: bold;&quot;&gt;c = 30, a = 10, b = 20&lt;/span&gt;))  # 顯示 60&lt;/pre&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;       &lt;/span&gt;&lt;br /&gt;
使用預設值指定時，必須小心指定可變動物件時的一個陷阱，在Python中，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;def是個陳述，所以執行到def陳&lt;/span&gt;述時，就建立了該陳述相關的資源。來看看下面會有什麼問題？&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def appendTo(element, arr = []):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr.append(element)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return arr&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(10, [1, 2, 3])&lt;br /&gt;
&lt;/span&gt;[1, 2, 3, 10]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(10)&lt;br /&gt;
&lt;/span&gt;[10]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(20, [4, 5, 6])&lt;br /&gt;
&lt;/span&gt;[4, 5, 6, 20]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(20)&lt;br /&gt;
&lt;/span&gt;[10, 20]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(30)&lt;br /&gt;
&lt;/span&gt;[10, 20, 30]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; appendTo(40)&lt;br /&gt;
&lt;/span&gt;[10, 20, 30, 40]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在上例中，你的 arr預設值設定為空串列，由於def是個陳述，執行到def的函式定義時，就建立了空串列物件，而這個物件會一直存在，如果你沒有指定arr的串列物件 時，所使用的就一直會是一開始指定的預設空串列物件，也因此，隨著每次呼叫都不指定arr的值，你附加的對象，都是同一個物件。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
像&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;sum&lt;/span&gt;這種加總數字的需求，事先可能不知道要傳入的引數數量，可以在定義函式的參數時使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;*&lt;/span&gt;，表示該參數接受不定長度參數。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;def sum(&lt;span style=&quot;font-weight: bold;&quot;&gt;*numbers&lt;/span&gt;):
    total = 0
    for number in numbers:
        total += number
    return total

print(sum(1, 2))        # 顯示 3
print(sum(1, 2, 3))     # 顯示 6
print(sum(1, 2, 3, 4))  # 顯示 10&lt;/pre&gt;&lt;small&gt;       &lt;br /&gt;
你傳入函式的引數，會被收集在一個Tuple中，再設定給&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;number&lt;/span&gt;參數。有趣的是，如果你有個函式擁有固定的參數，你可以將一個Tuple傳入，只要在傳入時加上&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;*&lt;/span&gt;，則Tuple中每個元素會自動指定給各個參數。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;def sum3(a, b, c):
    return a + b + c

numbers = (1, 2, 3)
print(sum3(&lt;span style=&quot;font-weight: bold;&quot;&gt;*numbers&lt;/span&gt;))&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;**&lt;/span&gt;則可以將關鍵字引數收集在一個字典物件中，當一個函式所需要的參數個數很多時，可以使用這個方式。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def dosome(**args):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(args)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dosome(name = &#39;Justin&#39;, passwd = 123456, job = &#39;?&#39;)&lt;br /&gt;
&lt;/span&gt;{&#39;passwd&#39;: 123456, &#39;job&#39;: &#39;?&#39;, &#39;name&#39;: &#39;Justin&#39;}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;反過來的話，如果函式參數個數固定，你也可以傳給函式一個字典物件，只要在物件前加上**，則Python會依字典物件的鍵名稱，將值指定給對應名稱的參數。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;def sum3(a, b, c):
    return a + b + c

args = {&#39;a&#39; : 1, &#39;b&#39; : 2, &#39;c&#39; : 3}
print(sum3(&lt;span style=&quot;font-weight: bold;&quot;&gt;**args&lt;/span&gt;))&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
你可以在一個函式中，同時使用*與**。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; def some(*arg1, **arg2):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(arg1)&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(arg2)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some(1, 2, 3)&lt;br /&gt;
&lt;/span&gt;(1, 2, 3)&lt;br /&gt;
{}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some(a = 1, b = 22, c = 3)&lt;br /&gt;
&lt;/span&gt;()&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;{&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 22}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; some(2, a = 1, b = 22, c = 3)&lt;br /&gt;
&lt;/span&gt;(2,)&lt;br /&gt;
{&#39;a&#39;: 1, &#39;c&#39;: 3, &#39;b&#39;: 22}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
在Python中，&lt;/small&gt;&lt;small&gt;函式中還可以定義函式，稱之為區域函式（Local  function），你可以使用區域函式將某個函式中的演算組織為更小的單元，例如，在 &lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/SelectionInsertionBubble.htm&quot;&gt;選 擇排序&lt;/a&gt; 的實作時，每次會從未排序部份選擇一個最小值放置到已排序部份之後，在底下的範例中，尋找最小值的演算就實作為區域函式的方式：&lt;/small&gt;       &lt;pre&gt;def selection(number):
    # 找出未排序中最小值
    &lt;span style=&quot;font-weight: bold;&quot;&gt;def min(m, j):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        if j == len(number):&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return m&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        elif number[j] &amp;lt; number[m]:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return min(j, j + 1)&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;        else:&lt;/span&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;            return min(m, j + 1)&lt;/span&gt;
    
    for i in range(0, len(number)):
        m = min(i, i + 1)
        if i != m:
            number[i], number[m] = number[m], number[i]

number = [1, 5, 2, 3, 9, 7]
selection(number)
print(number)     # 顯示 [1, 2, 3, 5, 7, 9]&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;可以看到，區域函式的好處之一，就是可以直接存取包裹它的外部函式之參數（或宣告在區域函式之前的區域變數），如此可減少呼叫函式時引數的 傳遞。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/7685510058126948058/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/def.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7685510058126948058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/7685510058126948058'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/def.html' title='def 陳述句'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-3780051586333450641</id><published>2011-09-09T15:43:00.001-07:00</published><updated>2011-09-09T15:43:33.394-07:00</updated><title type='text'>try、raise 陳述句</title><content type='html'>&lt;small&gt;以下這個程式，預期使用者要輸入整數：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;input = int(input(&#39;輸入整數：&#39;))
print(&#39;{0} 為 {1}&#39;.format(input, &#39;奇數&#39; if input % 2 else &#39;偶數&#39;))&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;如果使用者輸入的不是整數，就會出現錯誤：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;輸入整數：one&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;demo.py&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; input = int(input(&#39;輸入整數：&#39;))&lt;br /&gt;
ValueError: invalid literal for int() with base 10: &#39;one&#39;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在Python中程式若發生錯誤，會丟出例外事件，以上例而言就是引發（Raise）&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;ValueError&lt;/span&gt;物件，如果程式沒有處理例外而丟出至執行環境，則會顯示例外追蹤（Traceback）並中斷程式。如果你想要處理例外，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;try...except&lt;/span&gt;語句。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;try:
    input = int(input(&#39;輸入整數：&#39;))
    print(&#39;{0} 為 {1}&#39;.format(input, &#39;奇數&#39; if input % 2 else &#39;偶數&#39;))
except ValueError:
    print(&#39;請輸入阿拉伯數字&#39;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
如果使用者輸入錯誤，引發的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;ValueError&lt;/span&gt;物件會被&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;except&lt;/span&gt;比對型態是否相同，如果相同則執行對應的區塊。以上例而言，如果使用者輸入錯誤，就會顯示較友善的提示訊息（而不是丟個使用者看不懂的追蹤訊息）：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;輸入整數：one&lt;br /&gt;
請輸入阿拉伯數字&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;try..except的except可以指定多個物件，也可以有多個except，如果沒有指定except後的物件型態，則表示捕捉所有引發的物件。&lt;/span&gt;舉例來說，上例中若使用者於輸入時輸入Ctrl+Z，在Windows環境下會引發&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;EOFError&lt;/span&gt;，若輸入Ctrl+C，則會引發&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;KeyboardInterrupt。&lt;/span&gt;下例中處理這些可能的狀況：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import traceback
try:
    input = int(input(&#39;輸入整數：&#39;))
    print(&#39;{0} 為 {1}&#39;.format(input, &#39;奇數&#39; if input % 2 else &#39;偶數&#39;))
except ValueError:
    print(&#39;請輸入阿拉伯數字&#39;)
except (EOFError, KeyboardInterrupt):
    print(&#39;使用者中斷程式&#39;)
except:
    print(&#39;不明的程式中斷&#39;)
    traceback.print_exc()&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
由於&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;except&lt;/span&gt;會捕捉所有引發的物件，所以必須置於最後。&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;traceback.print_exc()&lt;/span&gt;則可以顯示例外的追蹤訊息&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;。try還可以搭配&lt;span style=&quot;font-weight: bold;&quot;&gt;finally&lt;/span&gt;，一但設置，無論有無引發物件，finally區塊一定會執行，這通常用來作為關閉若干資源的區塊，例如關閉檔案：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;file = open(&#39;demo.py&#39;, &#39;r&#39;, encoding=&#39;UTF-8&#39;)
try:
    for line in file:
        print(line, end=&#39;&#39;)
except:
    print(&#39;讀取檔案發生錯誤&#39;)
finally:
    file.close()&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;try也可以搭配&lt;span style=&quot;font-weight: bold;&quot;&gt;else&lt;/span&gt;區塊，如果try區塊中沒有任何的錯誤發生，則會執行else區塊：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;try:&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; statement&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;except some:&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; statement&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;except:&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;statement&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;else:&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; statement&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;finally:&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; statement&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;small&gt;你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;raise&lt;/span&gt;自行引發例外。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; try:&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise EOFError&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;... except EOFError:&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;EOFError&#39;)&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
EOFError&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/3780051586333450641/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/tryraise.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/3780051586333450641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/3780051586333450641'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/tryraise.html' title='try、raise 陳述句'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-9198320517860396891</id><published>2011-09-09T15:42:00.000-07:00</published><updated>2011-09-09T15:42:30.134-07:00</updated><title type='text'>for 包含式（Comprehension）</title><content type='html'>&lt;small&gt;你可以在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;運算式中使用包含式語法來進行值的收集，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;運算結束傳回收集的結果，例如：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;import sys
files = [arg for arg in sys.argv if arg.endswith(&#39;.txt&#39;)]
print(files)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
這個範例可以收集命令列引數中輸入為.txt結尾的檔名，只有符合&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if&lt;/span&gt;測試的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;arg&lt;/span&gt;才會被收集，由於使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;[]&lt;/span&gt;包含，所以最後的結果是以串列傳回。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;python demo.py 1.txt 2.doc. 3.txt 4.html 5.txt&lt;/span&gt;&lt;br /&gt;
[&#39;1.txt&#39;, &#39;3.txt&#39;, &#39;5.txt&#39;]&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;if的部份可以省略，這時會收集所有的迭代的值，你可以在&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;左邊進行值的處理。例如計算串列中所有數的平方數：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; [number ** 2 for number in [10, 20, 30]]&lt;br /&gt;
&lt;/span&gt;[100, 400, 900]&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;如果要作更巢狀的元素包括也是可行的，例如以下可將二維矩陣轉換為一維陣列：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; matrix = [&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1, 2, 3],&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [4, 5, 6],&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [7, 8, 9]&lt;br /&gt;
... ]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; array = [element for row in matrix for element in row]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; array&lt;br /&gt;
&lt;/span&gt;[1, 2, 3, 4, 5, 6, 7, 8, 9]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;上例若不以&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;包含式來實作，則如下：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; matrix = [&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [1, 2, 3],&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [4, 5, 6],&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [7, 8, 9]&lt;br /&gt;
... ]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; array = []&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for row in matrix:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for element in row:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array.append(element)&lt;br /&gt;
...&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; array&lt;br /&gt;
&lt;/span&gt;[1, 2, 3, 4, 5, 6, 7, 8, 9]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;另一個例子是，使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;包含式來取得兩個串列的排列組合：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; [letter1 + letter2 for letter1 in &#39;Justin&#39; for letter2 in &#39;momor&#39;]&lt;br /&gt;
&lt;/span&gt;[&#39;Jm&#39;, &#39;Jo&#39;, &#39;Jm&#39;, &#39;Jo&#39;, &#39;Jr&#39;, &#39;um&#39;, &#39;uo&#39;, &#39;um&#39;, &#39;uo&#39;, &#39;ur&#39;, &#39;sm&#39;, &#39;so&#39;, &#39;sm&#39;, &#39;so&#39;, &#39;sr&#39;, &#39;tm&#39;, &#39;to&#39;, &#39;tm&#39;, &#39;to&#39;, &#39;tr&#39;, &#39;im&#39;, &#39;io&#39;, &#39;im&#39;, &#39;io&#39;, &#39;ir&#39;, &#39;nm&#39;, &#39;no&lt;br /&gt;
&#39;, &#39;nm&#39;, &#39;no&#39;, &#39;nr&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在Python3中，for包含式所收集的元素並不一定得包括在串列中，而可以包括在集合、字典中。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;font-family: Courier New,Courier,monospace; text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;             &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; {i for i in &#39;Justin&#39;}&lt;br /&gt;
&lt;/span&gt;{&#39;i&#39;, &#39;J&#39;, &#39;n&#39;, &#39;s&#39;, &#39;u&#39;, &#39;t&#39;}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; scores = [(&#39;Justin&#39;, 95), (&#39;momor&#39;, 93), (&#39;Hamimi&#39;, 99)]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; {name : score for (name, score) in scores}&lt;br /&gt;
&lt;/span&gt;{&#39;Hamimi&#39;: 99, &#39;Justin&#39;: 95, &#39;momor&#39;: 93}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;          &lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;如果以&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;()包括for&lt;/span&gt;包含式，則會建立一個產生器物件（本身是個具有&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__next__()&lt;/span&gt;的迭代器），可以直接對其迭代來逐一取得元素。例如建立一個質數產生器（參考 &lt;/small&gt;&lt;small&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/AlgorithmGossip/EratosthenesPrime.htm&quot;&gt;Eratosthenes  篩選求 質數&lt;/a&gt;&lt;/small&gt;&lt;small&gt;）：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import math
def primes(max):
    prime = [1] * max
    for i in range(2, int(math.sqrt(max))):
        if prime[i] == 1:
            for j in range(2 * i, max):
                if j % i == 0:
                    prime[j] = 0
    return &lt;span style=&quot;font-weight: bold;&quot;&gt;(i for i in range(2, max) if prime[i] == 1)&lt;/span&gt;
                
for prime in primes(1000):
    print(prime, end=&quot; &quot;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/9198320517860396891/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/for-comprehension.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/9198320517860396891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/9198320517860396891'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/for-comprehension.html' title='for 包含式（Comprehension）'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-2400343026037638001</id><published>2011-09-09T15:41:00.000-07:00</published><updated>2011-09-09T15:41:17.158-07:00</updated><title type='text'>for 與 while 陳述句</title><content type='html'>&lt;small&gt;如果你想要循序取出某個序列，例如串列，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;for&lt;/span&gt;陳述句，例如，將使用者提供的命令列引數逐一取出：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;import sys
for arg in sys.argv:
    print(arg)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;一個執行的範例如下：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt; python demo.py justin momor&lt;/span&gt;&lt;br /&gt;
demo.py&lt;br /&gt;
justin&lt;br /&gt;
momor&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
實際上，只要是具有&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__iter__()&lt;/span&gt;方法的物件，都可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;陳述句來迭代，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;__iter__()&lt;/span&gt;方法應該傳回一個迭代器（Iterator），該迭代器具有&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__next__()&lt;/span&gt;方法，每次迭代時就會傳回下一個物件，而沒有下一個元素時，則會引發&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;StopIteration&lt;/span&gt;例外。可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;iter()&lt;/span&gt;方法嘗試從物件上取得迭代物件。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; iterator = [1, 2, 3].__iter__()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
StopIteration&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator = iter([1, 2, 3])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; iterator.__next__()&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
StopIteration&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;
&lt;big&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;對於具有__iter__()所傳回的迭代器，你也可以直接使用&lt;span style=&quot;font-weight: bold;&quot;&gt;next()&lt;/span&gt;取得下一個元素，而不用直接呼叫__next__()方法。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/big&gt;       &lt;/small&gt;所以你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;迭代字串、串列、集合、字典或Tuple等，只要物件上具有&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;__iter__()&lt;/span&gt;方法。除了逐元素來進行迭代外，還可以結合指定運算的特性。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for (a, b) in [(1, 2), (10, 20), (100, 200)]:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(a, b)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;1 2&lt;br /&gt;
10 20&lt;br /&gt;
100 200&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for (key, value) in {&#39;admin&#39; : &#39;Justin&#39;, &#39;user&#39; : &#39;momor&#39;}.items():&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(key, value)&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;...&lt;/span&gt;&lt;br /&gt;
admin Justin&lt;br /&gt;
user momor&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;small&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/small&gt;如果你有指定範圍或索引的需求，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;range()&lt;/span&gt;類別產生一個&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;range&lt;/span&gt;物件，由它來迭代出所指定的數字範圍，而你再利用這些數字作為索引：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for index in range(2, 5):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(index)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;2&lt;br /&gt;
3&lt;br /&gt;
4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for index in range(5):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(index)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;0&lt;br /&gt;
1&lt;br /&gt;
2&lt;br /&gt;
3&lt;br /&gt;
4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for index in range(0, len(&#39;Justin&#39;), 2):&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;Justin&#39;[index])&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;J&lt;br /&gt;
s&lt;br /&gt;
i&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;                 &lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;如上所看到的，range類別可以指定起始、結結與步進值：&lt;/small&gt;&lt;br /&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;range([start,] stop[, step]) -&amp;gt; range object&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for陳述可以搭配一個可選的&lt;span style=&quot;font-weight: bold;&quot;&gt;else&lt;/span&gt;陳述，當for迴圈中沒有遇到任何&lt;span style=&quot;font-weight: bold;&quot;&gt;break&lt;/span&gt;陳述而離開迴圈時，就會執行else區塊。例如以下判斷輸入數字是否為質數：&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;number = int(input(&#39;輸入數字：&#39;))
half = number // 2
for num in range(2, half + 1):
    if (number % num) == 0:
        print(number, &#39;不是質數&#39;)
        break
&lt;span style=&quot;font-weight: bold;&quot;&gt;else:&lt;/span&gt;
    print(number, &#39;是質數&#39;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;一個執行的範例如下：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;輸入數字：13&lt;br /&gt;
13 是質數&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
break陳述可以讓你離開迴圈，而continue則可以讓你跳過該次迭代continue後的程式碼，直接作下一次迭代。例如以下僅顯示小寫英文字母：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;text = input(&#39;輸入英文字母：&#39;)
for letter in text:
    if letter.isupper():
        continue
    print(letter, end=&#39;&#39;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;一個執行範例如下：&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;輸入英文字母：This is Justin&#39;s speaking!&lt;br /&gt;
his is ustin&#39;s speaking!&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;               &lt;/tr&gt;
&lt;/tbody&gt;                                   &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;while&lt;/span&gt;迴圈根據所指定的條件式來判斷是否執行迴圈本體，例如以下是個求最大公因數的程式：&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;print(&#39;輸入兩個數字...&#39;)
m = int(input(&#39;number 1: &#39;))
n = int(input(&#39;number 2: &#39;))
while n != 0:
   r = m % n
   m = n
   n = r
print(&quot;GCD:&quot;, m)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
Python中沒有其它語言的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;do while語句，所以必須使用判斷式及break來達&lt;/span&gt;成。例如判斷輸入為奇數或偶數，直到使用者回答No為止：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;while True:
    number = int(input(&quot;輸入數字：&quot;))
    print(&quot;輸入數為&quot;, &#39;奇數&#39; if number % 2 else &quot;偶數&quot;)
    if(input(&#39;繼續？（Yes/No）&#39;) == &#39;No&#39;):
        break&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;while陳述同樣可以搭配else陳述，同樣地，在迴圈中沒有遇到break的話，則else區塊會被執行，由於while一開始就會測試是否執行迴圈，所以若迴圈本體完全沒有執行（當然也就不會遇到break），一樣也會執行else區塊。&lt;/span&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/2400343026037638001/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/for-while.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/2400343026037638001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/2400343026037638001'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/for-while.html' title='for 與 while 陳述句'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-4015257221742921307</id><published>2011-09-09T15:40:00.000-07:00</published><updated>2011-09-09T15:40:29.942-07:00</updated><title type='text'>if 陳述句</title><content type='html'>&lt;small&gt;要在某條件成立時才進行某些動作，Python提供了&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;if&lt;/span&gt;運算式，一個例子如下：&lt;br /&gt;
&lt;/small&gt;       &lt;br /&gt;
&lt;pre&gt;import sys
filename = &#39;default.properties&#39;
if len(sys.argv) != 1:
    filename = sys.argv[1]
print(filename)&lt;/pre&gt;&lt;br /&gt;
&lt;small&gt;這 個範例中，預設的檔案名稱是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;default.properties&lt;/span&gt;，如果使用者有提供命令列引數，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;則sys.argv的長度就會大於1（記得索引0是模組檔案名稱），所 以len(sys.argv) != 1的結果是True，所以if條件成立，將filename設定為使用者所提供的命令列引數。&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if可以搭配else，在if條件不成立時，執行else&lt;/span&gt;中定義的程式碼，所以上例也可以這麼寫：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;import sys
filename = &#39;&#39;
if len(sys.argv) == 1:
    filename = &#39;default.properties&#39;
else:
    filename = sys.argv[1]
print(filename)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;在Python中，區塊是從&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;:&lt;/span&gt;開始，同屬一個區塊的程式碼，必須有相同的縮排（例如四個空白或一個Tab鍵）。這可以避免C/C++、Java中的某些不明確的狀況。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if(....)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(...)&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doSometing();&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;else&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doOther();&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;乍看之下，else似乎是與第一個if配對，但實際上，else是與最近的if配對，也就是第二個if。但在&lt;/span&gt;Python&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;中沒有這個問題：&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if ...:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ...:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dosomething()&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;else:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doother()&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;/small&gt;&lt;/div&gt;&lt;small&gt;&lt;br /&gt;
Python以縮排作為區塊依據，以上例而言，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;else是與第一個if配對，如果是下例，則else是與第二個if配對：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;       &lt;div style=&quot;margin-left: 40px;&quot;&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if ...:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ...:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dosomething()&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;else:&lt;/span&gt;&lt;/small&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;       &lt;small style=&quot;font-weight: bold;&quot;&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doother()&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;/div&gt;&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;&lt;br /&gt;
如果有多重判斷，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if..elif..else&lt;/span&gt;結構。例如：&lt;br /&gt;
&lt;/small&gt;       &lt;pre&gt;score = int(input(&#39;輸入分數：&#39;))
if score &amp;gt;= 90:
    print(&#39;得 A&#39;)
elif score &amp;gt;= 80 and score &amp;lt; 90:
    print(&#39;得 B&#39;)   
elif score &amp;gt;= 70 and score &amp;lt; 80:
    print(&#39;得 C&#39;)   
elif score &amp;gt;= 60 and score &amp;lt; 70:
    print(&#39;得 D&#39;)       
else:
    print(&#39;不及格&#39;)&lt;/pre&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;在Python中有個&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;if..else&lt;/span&gt;運算式語法，可以讓你擁有像C/C++、Java的&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;?:&lt;/span&gt;三元運算子功能。例如：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;import sys
filename = &lt;span style=&quot;font-weight: bold;&quot;&gt;&#39;default.properties&#39; if len(sys.argv) == 1 else sys.argv[1]&lt;/span&gt;
print(filename)&lt;/pre&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;上例中，如果if的判斷為真，則傳回&#39;default.properties&#39;，否則傳回sys.argv[1]的值。&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;以下是個簡單的判斷輸入數是奇數或偶數的程式：&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;&lt;/span&gt;&lt;/small&gt;       &lt;pre&gt;input = int(input(&#39;輸入整數：&#39;))
print(&#39;{0} 為 {1}&#39;.format(input, &lt;span style=&quot;font-weight: bold;&quot;&gt;&#39;奇數&#39; if input % 2 else &#39;偶數&#39;&lt;/span&gt;))&lt;/pre&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;font-family: Times New Roman,Times,serif;&quot;&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/span&gt;&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/4015257221742921307/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/if.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4015257221742921307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/4015257221742921307'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/if.html' title='if 陳述句'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-601072477123607537</id><published>2011-09-09T15:39:00.000-07:00</published><updated>2011-09-09T15:39:15.958-07:00</updated><title type='text'>物件與記憶體管理</title><content type='html'>&lt;small&gt;在Python中所有東西都是物件，即使是數值型態也不例外，變數在Python中，是個用來參考至物件的名稱。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 1.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 1.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;25925072&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;25925056&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x == y&lt;br /&gt;
&lt;/span&gt;True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x is y&lt;br /&gt;
&lt;/span&gt;False&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = y&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;25925056&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;25925056&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x is y&lt;br /&gt;
&lt;/span&gt;True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在上例中，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x與y一開始分別參考至兩個浮點數物件，可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;id()&lt;/span&gt;函式來傳回物件所在的記憶體位址值。&lt;span style=&quot;font-weight: bold;&quot;&gt;==&lt;/span&gt;&lt;/span&gt;在Python中比較實質的相等性，如果要知道兩個變數是否參考至同一物件，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;is&lt;/span&gt;運算子。指定運算會將右邊物件指定給左邊變數參考，在上例中，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;y參考的物件後來指定了給x參考&lt;/span&gt;，而x原先參考的物件，目前沒有任何變數參考至它，最後就會被&lt;span style=&quot;font-weight: bold;&quot;&gt;垃圾回收（Garbage collection）&lt;/span&gt;，從記憶體中清除。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;+&lt;/span&gt;在Python中通常會產生新物件，例如在串接字串時：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; str1 = &#39;Just&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str2 = &#39;in&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str3 = str1 + str2&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str3&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str3)&lt;br /&gt;
&lt;/span&gt;26577760&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str3 = str1 + str2&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str3)&lt;br /&gt;
&lt;/span&gt;26578432&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str3 = str1 + str2&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str3)&lt;br /&gt;
&lt;/span&gt;26577760&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在上例中可以看到，每次串接都會產生新字串，因此&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;str3&lt;/span&gt;所參考的物件記憶體位址都不相同，在Python中不建議在經常性的操作中使用+串接字串（例如迴圈中）。如果要串接字串，可以一些替代方式，例如先使用串列收集：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; str1 = &#39;Just&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str = &#39;&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str)&lt;br /&gt;
&lt;/span&gt;25608320&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str += &#39;Just&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str)&lt;br /&gt;
&lt;/span&gt;26606976&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str += &#39;in&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(str)&lt;br /&gt;
&lt;/span&gt;26578432&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; buf = []&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; id(buf)&lt;/span&gt;&lt;br /&gt;
27053752&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; buf.append(&#39;Just&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; id(buf)&lt;/span&gt;&lt;br /&gt;
27053752&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; buf.append(&#39;in&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; id(buf)&lt;/span&gt;&lt;br /&gt;
27053752&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; str = &#39;&#39;.join(buf)&lt;/span&gt;&lt;br style=&quot;font-weight: bold;&quot; /&gt;             &lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; str&lt;/span&gt;&lt;br /&gt;
&#39;Justin&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;上例中，示範了直接使用+與使用串列先收集個別字串的方式，如果執行次數頻繁的話，後者會較有效率。&lt;br /&gt;
&lt;br /&gt;
在Python中，對於小整數或字串會有快取的動作。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(1)&lt;br /&gt;
&lt;/span&gt;505389048&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;505389048&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;505389048&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = 10000&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 10000&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;26713152&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;26711664&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str1 = &#39;Justin&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str2 = &#39;Justin&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; str1 == str2&lt;br /&gt;
&lt;/span&gt;True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;什麼範圍的小整數會快取，因Python的版本而有所不同。&lt;br /&gt;
&lt;br /&gt;
如果想要知道一個物件有幾個名稱參考至它，可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;sys.getrefcount()&lt;/span&gt;函式。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; import sys&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; sys.getrefcount(1)&lt;br /&gt;
&lt;/span&gt;117&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = [1, 2, 3]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; z = x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; sys.getrefcount(x)&lt;br /&gt;
&lt;/span&gt;4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                            &lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/601072477123607537/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4826.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/601072477123607537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/601072477123607537'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_4826.html' title='物件與記憶體管理'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-5698960576859631469</id><published>2011-09-09T15:38:00.000-07:00</published><updated>2011-09-09T15:38:18.167-07:00</updated><title type='text'>運算子</title><content type='html'>&lt;small&gt;到現在已經看過幾個運算子了，最基本的就是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;+、-、*、/&lt;/span&gt;運算子，當他們用在數值運算時是較為直覺的加、減、乘、除運算。不過，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;+&lt;/span&gt;在Python的物件上，往往可以作串接物件的作用，例如串接字串、串接Tuple、串接串列等，結果都是產生新的物件傳回：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &#39;Just&#39; + &#39;in&#39;&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; [1, 2] + [3, 4]&lt;br /&gt;
&lt;/span&gt;[1, 2, 3, 4]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1, 2) + (3, 4)&lt;br /&gt;
&lt;/span&gt;(1, 2, 3, 4)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;*&lt;/span&gt;在Python上，則通常可以作加倍的動作，例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &#39;Justin&#39; * 4&lt;br /&gt;
&lt;/span&gt;&#39;JustinJustinJustinJustin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; [1, 2] * 4&lt;br /&gt;
&lt;/span&gt;[1, 2, 1, 2, 1, 2, 1, 2]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1, 2) * 4&lt;br /&gt;
&lt;/span&gt;(1, 2, 1, 2, 1, 2, 1, 2)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;如果要作數值次方運算，則使用**。&lt;/small&gt;&lt;small&gt;例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; 9 ** 2&lt;br /&gt;
&lt;/span&gt;81&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 9 ** 3&lt;br /&gt;
&lt;/span&gt;729&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 9 ** 0.5&lt;br /&gt;
&lt;/span&gt;3.0&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在數值運算上，還有個&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;//&lt;/span&gt;運算子，這是用來取除法的商值，而&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;%&lt;/span&gt;則用來取除法的餘數。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; 10 // 3&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 10 % 3&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;Python還提供了關係運算（Rational operation）、邏輯運算（Logical operation）、位元運算（Bitwise operation）等對物件的運算子：&lt;/small&gt;&lt;br /&gt;
&lt;ul style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;li&gt;&lt;small&gt;關係運算：如&amp;gt;、&amp;gt;=、&amp;lt;、&amp;lt;=、==、!=&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;邏輯運算：如and、or、not&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;位 元運算：如&amp;amp;、|、~、^、&amp;gt;&amp;gt;、&amp;lt;&amp;lt;&lt;/small&gt;&lt;/li&gt;
&lt;li&gt;&lt;small&gt;指 定運算：如&lt;/small&gt;&lt;small&gt;+=、-=、*=、/=、%=、&lt;/small&gt;&lt;small&gt;&amp;amp;=、|=、~=、&amp;gt;&amp;gt;=、&amp;lt;&amp;lt;=...&lt;/small&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
&lt;small&gt;不僅僅是數值可以使用其它的運算子，在適當的場合，特定的物件也可以使用這些運算子，例如集合（Set）可以使用&amp;amp;、|、^來作交集、聯集等設定，可以參考 &lt;/small&gt;&lt;small&gt;&lt;big&gt;&lt;a href=&quot;http://caterpillar.onlyfun.net/Gossip/Python/SetType.html&quot;&gt;&lt;small&gt;集合&lt;/small&gt;&lt;/a&gt;&lt;/big&gt; &lt;/small&gt;&lt;small&gt;的說明。&lt;br /&gt;
&lt;br /&gt;
&lt;/small&gt;&lt;small&gt;在現階段，你可以先知道的是，運算子作用於物件的動作，其實是可以透過定義特殊方法（Method）來決定該如何進行處理。&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;例如+可以定義__add__()方法，而%可以定義__mod__()方法&lt;/span&gt;：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dir(1)&lt;br /&gt;
&lt;/span&gt;[&#39;__abs__&#39;, &#39;__add__&#39;, &#39;__and__&#39;, &#39;__bool__&#39;, &#39;__ceil__&#39;, &#39;__class__&#39;, &#39;__delatt&lt;br /&gt;
r__&#39;, &#39;__divmod__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__float__&#39;, &#39;__floor__&#39;, &#39;__floordiv__&lt;br /&gt;
&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getnewargs__&#39;, &#39;__gt__&#39;, &#39;__ha&lt;br /&gt;
sh__&#39;, &#39;__index__&#39;, &#39;__init__&#39;, &#39;__int__&#39;, &#39;__invert__&#39;, &#39;__le__&#39;, &#39;__lshift__&#39;,&lt;br /&gt;
&amp;nbsp;&#39;__lt__&#39;, &#39;__mod__&#39;, &#39;__mul__&#39;, &#39;__ne__&#39;, &#39;__neg__&#39;, &#39;__new__&#39;, &#39;__or__&#39;, &#39;__po&lt;br /&gt;
s__&#39;, &#39;__pow__&#39;, &#39;__radd__&#39;, &#39;__rand__&#39;, &#39;__rdivmod__&#39;, &#39;__reduce__&#39;, &#39;__reduce_&lt;br /&gt;
ex__&#39;, &#39;__repr__&#39;, &#39;__rfloordiv__&#39;, &#39;__rlshift__&#39;, &#39;__rmod__&#39;, &#39;__rmul__&#39;, &#39;__ro&lt;br /&gt;
r__&#39;, &#39;__round__&#39;, &#39;__rpow__&#39;, &#39;__rrshift__&#39;, &#39;__rshift__&#39;, &#39;__rsub__&#39;, &#39;__rtrue&lt;br /&gt;
div__&#39;, &#39;__rxor__&#39;, &#39;__setattr__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__sub__&#39;, &#39;__subcla&lt;br /&gt;
sshook__&#39;, &#39;__truediv__&#39;, &#39;__trunc__&#39;, &#39;__xor__&#39;, &#39;bit_length&#39;, &#39;conjugate&#39;, &#39;de&lt;br /&gt;
nominator&#39;, &#39;imag&#39;, &#39;numerator&#39;, &#39;real&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 1 + 2&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1).__add__(2)&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 10 % 3&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (10).__mod__(3)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;就算是&lt;span style=&quot;font-weight: bold;&quot;&gt;[]&lt;/span&gt;索引運算，也是可以透過對應的&lt;span style=&quot;font-weight: bold;&quot;&gt;__getitem__()&lt;/span&gt;、&lt;span style=&quot;font-weight: bold;&quot;&gt;__setitem()__&lt;/span&gt;來定義：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                          &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; dir([])&lt;br /&gt;
&lt;/span&gt;[&#39;__add__&#39;, &#39;__class__&#39;, &#39;__contains__&#39;, &#39;__delattr__&#39;, &#39;__delitem__&#39;, &#39;__doc__&#39;&lt;br /&gt;
, &#39;__eq__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getitem__&#39;, &#39;__gt__&#39;,&lt;br /&gt;
&amp;nbsp;&#39;__hash__&#39;, &#39;__iadd__&#39;, &#39;__imul__&#39;, &#39;__init__&#39;, &#39;__iter__&#39;, &#39;__le__&#39;, &#39;__len__&#39;&lt;br /&gt;
, &#39;__lt__&#39;, &#39;__mul__&#39;, &#39;__ne__&#39;, &#39;__new__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__re&lt;br /&gt;
pr__&#39;, &#39;__reversed__&#39;, &#39;__rmul__&#39;, &#39;__setattr__&#39;, &#39;__setitem__&#39;, &#39;__sizeof__&#39;, &#39;&lt;br /&gt;
__str__&#39;, &#39;__subclasshook__&#39;, &#39;append&#39;, &#39;count&#39;, &#39;extend&#39;, &#39;index&#39;, &#39;insert&#39;, &#39;p&lt;br /&gt;
op&#39;, &#39;remove&#39;, &#39;reverse&#39;, &#39;sort&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = [1, 2, 3]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x[1]&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.__getitem__(1)&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.__getitem__(2)&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x[2]&lt;br /&gt;
&lt;/span&gt;3&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x[0] = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.__setitem__(1, 20)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;[10, 20, 3]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;初學目前僅需了解到這邊，在了解如何自定義類別之後，將會再介紹如何定義這些特定的方法。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
在使用邏輯運算&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;and、or、not&lt;/span&gt;時，要注意到，&lt;/small&gt;&lt;small&gt;在Python中，數字不是0就是True，而所有物件不是「空」就是True，例如字&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;串&#39;Justin&#39;在判斷式中會是 True，而空字串&#39;&#39;在判斷式中會是False，所以空串列是False、空字典是False、空Tuple是False，而&lt;span style=&quot;font-weight: bold;&quot;&gt;None&lt;/span&gt;也是False。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                                 &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwd = &#39;&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; if not passwd:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;Password Required&#39;)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;Password Required&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;and、or有捷徑運算，and左運算元若判定為假，則就不會繼續運算右運算元，or則是左運算元判斷為真，則不的運算右運算元。當判斷確認時停在哪個運算元，就會傳回該運算元，例如：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; [] and &#39;Justin&#39;&lt;br /&gt;
&lt;/span&gt;[]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; [1, 2] and &#39;Justin&#39;&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; [] or &#39;Justin&#39;&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; [1, 2] or &#39;Justin&#39;&lt;br /&gt;
[1, 2]&lt;br /&gt;
&lt;/span&gt;&amp;gt;&amp;gt;&amp;gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;如果是&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;在判斷式中，同樣的，and、or傳回的運算元再進行True、False的結果判斷，即數字不是0就是True，而所有物件不是「空」就是True。例如：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; if [] and &#39;Justin&#39;:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;True&#39;)&lt;br /&gt;
... else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;False&#39;)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;False&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; if [1, 2] and &#39;Justin&#39;:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;True&#39;)&lt;br /&gt;
... else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(&#39;False&#39;)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/5698960576859631469/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_09.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/5698960576859631469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/5698960576859631469'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_09.html' title='運算子'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-1850393609045610467</id><published>2011-09-05T22:45:00.000-07:00</published><updated>2011-09-05T22:45:06.401-07:00</updated><title type='text'>變數</title><content type='html'>&lt;small&gt;依型態資訊是記錄在宣告在變數之上，或者是執行時期的物件之上，程式語言可以區分為靜態（Static）語言（例如C/C++、Java）與動態（Dynamic）語言（例如Python、JavaScript）。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
Python是動態語言，也就是變數本身並沒有型態資訊，型態的資訊是在執行時期的物件之上，在Python中要建立變數，無需宣告型態，只要命名變數並指定值給它，就建立了一個變數，在建立變數之前，嘗試存取某個變數會發生變數未定義的錯誤。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
NameError: name &#39;x&#39; is not defined&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = &#39;Justin&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;&#39;Justin&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在上例中，一開始建立了一個&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x&lt;/span&gt;變數，參考至整數10，由於變數本身沒有型態，之後你可以將字串&#39;Justin&#39;指定給&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x&lt;/span&gt;。在Python中，變數始終是個參考至真實物件的名稱，指定運算只是改變變數的參考對象。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 1.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;19437008&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;19437008&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y = 2.0&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;19437008&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(y)&lt;br /&gt;
&lt;/span&gt;19436976&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;small&gt;&lt;br /&gt;
在上例中，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x&lt;/span&gt;一開始參考至1.0整數物件，而後將&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x&lt;/span&gt;參考的物件指定給y來參考，你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;id()&lt;/span&gt;函式來取得所參考物件的記憶體位址代表數字，可以看到&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x與y&lt;/span&gt;都參考同一物件。之後&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;y&lt;/span&gt;參考至2.0，所以&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;x與y&lt;/span&gt;就參考至不同的物件。&lt;br /&gt;
&lt;br /&gt;
下面這個例子亦顯示了，變數在Python中只是一個參考（而所有的資料都是物件）：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;505389048&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = x + 1&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(x)&lt;br /&gt;
&lt;/span&gt;505389064&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;一開始x參考至1整數物件，之後+運算後，建立了新的2整數物件，而後指定給x，所以x參考至新的物件。由於變數在Python中只是個參考至物件的名稱，所以對於可變動物件，才會有以下的操作結果：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = [1, 2]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;[1, 2]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x[0] = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;[10, 2]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;small&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/small&gt;在Python中，&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;==&lt;/span&gt;用來比較兩個物件的實質內容是否相同。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; list1 = [1, 2, 3]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; list2 = [1, 2, 3]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; list1 == list2&lt;br /&gt;
&lt;/span&gt;True&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&amp;nbsp;           &lt;small&gt;&lt;small&gt;&lt;small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/small&gt;&lt;/small&gt;但實際上&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;list1與list2&lt;/span&gt;是參考至不同的物件。如果你想要比較兩個變數是否參考至同一物件，可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;is&lt;/span&gt;運算：&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; id(list1)&lt;br /&gt;
&lt;/span&gt;26224600&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; id(list2)&lt;br /&gt;
&lt;/span&gt;26225200&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; list1 is list2&lt;br /&gt;
&lt;/span&gt;False&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;變數本身沒有型態，若你透過變數操作物件的某個方法，只要確認該物件上確實有該方法即可。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;       &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = [1, 2, 3]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.index(2)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = (10, 20, 30)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.index(20)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;這是動態語言所流行的 &lt;a href=&quot;http://en.wikipedia.org/wiki/Duck_typing&quot;&gt;鴨子定型（Duck typing）&lt;/a&gt;：「如果它走路像個鴨子，游泳像個鴨子，叫聲像個鴨子，那它就是鴨子。」&lt;br /&gt;
&lt;br /&gt;
如果你不再需要一個變數，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;del&lt;/span&gt;將之刪除。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;              &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
NameError: name &#39;x&#39; is not defined&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/1850393609045610467/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_3728.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/1850393609045610467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/1850393609045610467'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_3728.html' title='變數'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-3338871369696163153</id><published>2011-09-05T22:43:00.000-07:00</published><updated>2011-09-05T22:43:08.907-07:00</updated><title type='text'>Tuple</title><content type='html'>&lt;small&gt;在Python中，Tuple就像是串列（List），不過串列是可變動（Mutable）物件，而Tuple是不可變動（Immutable）物件。你可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;()&lt;/span&gt;來建立Tuple物件，也可以直接逗號區隔元素來建立Tuple物件。例如&lt;/small&gt;&lt;small&gt;：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; (1, &#39;Justin&#39;, 93)&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;, 93)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; 1, &#39;Justin&#39;, 93&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;, 93)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; data = (1, &#39;Justin&#39;, 93)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; data[0]&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; data[0:2]&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; data[0:]&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;, 93)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for elem in data:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(elem)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;1&lt;br /&gt;
Justin&lt;br /&gt;
93&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1, &#39;Justin&#39;, 93) + (2, &#39;momor&#39;, 99)&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;, 93, 2, &#39;momor&#39;, 99)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1, &#39;Justin&#39;, 93) * 2&lt;br /&gt;
&lt;/span&gt;(1, &#39;Justin&#39;, 93, 1, &#39;Justin&#39;, 93)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;串列中的索引特性、切片運算、&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;for&lt;/span&gt;迴圈迭代等操作，只要不變動Tuple的內容，都可以直接在Tuple在上運作。&lt;br /&gt;
&lt;br /&gt;
如果你要建立單一元素的Tuple，記得不要僅使用括號，而必須在單一元素後加上一個逗號，以免被認定為數值等其它型態。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; (1)&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (1,)&lt;br /&gt;
&lt;/span&gt;(1,)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tuple([1])&lt;br /&gt;
&lt;/span&gt;(1,)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tuple([1, 2])&lt;br /&gt;
&lt;/span&gt;(1, 2)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;你也可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;tuple&lt;/span&gt;來建立Tuple，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;tuple&lt;/span&gt;接受可迭代（iterable）物件（例如串列）作為建構Tuple之用。&lt;br /&gt;
&lt;br /&gt;
由於Tuple的內容是不能變動的，所以你不能對它作變更操作，例如排序，若你想要排序Tuple，則必須先取得當中元素、排序後重新建構Tuple。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; t1 = (3, 6, 1, 2, 7)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; l1 = list(t1)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; l1.sort()&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t1 = tuple(l1)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t1&lt;br /&gt;
&lt;/span&gt;(1, 2, 3, 6, 7)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;Tuple的內容不可變動，指的是不能變動每個索引所參考的物件，而不是指物件本身不能變動。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; t = ([1, 2], [3, 4])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t&lt;br /&gt;
&lt;/span&gt;([1, 2], [3, 4])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t[0] = [10, 20]&lt;/span&gt;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
TypeError: &#39;tuple&#39; object does not support item assignment&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t[0][0] = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t[0][1] = 20&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t&lt;br /&gt;
&lt;/span&gt;([10, 20], [3, 4])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;上例中，打算指定Tuple索引0為新的串列物件是不可行的，但&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;t[0][0]&lt;/span&gt;指的是改變索引0處的串列索引0的元素，同樣的&lt;/small&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;t[0][1]&lt;/small&gt;&lt;small&gt;指的是改變索引0處的串列索引1的元素，也就是相當於：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; t = ([1, 2], [3, 4])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; l = t[0]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; l[0] = 10&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; l[1] = 20&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t&lt;br /&gt;
&lt;/span&gt;([10, 20], [3, 4])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;Tuple的內容，可以同時指定給多個變數。例如：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                            &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; x, y = 1, 2&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; t = (10, 20)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x, y = t&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x, y = y, x&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;20&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;10&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;       &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;注意&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;x, y = y, x&lt;/span&gt;該行，實際上就等於在作交換（Swap）的動作，由於Tuple指定的特性，使得交換的動作在Python中並不需要暫存變數。&lt;/small&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;事實上，串列、集合，都可以用類似的方式來指定：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; [x, y] = [1, 2]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x, y = [1, 2]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; (x, y) = [1, 2]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x, y = {1, 2}&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;2&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x, y, z = &#39;Joe&#39;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
&lt;/span&gt;&#39;J&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; y&lt;br /&gt;
&lt;/span&gt;&#39;o&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; z&lt;br /&gt;
&lt;/span&gt;&#39;e&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;在Python 3中，還有個擴充的指定方式：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                                   &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; s = [1, 2, 3, 4, 5]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a, *b = s&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;
&lt;/span&gt;[2, 3, 4, 5]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; *a, b = s&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;
&lt;/span&gt;[1, 2, 3, 4]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;
&lt;/span&gt;5&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; *a, b, c = s&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;
&lt;/span&gt;[1, 2, 3]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;
&lt;/span&gt;4&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; c&lt;br /&gt;
&lt;/span&gt;5&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a, *b, c = s&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; a&lt;br /&gt;
&lt;/span&gt;1&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; b&lt;br /&gt;
&lt;/span&gt;[2, 3, 4]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; c&lt;br /&gt;
&lt;/span&gt;5&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;              &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;你可以在左邊的變數指定一個*，未指定的變數會被指定一個值，而剩餘的元素會被指定給*所標註的變數。&lt;/small&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/3338871369696163153/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/tuple.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/3338871369696163153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/3338871369696163153'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/tuple.html' title='Tuple'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6111972296244562865.post-368168873482158621</id><published>2011-09-05T22:41:00.001-07:00</published><updated>2011-09-05T22:41:47.358-07:00</updated><title type='text'>字典</title><content type='html'>&lt;small&gt;在Python中，字典物件是儲存鍵（Key）/值（Value）對應的物件，為&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;dict&lt;/span&gt;的實例。直接示範如何以實字建立字典物件：&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                     &lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwords = {&#39;Justin&#39; : 123456, &#39;caterpillar&#39; : 933933}&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords[&#39;Justin&#39;]&lt;br /&gt;
&lt;/span&gt;123456&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords[&#39;caterpillar&#39;]&lt;br /&gt;
&lt;/span&gt;933933&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords[&#39;Hamimi&#39;] = 970221&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
{&#39;caterpillar&#39;: 933933, &#39;Hamimi&#39;: 970221, &#39;Justin&#39;: 123456}&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords[&#39;Hamimi&#39;]&lt;br /&gt;
&lt;/span&gt;970221&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; del passwords[&#39;caterpillar&#39;]&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;Hamimi&#39;: 970221, &#39;Justin&#39;: 123456}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;建立字典時，每個鍵物件（在上例中是字串，也可以是任何不可變動的物件，像是數字或Tuple等）會用來取得對應的值物件，指定鍵物件取得值物件時是使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;[]&lt;/span&gt;運算子。建立字典物件後，你可以隨時再加入鍵/值。如果要刪除某個鍵/值，則可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;del&lt;/span&gt;。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;直接使用[]指定鍵要取得值時，若字典中並沒有該鍵的存在，則會丟出&lt;span style=&quot;font-weight: bold;&quot;&gt;KeyError&lt;/span&gt;。可以使用in來測試鍵是否存在於字典中。例如：&lt;/span&gt;&lt;/small&gt;&lt;small&gt;&lt;br /&gt;
&lt;/small&gt;                     &lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwords[&#39;caterpillar&#39;]&lt;br /&gt;
&lt;/span&gt;Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
KeyError: &#39;caterpillar&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; if &#39;caterpillar&#39; in passwords:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(passwords[&#39;Justin&#39;])&lt;br /&gt;
... else:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(None)&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;None&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(passwords.get(&#39;caterpillar&#39;))&lt;br /&gt;
&lt;/span&gt;None&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; print(passwords.get(&#39;caterpillar&#39;, &#39;NO_PASSWORD&#39;))&lt;br /&gt;
&lt;/span&gt;NO_PASSWORD&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;上例中，也示範了字典的&lt;span style=&quot;font-weight: bold;&quot;&gt;get()&lt;/span&gt;方法，使用get()方法指定的鍵若不存在，預設會傳回None，get()可以指定預設值，在指定的鍵不存在時就傳回預設值。&lt;/small&gt;&lt;br /&gt;
&lt;small&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;update()&lt;/span&gt;將指定的字典物件加入，使用&lt;span style=&quot;font-weight: bold;&quot;&gt;pop()&lt;/span&gt;方法可以指定鍵將對應的鍵/值取出並從字典中移除。例如：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;Hamimi&#39;: 970221, &#39;Justin&#39;: 123456}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.update({&#39;Momor&#39; : 670723})&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;Hamimi&#39;: 970221, &#39;Justin&#39;: 123456, &#39;Momor&#39;: 670723}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.pop(&#39;Justin&#39;)&lt;br /&gt;
&lt;/span&gt;123456&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;Hamimi&#39;: 970221, &#39;Momor&#39;: 670723}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;如果要取得字典中的鍵/值，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;items()&lt;/span&gt;方法，這會以&lt;span style=&quot;font-weight: bold;&quot;&gt;dict_items&lt;/span&gt;物件，當中是以&lt;/span&gt;Tuple&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;儲存每一對鍵/值。如果要取得鍵，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;keys()&lt;/span&gt;方法，這會傳回&lt;span style=&quot;font-weight: bold;&quot;&gt;dict_keys&lt;/span&gt;物件，當中包括所有的鍵。如果要取得值，則可以使用&lt;span style=&quot;font-weight: bold;&quot;&gt;values()&lt;/span&gt;方法，這會傳回&lt;span style=&quot;font-weight: bold;&quot;&gt;dict_values&lt;/span&gt;物件，當中包括所有的值。例如：&lt;/span&gt;&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; for person in passwords:&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(passwords[person])&lt;br /&gt;
...&lt;br /&gt;
&lt;/span&gt;970221&lt;br /&gt;
670723&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.items()&lt;br /&gt;
&lt;/span&gt;dict_items([(&#39;Hamimi&#39;, 970221), (&#39;Momor&#39;, 670723)])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for item in passwords.items():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(item)&lt;br /&gt;
...&lt;/span&gt;&lt;br /&gt;
(&#39;Hamimi&#39;, 970221)&lt;br /&gt;
(&#39;Momor&#39;, 670723)&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.keys()&lt;br /&gt;
&lt;/span&gt;dict_keys([&#39;Hamimi&#39;, &#39;Momor&#39;])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for key in passwords.keys():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(key)&lt;br /&gt;
...&lt;/span&gt;&lt;br /&gt;
Hamimi&lt;br /&gt;
Momor&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; list(passwords.keys())&lt;br /&gt;
&lt;/span&gt;[&#39;Hamimi&#39;, &#39;Momor&#39;]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.values()&lt;br /&gt;
&lt;/span&gt;dict_values([970221, 670723])&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; for value in passwords.values():&lt;br /&gt;
...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print(value)&lt;br /&gt;
...&lt;/span&gt;&lt;br /&gt;
970221&lt;br /&gt;
670723&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; list(passwords.values())&lt;br /&gt;
&lt;/span&gt;[970221, 670723]&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;/span&gt;實際上，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;items()、keys()&lt;/span&gt;傳回的物件具有集合（Set）的特性，可以與集合物件進行運算，&lt;span style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;values()&lt;/span&gt;則否，因為值不一定是唯一的（不同的鍵可能有相同的值），所以無法視為集合。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwords.items() | {&#39;x&#39;, &#39;y&#39;}&lt;br /&gt;
&lt;/span&gt;{&#39;y&#39;, (&#39;Momor&#39;, 670723), &#39;x&#39;, (&#39;Hamimi&#39;, 970221)}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.keys() | {&#39;x&#39;, &#39;y&#39;}&lt;br /&gt;
&lt;/span&gt;{&#39;y&#39;, &#39;x&#39;, &#39;Hamimi&#39;, &#39;Momor&#39;}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords.values() | {&#39;x&#39;, &#39;y&#39;}&lt;/span&gt;&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp; File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
TypeError: unsupported operand type(s) for |: &#39;dict_values&#39; and &#39;set&#39;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;&lt;br /&gt;
&lt;small&gt;除了實字表示方式之外，你也可以使用&lt;span style=&quot;font-family: Courier New,Courier,monospace; font-weight: bold;&quot;&gt;dict&lt;/span&gt;來建立字典。例如：&lt;/small&gt;&lt;br /&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;2&quot; cellspacing=&quot;2&quot; style=&quot;text-align: left; width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;                 &lt;td style=&quot;background-color: black;&quot;&gt;&lt;small style=&quot;font-family: Courier New,Courier,monospace;&quot;&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; passwords = dict(justin = 123456, momor = 670723, hamimi = 970221)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;hamimi&#39;: 970221, &#39;justin&#39;: 123456, &#39;momor&#39;: 670723}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords = dict([(&#39;justin&#39;, 123456), (&#39;momor&#39;, 670723), (&#39;hamimi&#39;, 970221)])&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; passwords&lt;br /&gt;
&lt;/span&gt;{&#39;hamimi&#39;: 970221, &#39;justin&#39;: 123456, &#39;momor&#39;: 670723}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; dict.fromkeys([&#39;Justin&#39;, &#39;momor&#39;], &#39;NEED_TO_CHANGE&#39;)&lt;br /&gt;
&lt;/span&gt;{&#39;Justin&#39;: &#39;NEED_TO_CHANGE&#39;, &#39;momor&#39;: &#39;NEED_TO_CHANGE&#39;}&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/small&gt;&lt;span style=&quot;color: white;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;                     &lt;/table&gt;</content><link rel='replies' type='application/atom+xml' href='http://pyhon3.blogspot.com/feeds/368168873482158621/comments/default' title='張貼留言'/><link rel='replies' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_9477.html#comment-form' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/368168873482158621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6111972296244562865/posts/default/368168873482158621'/><link rel='alternate' type='text/html' href='http://pyhon3.blogspot.com/2011/09/blog-post_9477.html' title='字典'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/18391506761621353502</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>