Python 3.5.1 入門指南

96
一少糖米
0.2 2018.08.15 16:30 字數 56969
  1. 開胃菜
    如果你要用計算機做很多工作-_|掌上永辉APP考勤,最後你會發現有一些任務你更希望用自動化的方式進行處理|-_sss355。比如||魔龙辅助官网,你想要在大量的文本文件中執行查找/替換-|-诺基亚5700主题,或者以複雜 的方式對大量的圖片進行重命名和整理_|注册赠送彩金的彩票网站。也許你想要編寫一個小型的自定義數據庫|该隐打卡修斯、一個特殊的 GUI 應用程序或一個簡單的小遊戲_-_如来陈涛。
    如果你是一名專業的軟件開發者-|苏木精,可能你必須使用幾種 C/C++/JAVA 類庫|_-智彩快乐十分电子走势图陕西,並且發現通常編寫/編譯/測試/重新編譯的周期是如此漫長-|运盛彩票作弊。也許你正在為這些類庫編寫測試用例|_陈光标肩挑钞票捐款,但是發現這是一個讓人煩躁的工作-海豚音那首歌叫什么。又或者你已經完成 了一個可以使用擴展語言的程序|永盛彩票旧版,但你並不想為此重新設計並實現一套全新的語言|_|上海癫痫病中潭医院。
    那麼 Python 正是你所需要的語言|-|3208c刷机。
    雖然你能夠通過編寫 Unix shell 腳本或 Windows 批處理文件來處理其中的某些任務|_|靓车屋,但 Shell 腳本更適合移動文件或修改文本數據_--刑天后传全集,並不適合編寫 GUI 應用程序或遊戲-重生之逍遥风流;雖然你能夠使用 C/C++/JAVA 編寫程序_|众亿超级彩,但即使編寫一個簡單的 first-draft 程序也有可能耗費大量的開發時間|_苏泊尔电压力锅使用方法。相比之下|_|租东西,Python 更易於使用__|娱乐天地检点实v力22956,無論在 Windows-_众赢彩票主页、Mac OS X 或 Unix 操作係統上它都會幫助你更快地完成任務--_256老彩票。
    雖然 Python 易於使用||-性价比笔记本电脑,但它卻是一門完整的編程語言-35彩票app;與 Shell 腳本或批處理文件相比_|夸克电影网,它為編寫大型程序提供了更多的結構和支持3218彩城平台下载。另一方麵_|优信彩票是真是假,Python 提供了比 C 更多的錯誤檢查_||2000彩测速,並且作為一門 高級語言|-_畅宜左旋肉碱泡腾片,它內置支持高級的數據結構類型|_盐城一中贴吧,例如-_某糕点厂中秋节前要制作一批盒装月饼:靈活的數組和字典|-诺基亚6120c软件下载。因其更多的通用數據類型-__5s是什么意思,Python 比 Awk 甚至 Perl 都適用於更多問題領域-|_阿玛尼2012男装,至少大多數事情在 Python 中與其他語言同樣簡單-人族大讲堂。
    Python 允許你將程序分割為不同的模塊-_-注册送28信誉彩票网,以便在其他的 Python 程序中重用_|_优乐彩平台安全吗。Python 內置提供了大量的標準模塊||青岛44中,你可以將其用作程序的基礎_|038彩票ios下载,或者作為學習 Python 編程的示例-长垣车祸。這些模塊提供了諸如文件 I/O|--云霄门、係統調用-|_美视佳、Socket 支持_2019世界杯竞彩足球,甚至類似 Tk 的用戶圖形界麵(GUI)工具包接口|360购彩彩票大厅。
    Python 是一門解釋型語言__psp维修,因為無需編譯和鏈接qq炫舞答题练习答案,你可以在程序開發中節省寶貴的時間_-_鹤大公路。Python 解釋器可以交互的使用-||冷情王爷痴情妃,這使得試驗語言的特性_|_冰雪皇后优惠券、編寫臨時程序或在自底向上的程序開發中測試方法非常容易-_刘玉玲电影flypaper。你甚至還可以把它當做一個桌麵計算器_-计提职工福利费分录。
    Python 讓程序編寫的緊湊和可讀_-陈诚传。用 Python 編寫的程序通常比同樣的 C|-11选5走势图软件、C++ 或 Java 程序更短小-__亿赢彩票平台,這是因為以下幾個原因:
  • 高級數據結構使你可以在一條語句中表達複雜的操作|_-锅炉控制箱;

  • 語句組使用縮進代替開始和結束大括號來組織优酷加速器下载;

  • 變量或參數無需聲明||_浪翻云博客。
    Python 是 可擴展 的青岛开发区十中:如果你會 C 語言編程便可以輕易地為解釋器添加內置函數或模塊|-殷世航个人资料,或者為了對性能瓶頸作優化_-0165彩票iphone版,或者將 Python 程序與隻有二進製形式的庫(比如某個專業的商業圖形庫)連接起來-__林志炫北京演唱会。一旦你真正掌握了它_-_中科彩票220,你可以將 Python 解釋器集成進某個 C 應用程序掌上购彩合法吗,並把它當作那個程序的擴展或命令行語言|__160彩票网站安全吗。
    順便說一句-_秦国赵弋,這個語言的名字來自於 BBC 的 “Monty Python’s Flying Cirecus” 節目__|俏模牌轻靓减肥胶囊,和爬行類動物沒有任何關係___乐zone。在文檔中引用 Monty Python 的典故不僅可行|_106苹果下载,而且值得鼓勵_--我的心怎么了!
    現在你已經為 Python 興奮不已了吧||清华同方锋锐k431,大概想要領略一些更多的細節|_-160彩票是真的吗!學習一門語言最好的方法就是使用它-_-勇士vs步行者,本指南推薦你邊讀邊使用 Python 解釋器練習|_|画家乡。
    下一節中||乔任梁死亡现场血腥图,我們將解釋 Python 解釋器的用法--良妃娘娘。這是很簡單的一件事情_-|重庆公交图吧,但它有助於試驗後麵的例子__038彩票平台合法吗。
    本手冊剩下的部分將通過示例介紹 Python 語言及係統的諸多特性|--小学安全教育记录,開始是簡單的語法-||芳城园二区、數據類型和表達式__cctv6电影频道节目表,接著介紹函數與模塊||_随州电影院,最後涉及異常和自定義類這樣的高級內容-|-申诚医院。

  1. 使用 Python 解釋器
    2.1. 調用 Python 解釋器
    Python 解釋器通常被安裝在目標機器的 /usr/local/bin/python3.5 目錄下--注册银彩app。將 /usr/local/bin 目錄包含進 Unix shell 的搜索路徑裏|众发娱乐属于赌博吗,以確保可以通過輸入:
    python3.5
    命令來啟動他-||掌上彩票平台。[1] 由於 Python 解釋器的安裝路徑是可選的||路克丽丝女裤,這也可能是其它路徑___永盛国际平台客服电话,你可以聯係安裝 Python 的用戶或係統管理員確認(例如_|重庆历任书记,/usr/local/python 就是一個常見的選擇)_|_长虹z1怎么样。
    在 Windows 機器上|_有没有那样的网站,Python 通常安裝在 C:\Python35 位置||2004009期双色球号码,當然你可以在運行安裝向導時修改此值_-_爱玩毛线球。要想把此目錄添加到你的 PATH 環境變量中|金地荔湖城业主论坛,你可以在 DOS 窗口中輸入以下命令:
    set path=%path%;C:\python35
    通常你可以在主窗口輸入一個文件結束符(Unix 係統是 Control-D_赢天下什么时候上映,Windows 係統是 Control-Z)讓解釋器以 0 狀態碼退出_|-梧州网通露天影院。如果那沒有作用|__瑞丽裳电子杂志,你可以通過輸入 quit() 命令退出解釋器|_杨幂和杨颖的裸体图片。
    Python 解釋器具有簡單的行編輯功能_|小爸爸13集插曲。在 Unix 係統上|亿博平台,任何 Python 解釋器都可能已經添加了 GNU readline 庫支持|-|永胜讨债发短信我上门,這樣就具備了精巧的交互編輯和曆史記錄等功能_-|臭作游戏图片。在 Python 主窗口中輸入 Control-P 可能是檢查是否支持命令行編輯的最簡單的方法_||河间新闻。如果發出嘟嘟聲(計算機揚聲器)_-泷泽罗拉种子下载,則說明你可以使用命令行編輯功能||_畅购卡;更多快捷鍵的介紹請參考 交互式輸入行編輯曆史回溯-|_黎族服饰。如果沒有任何聲音-|-autocad2004破解版下载,或者顯示 ^P 字符|--魔幻西游online,則說明命令行編輯功能不可用_-qzone6空间克隆;你隻能通過退格鍵從當前行刪除已鍵入的字符並重新輸入_二炮政治部主任。
    Python 解釋器有些操作類似 Unix shell-_高中研究性学习范文:當使用終端設備(tty)作為標準輸入調用時_--银彩注册平台,它交互的解釋並執行命令-|苏州齐并广告公司;當使用文件名參數或以文件作為標準輸入調用時--娱乐天地彩票真假,它讀取文件並將文件作為 腳本 執行__陆贞传奇陆贞身世。
    第二種啟動 Python 解釋器的方法是 python -c command [arg] ...-东国大学庆州校区,這種方法可以在 命令行 執行 Python 語句_--钢铁悍将,類似於 shell 中的 -c 選項--_2228期七星彩开奖号码。由於 Python 語句通常會包含空格或其他特殊 shell 字符_-远博娱乐,一般建議將 命令 用單引號包裹起來|__优彩彩票苹果。
    有一些 Python 模塊也可以當作腳本使用__|众发彩票是违法网站吗。你可以使用 python -m module [arg] ... 命令調用它們-__永胜集团充钱,這類似在命令行中鍵入完整的路徑名執行 模塊 源文件一樣|-柏木美玲。
    使用腳本文件時__一家人的兽交小说,經常會運行腳本然後進入交互模式_|金阳丹。這也可以通過在腳本之前加上 -i 參數來實現|_qq2011下载正式版免费下载。
    2.1.1. 參數傳遞
    調用解釋器時-爱相约国际交友网,腳本名和附加參數傳入一個名為 sys.argv 的字符串列表_||陈百强演唱会高清。你能夠獲取這個列表通過執行 import sys_--窖口客运站网上订票,列表的長度大於等於1||2016奥运会中国金牌数;沒有給定腳本和參數時--2228期七星彩开奖号码,它至少也有一個元素|--浪漫刺客片尾曲:sys.argv[0] 此時為空字符串__苏州市公交线路图。腳本名指定為 '-' (表示標準輸入)時||全鹿大补胶囊, sys.argv[0] 被設定為 '-'___雷迪嘎嘎成名曲,使用 -c 指令 時-_-亿彩彩票官网欢迎你,sys.argv[0] 被設定為 '-c'--双色球最新500期走。使用 -m 模塊 參數時|_亿彩彩票是不是违法的,sys.argv[0] 被設定為指定模塊的全名|_亿彩彩票正规嘛。-c 指令 或者 -m 模塊 之後的參數不會被 Python 解釋器的選項處理機製所截獲-||史酷比古墓逃生,而是留在 sys.argv 中--_11选5提现多久能到账,供腳本命令操作_|铟钢尺。
    2.1.2. 交互模式
    從 tty 讀取命令時-038彩票ios,我們稱解釋器工作於 交互模式|--阳城县人力资源和社会保障局。這種模式下它根據主提示符來執行-|二手房购房定金合同,主提示符通常標識為三個大於號(>>>)_|_360彩票购彩大厅;繼續的部分被稱為 從屬提示符||-4466k最近,由三個點標識(...)|_臭作游戏图片。在第一行之前|--3分快3计划3期必中,解釋器打印歡迎信息|-11选5无死角每期必中、版本號和授權提示:
    $ python3.5
    Python 3.5 (default, Mar 16 2014, 09:25:04)
    [GCC 4.8.2] on linux
    Type "help", "copyright", "credits" or "license" for more information.

輸入多行結構時需要從屬提示符了|_2017黄播直播app,例如|_霍邱电影院,下麵這個 if 語句:

the_world_is_flat = 1
if the_world_is_flat:
... print("Be careful not to fall off!")
...
Be careful not to fall off!
關於交互模式更多的內容-_沈阳网通测速,請參見 交互模式--|金陵丸子是哪里的菜。
2.2. 解釋器及其環境
2.2.1. 源程序編碼
默認情況下_盈彩网合法吗,Python 源文件是 UTF-8 編碼|注册送18元的彩票App。在此編碼下_|13彩里面的群是干啥的,全世界大多數語言的字符可以同時用在字符串||安泽征婚、標識符和注釋中 — 盡管 Python 標準庫僅使用 ASCII 字符做為標識符_-春天的作文200字,這隻是任何可移植代碼應該遵守的約定__银港在线。如果要正確的顯示所有的字符||_三星5320,你的編輯器必須能識別出文件是 UTF-8 編碼-重生洪荒之鸿蒙圣尊,並且它使用的字體能支持文件中所有的字符_助赢手机版免费。
你也可以為源文件指定不同的字符編碼|--娱乐天地彩票平台。為此__瑞士传统鹿氏断食法,在 #! 行(首行)後插入至少一行特殊的注釋行來定義源文件的編碼:

-- coding: encoding --

通過此聲明_镇江司法警官学校,源文件中所有的東西都會被當做用 encoding 指代的 UTF-8 編碼對待_|违章动物mv什么意思。在 Python 庫參考手冊 codecs 一節中你可以找到一張可用的編碼列表|-|徐娇新浪微博。
例如|_众购彩票注册,如果你的編輯器不支持 UTF-8 編碼的文件-_|i9300i9500,但支持像 Windows-1252 的其他一些編碼_|-众彩平台app,你可以定義:

-- coding: cp-1252 --

這樣就可以在源文件中使用 Windows-1252 字符集中的所有字符了-|_绍兴古筝。這個特殊的編碼注釋必須在文件中的 第一或第二 行定義|11068彩票app。
Footnotes
[1] 在 Unix 係統上--_注册送29彩金平台,Python 3.X 解釋器默認未被安裝成名為 python 的命令-_认识国旗,所以它不會與同時安裝在係統中的 Python 2.x 命令衝突-|_至尊娱乐平台下载地址。

  1. Python 簡介
    下麵的例子中-苗老表,輸入和輸出分別由大於號和句號提示符( >>> 和 ... )標注|-神医傻妃txt新浪:如果想重現這些例子|_-熊继柏在哪坐诊,就要在解釋器的提示符後|||22彩票网址,輸入(提示符後麵的)那些不包含提示符的代碼行-__东北二嫂水仙百度云。需要注意的是在練習中遇到的從屬提示符表示你需要在最後多輸入一個空行|长安太平洋会,解釋器才能知道這是一個多行命令的結束_花为眉男主角。
    本手冊中的很多示例——包括那些帶有交互提示符的——都含有注釋-||360重庆老实时走势图。Python 中的注釋以 # 字符起始_||深圳市宝安区基础教育科,直至實際的行尾(譯注——這裏原作者用了 physical line 以表示實際的換行而非編輯器的自動換行)---众赢彩票能刷反水吗。注釋可以從行首開始-|_2628彩票登录网站,也可以在空白或代碼之後--|亿彩堂官方下载,但是不出現在字符串中-_-动作猜谜游戏。文本字符串中的 # 字符僅僅表示 # --208彩票。代碼中的注釋不會被 Python 解釋_|-长沙黄花机场到火车站,錄入示例的時候可以忽略它們_|234彩票网络平台提款。
    如下示例:

this is the first comment

spam = 1 # and this is the second comment
# ... and now a third!
text = "# This is not a comment because it's inside quotes."
3.1. 將 Python 當做計算器
我們來嚐試一些簡單的 Python 命令|-|茶黄蓟马。啟動解釋器然後等待主提示符 >>> 出現(不需要很久)_-掌上彩票是真实的吗。
3.1.1. 數字
解釋器表現得就像一個簡單的計算器|__cf夜玫瑰h吧:可以向其錄入一些表達式_-|雪弗莱suv,它會給出返回值-||众赢国际是传销吗。表達式語法很直白|_许雯may:運算符 +_-银山智人,-|12306智行火车电话,* 和 / 與其它語言一樣(例如_-_舟山跨海大桥过桥费:Pascal 或 C)|-|色拉拉;括號 (()) 用於分組|-135天空彩票与你同行。例如:

2 + 2
4
50 - 56
20
(50 - 5
6) / 4
5.0
8 / 5 # division always returns a floating point number
1.6
整數(例如|_-河北保定38军,2|_dhc滋养化妆水, 4__错误类型500, 20 )的類型是 int_春节节目单,帶有小數部分的數字(例如|__谁能百里挑一于淼,5.0078彩票代理是骗局吗, 1.6)的類型是 float--|育婴房官网。在本教程的後麵我們會看到更多關於數字類型的內容_||众发彩票彩种。
除法(/)永遠返回一個浮點數|__1分钟时时彩网站多少。如要使用 floor 除法 並且得到整數結果(丟掉任何小數部分)-_青岛生活在线直播,你可以使用 // 運算符|198彩票扣牌怎么样;要計算餘數你可以使用 %
17 / 3 # classic division returns a float
5.666666666666667

17 // 3 # floor division discards the fractional part
5
17 % 3 # the % operator returns the remainder of the division
2
5 * 3 + 2 # result * divisor + remainder
17
通過 Python_大庆羽毛球网,還可以使用 ** 運算符計算冪乘方 [1]:
5 ** 2 # 5 squared
25
2 ** 7 # 2 to the power of 7
128
等號( '=' )用於給變量賦值|-意彩。賦值之後|__0投入日赚1000的平台,在下一個提示符之前不會有任何結果顯示:
width = 20
height = 5*9
width * height
900
變量在使用前必須 “定義”(賦值)陕西府谷县,否則會出錯:

try to access an undefined variable

... n
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined
浮點數有完整的支持|_湖南基础教育资源网;整數和浮點數的混合計算中-_盈彩官网app下载,整數會被轉換為浮點數:

3 * 3.75 / 1.5
7.5
7.0 / 2
3.5
交互模式中__-长城h8事件,最近一個表達式的值賦給變量 ---赢发彩票平台。這樣我們就可以把它當作一個桌麵計算器--_2011qq下载,很方便的用於連續計算_2017香港金像奖直播,例如:
tax = 12.5 / 100
price = 100.50
price * tax
12.5625
price + _
113.0625
round(
, 2)
113.06
此變量對於用戶是隻讀的|雪碧真我飞扬 放言真我。不要嚐試給它賦值 —— 你隻會創建一個獨立的同名局部變量_|_苏耀光,它屏蔽了係統內置變量的魔術效果_|东港宋老六。
除了 int 和 float|_许昌三中校服,Python 還支持其它數字類型-_11086移动彩票co,例如 Decimal 和 Fraction|_-荆门运动人网。Python 還內建支持 複數 ||_nokia6120c软件下载,使用後綴 j 或 J 表示虛數部分(例如__铁路调度系统,3+5j)_订房电话。
3.1.2. 字符串
相比數值_|_365彩票首页,Python 也提供了可以通過幾種不同方式表示的字符串_||3cp彩票注册。它們可以用單引號 ('...') 或雙引號 ("...") 標識 [2]|-|1288彩票303版本。\ 可以用來轉義引號:
'spam eggs' # single quotes
'spam eggs'
'doesn't' # use ' to escape the single quote...
"doesn't"
"doesn't" # ...or use double quotes instead
"doesn't"
'"Yes," he said.'
'"Yes," he said.'
""Yes," he said."
'"Yes," he said.'
'"Isn't," she said.'
'"Isn't," she said.'
在交互式解釋器中||-亲情电影,輸出的字符串會用引號引起來_黄山奇石天狗望月,特殊字符會用反斜杠轉義_||北京迪卡侬营业时间。雖然可能和輸入看上去不太一樣_-|助赢论坛官网,但是兩個字符串是相等的-365高反水彩票平台。如果字符串中隻有單引號而沒有雙引號-|十字星是什么意思,就用雙引號引用_--鼻科手术中文版,否則用單引號引用||进口摩托车市场。print() 函數生成可讀性更好的輸出, 它會省去引號並且打印出轉義後的特殊字符_-_陈允斌博客:
'"Isn't," she said.'
'"Isn't," she said.'
print('"Isn't," she said.')
"Isn't," she said.
s = 'First line.\nSecond line.' # \n means newline
s # without print(), \n is included in the output
'First line.\nSecond line.'
print(s) # with print(), \n produces a new line
First line.
Second line.
如果你前麵帶有 \ 的字符被當作特殊字符|-cces快递查询单号,你可以使用 原始字符串||卓易彩票里的钱怎么取,方法是在第一個引號前麵加上一個 r:
print('C:\some\name') # here \n means newline!
C:\some
ame
print(r'C:\some\name') # note the r before the quote
C:\some\name
字符串文本能夠分成多行-||注册彩票网站违法吗。一種方法是使用三引號-__陈楚河张檬:"""...""" 或者 '''...'''-|辽宁都市频道直播。行尾換行符會被自動包含到字符串中-_|gts3370,但是可以在行尾加上 \ 來避免這個行為-10万以下越野车大全。下麵的示例_-|潘春春 樊玲: 可以使用反斜杠為行結尾的連續字符串_意大利凯撒卫浴,它表示下一行在邏輯上是本行的後續內容:
print("""
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
""")
將生成以下輸出(注意|钱学森子女,沒有開始的第一行):
Usage: thingy [OPTIONS]
-h Display this usage message
-H hostname Hostname to connect to
字符串可以由 + 操作符連接(粘到一起)|-脑死亡是什么意思,可以由 * 表示重複:

3 times 'un', followed by 'ium'

3 * 'un' + 'ium'
'unununium'
相鄰的兩個字符串文本自動連接在一起|_-优盛娱乐彩票。:
'Py' 'thon'
'Python'
它隻用於兩個字符串文本-|抓住偷水贼,不能用於字符串表達式:
prefix = 'Py'
prefix 'thon' # can't concatenate a variable and a string literal
...
SyntaxError: invalid syntax
('un' * 3) 'ium'
...
SyntaxError: invalid syntax
如果你想連接多個變量或者連接一個變量和一個字符串文本|_仲傅账号注册,使用 +:
prefix + 'thon'
'Python'
這個功能在你想切分很長的字符串的時候特別有用:
text = ('Put several strings within parentheses '
'to have them joined together.')
text
'Put several strings within parentheses to have them joined together.'
字符串也可以被截取(檢索)|||187是什么号段。類似於 C -_|易彩网彩票软件,字符串的第一個字符索引為 0 --_大连好旺角租房。Python沒有單獨的字符類型||陈丹丹淘宝店;一個字符就是一個簡單的長度為1的字符串-|_038彩票是真的假的。:
word = 'Python'
word[0] # character in position 0
'P'
word[5] # character in position 5
'n'
索引也可以是負數___邯郸晚报电子版,這將導致從右邊開始計算|-卡通战争剑灵中文版。例如:
word[-1] # last character
'n'
word[-2] # second-last character
'o'
word[-6]
'P'
請注意 -0 實際上就是 0_-_注册网络棋牌公司,所以它不會導致從右邊開始計算___九年级数学教学工作总结。
除了索引||云南曲靖6户被杀,還支持 切片__goxiazai cc。索引用於獲得單個字符-||2019新版跑狗图087期,切片 讓你獲得一個子字符串:
word[0:2] # characters from position 0 (included) to 2 (excluded)
'Py'
word[2:5] # characters from position 2 (included) to 5 (excluded)
'tho'
注意|-248彩票平台安全吗,包含起始的字符|长城h8事件,不包含末尾的字符|上海哪里可以蹦极。這使得 s[:i] + s[i:] 永遠等於 s:
word[:2] + word[2:]
'Python'
word[:4] + word[4:]
'Python'
切片的索引有非常有用的默認值__-刘玉浦简历;省略的第一個索引默認為零|-|盈盈彩靠谱么,省略的第二個索引默認為切片的字符串的大小|-|掌上彩票超级赛车。:
word[:2] # character from the beginning to position 2 (excluded)

3 times 'un', followed by 'ium'
>>> 3 * 'un' + 'ium'
'unununium'
相鄰的兩個字符串文本自動連接在一起-||360购彩大厅彩票官网。:
>>> 'Py' 'thon'
'Python'
它隻用於兩個字符串文本易彩网多少钱可以提现,不能用於字符串表達式:
>>> prefix = 'Py'
>>> prefix 'thon' # can't concatenate a variable and a string literal
...
SyntaxError: invalid syntax
>>> ('un' * 3) 'ium'
...
SyntaxError: invalid syntax
如果你想連接多個變量或者連接一個變量和一個字符串文本--|优彩彩票平台,使用 +:
>>> prefix + 'thon'
'Python'
這個功能在你想切分很長的字符串的時候特別有用:
>>> text = ('Put several strings within parentheses '
'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
字符串也可以被截取(檢索)|-中国连锁销售官方网。類似於 C __安哒塔图,字符串的第一個字符索引為 0 __盈彩国际可靠吗。Python沒有單獨的字符類型--|11086移动彩票下载;一個字符就是一個簡單的長度為1的字符串_||妇女的定义。:
>>> word = 'Python'
>>> word[0] # character in position 0
'P'
>>> word[5] # character in position 5
'n'
索引也可以是負數|_artcase,這將導致從右邊開始計算|_|35彩票官网。例如:
>>> word[-1] # last character
'n'
>>> word[-2] # second-last character
'o'
>>> word[-6]
'P'
請注意 -0 實際上就是 0---易网彩票安装,所以它不會導致從右邊開始計算-_欣荣图片。
除了索引-|142857真的能预测彩票,還支持 切片_|-优优娱乐11选5好不好。索引用於獲得單個字符_-艾儿兰德 鲍德温,切片 讓你獲得一個子字符串:
>>> word[0:2] # characters from position 0 (included) to 2 (excluded)
'Py'
>>> word[2:5] # characters from position 2 (included) to 5 (excluded)
'tho'
注意|金大班大结局,包含起始的字符|_经典色文,不包含末尾的字符--_usb gps模块。這使得 s[:i] + s[i:] 永遠等於 s:
>>> word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
切片的索引有非常有用的默認值-_|108娱乐是怎么盈利;省略的第一個索引默認為零_|_fifaol4,省略的第二個索引默認為切片的字符串的大小-|_永盛国际不让提款。:
>>> word[:2] # character from the beginning to position 2 (excluded)
'Py'

word[4:] # characters from position 4 (included) to the end
'on'
word[-2:] # characters from the second-last (included) to the end
'on'
有個辦法可以很容易地記住切片的工作方式_106在线彩票平台108:切片時的索引是在兩個字符 之間 |重庆烟。左邊第一個字符的索引為 0_||尊彩彩票,而長度為 n 的字符串其最後一個字符的右界索引為 n-北京466耳鼻喉专家。例如:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
文本中的第一行數字給出字符串中的索引點 0...6||联想a60手机游戏。第二行給出相應的負索引-|天天快递价格。切片是從 i 到 j 兩個數值標示的邊界之間的所有字符||诏安人才网。
對於非負索引|-国家创新基金网,如果上下都在邊界內_--云顶娱乐真的假的,切片長度就是兩個索引之差_魔龙辅助免费版。例如_-上海静安火灾,word[1:3] 是 2 --亿发彩票坑人不。
試圖使用太大的索引會導致錯誤:
word[42] # the word only has 6 characters
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Python 能夠優雅地處理那些沒有意義的切片索引_|-雅虎台湾:一個過大的索引值(即下標值大於字符串實際長度)將被字符串實際長度所代替|_觅血者斯基尔,當上邊界比下邊界大時(即切片左值大於右值)就返回空字符串:
word[4:42]
'on'
word[42:]
''
Python字符串不可以被更改 — 它們是 不可變的 |_|勇士vs步行者。因此|苏州工业园区三中,賦值給字符串索引的位置會導致錯誤:
word[0] = 'J'
...
TypeError: 'str' object does not support item assignment
word[2:] = 'py'
...
TypeError: 'str' object does not support item assignment
如果你需要一個不同的字符串-众购彩票平台,你應該創建一個新的:
'J' + word[1:]
'Jython'
word[:2] + 'py'
'Pypy'
內置函數 len() 返回字符串長度:
s = 'supercalifragilisticexpialidocious'
len(s)
word[:2] + word[2:]
'Python'
>>> word[:4] + word[4:]
'Python'
切片的索引有非常有用的默認值--_百里挑一王可达;省略的第一個索引默認為零-_|移动彩票网址,省略的第二個索引默認為切片的字符串的大小-||家门的荣光百度影音。:
>>> word[:2] # character from the beginning to position 2 (excluded)
'Py'
>>> word[4:] # characters from position 4 (included) to the end
'on'
>>> word[-2:] # characters from the second-last (included) to the end
'on'
有個辦法可以很容易地記住切片的工作方式||-好研网:切片時的索引是在兩個字符 之間 |闪卡识字。左邊第一個字符的索引為 0__解放金铃,而長度為 n 的字符串其最後一個字符的右界索引為 n||温州新城站订票电话。例如:
+---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
文本中的第一行數字給出字符串中的索引點 0...6|__zooskooistay人与驴。第二行給出相應的負索引_-188彩票网官网。切片是從 i 到 j 兩個數值標示的邊界之間的所有字符|_掌上足球彩票。
對於非負索引__何瑶照片,如果上下都在邊界內-_qq2009手机版,切片長度就是兩個索引之差|_众彩国际送彩金。例如||中日副外长级磋商,word[1:3] 是 2 |038彩票安全吗。
試圖使用太大的索引會導致錯誤:
>>> word[42] # the word only has 6 characters
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
Python 能夠優雅地處理那些沒有意義的切片索引_|中兴彩票网站:一個過大的索引值(即下標值大於字符串實際長度)將被字符串實際長度所代替_|赢咖娱乐登录,當上邊界比下邊界大時(即切片左值大於右值)就返回空字符串:
>>> word[4:42]
'on'
>>> word[42:]
''
Python字符串不可以被更改 — 它們是 不可變的 -__杜兰特3代战靴。因此|-御龙在天野蘑菇,賦值給字符串索引的位置會導致錯誤:
>>> word[0] = 'J'
...
TypeError: 'str' object does not support item assignment
>>> word[2:] = 'py'
...
TypeError: 'str' object does not support item assignment
如果你需要一個不同的字符串_-红罂粟 剧情,你應該創建一個新的:
>>> 'J' + word[1:]
'Jython'
>>> word[:2] + 'py'
'Pypy'
內置函數 len() 返回字符串長度:
>>> s = 'supercalifragilisticexpialidocious'
>>> len(s)
34
3.1.3. 列表
Python 有幾個 複合 數據類型|_|云顶娱乐平台怎么样,用於表示其它的值-易盈彩票安全吗?。最通用的是 list (列表) |重庆历任公安局长,它可以寫作中括號之間的一列逗號分隔的值__安利净水器价格。列表的元素不必是同一類型:
squares = [1, 4, 9, 16, 25]
squares
[1, 4, 9, 16, 25]
就像字符串(以及其它所有內建的 序列 類型)一樣_-_1213金鼎怎么注册,列表可以被索引和切片:
squares[0] # indexing returns the item
1
squares[-1]
25
squares[-3:] # slicing returns a new list
[9, 16, 25]
所有的切片操作都會返回一個包含請求的元素的新列表|-2628彩票登录网站。這意味著下麵的切片操作返回列表一個新的(淺)拷貝副本:
squares[:]
[1, 4, 9, 16, 25]
列表也支持連接這樣的操作:
squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
不像 不可變的 字符串-|众乐彩票网站,列表是 可變的_阴魂镇,它允許修改元素:
cubes = [1, 8, 27, 65, 125] # something's wrong here
4 ** 3 # the cube of 4 is 64, not 65!
64
cubes[3] = 64 # replace the wrong value
cubes
[1, 8, 27, 64, 125]
你還可以使用 append() 方法 (後麵我們會看到更多關於列表的方法的內容)在列表的末尾添加新的元素:
cubes.append(216) # add the cube of 6
cubes.append(7 ** 3) # and the cube of 7
cubes
[1, 8, 27, 64, 125, 216, 343]
也可以對切片賦值_-_邪恶少年eb的小站,此操作可以改變列表的尺寸|_阿诗曼,或清空它:
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']

replace some values

letters[2:5] = ['C', 'D', 'E']
letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']

now remove them

letters[2:5] = []
letters
['a', 'b', 'f', 'g']

clear the list by replacing all the elements with an empty list

letters[:] = []
letters
[]
內置函數 len() 同樣適用於列表:
letters = ['a', 'b', 'c', 'd']
len(letters)
4
允許嵌套列表(創建一個包含其它列表的列表)-gts3370,例如:
a = ['a', 'b', 'c']
n = [1, 2, 3]
x = [a, n]
x

squares
[1, 4, 9, 16, 25]
就像字符串(以及其它所有內建的 序列 類型)一樣|_藏秘虫草双参,列表可以被索引和切片:
>>> squares[0] # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:] # slicing returns a new list
[9, 16, 25]
所有的切片操作都會返回一個包含請求的元素的新列表-仪华特卖。這意味著下麵的切片操作返回列表一個新的(淺)拷貝副本:
>>> squares[:]
[1, 4, 9, 16, 25]
列表也支持連接這樣的操作:
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
不像 不可變的 字符串_||球衫堂,列表是 可變的|银魂春祭,它允許修改元素:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here
>>> 4 ** 3 # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64 # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
你還可以使用 append() 方法 (後麵我們會看到更多關於列表的方法的內容)在列表的末尾添加新的元素:
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
也可以對切片賦值|__变态天龙,此操作可以改變列表的尺寸||_盈彩在线app是不是真的,或清空它:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
內置函數 len() 同樣適用於列表:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
允許嵌套列表(創建一個包含其它列表的列表)|-奶油话梅糖,例如:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
x[0]
['a', 'b', 'c']
x[0][1]
'b'
3.2. 編程的第一步
當然-|相信未来 朗诵,我們可以使用 Python 完成比二加二更複雜的任務||-长安街英菲尼迪。例如_-|22彩票官方版,我們可以寫一個生成 菲波那契 子序列的程序-_-广州铁通无线固话,如下所示:

Fibonacci series:

... # the sum of two elements defines the next
... a, b = 0, 1

while b < 10:
... print(b)
... a, b = b, a+b
...

squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
不像 不可變的 字符串--霍去病的小软糖,列表是 可變的--致命弯道5 豆瓣,它允許修改元素:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here
>>> 4 ** 3 # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64 # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
你還可以使用 append() 方法 (後麵我們會看到更多關於列表的方法的內容)在列表的末尾添加新的元素:
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
也可以對切片賦值_-|拥抱江美琪,此操作可以改變列表的尺寸||_抖音949415093,或清空它:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
內置函數 len() 同樣適用於列表:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
允許嵌套列表(創建一個包含其它列表的列表)__-国家领导人名单,例如:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
3.2. 編程的第一步
當然--28彩票是正规的吗,我們可以使用 Python 完成比二加二更複雜的任務-_众乐彩官网下载。例如__外地二手车过户北京,我們可以寫一個生成 菲波那契 子序列的程序-浠水姜林,如下所示:
>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while b < 10:
... print(b)
... a, b = b, a+b
...
1
squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
不像 不可變的 字符串-|11选五复式价格,列表是 可變的_--诺基亚e66软件下载,它允許修改元素:
>>> cubes = [1, 8, 27, 65, 125] # something's wrong here
>>> 4 ** 3 # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64 # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
你還可以使用 append() 方法 (後麵我們會看到更多關於列表的方法的內容)在列表的末尾添加新的元素:
>>> cubes.append(216) # add the cube of 6
>>> cubes.append(7 ** 3) # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
也可以對切片賦值_|_106苹果下载,此操作可以改變列表的尺寸|-玉子金童,或清空它:
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
>>> letters[:] = []
>>> letters
[]
內置函數 len() 同樣適用於列表:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
允許嵌套列表(創建一個包含其它列表的列表)||-长春新东方官网,例如:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
3.2. 編程的第一步
當然||店招图片,我們可以使用 Python 完成比二加二更複雜的任務-|_中博彩票投诉。例如|_-360彩票大厅杀号定胆,我們可以寫一個生成 菲波那契 子序列的程序|-天津股侠,如下所示:
>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while b < 10:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8

這個例子介紹了幾個新功能--漫游ol。
第一行包括了一個 多重賦值-冰城宝宝论坛团购区:變量 a 和 b 同時獲得了新的值 0 和 1 最後一行又使用了一次--_01彩票APp是不是正规的。
在這個演示中--_李公堤水霸王,變量賦值前-|01彩票597849com,右邊首先完成計算__-注册送彩金38不限id。右邊的表達式從左到右計算中央4台。
條件(這裏是 b < 10 )為 true 時_|-娱乐天地苹果, while 循環執行_--邮政上班时间。在 Python 中|-2019世界杯猜球彩票,類似於 C-|hp5200打印机驱动下载,任何非零整數都是 true|夫妻轩;0 是 false 條件也可以是字符串或列表-_帕米尔高原在哪里,實際上可以是任何序列|钢结构楼梯图集;
所有長度不為零的是 true__1980稳台子,空序列是 false|_京东电器网上商城店。示例中的測試是一個簡單的比較|-_幼儿园优秀教师事迹。標準比較操作符與 C 相同---纳粹大战僵尸: < _-丁丁和杨坤后场接吻, > |_|沣渭新区规划图, == _|双世宠妃全集免费观看, <=_-|亲戚关系图, >= 和 !=-_-优点彩票北京PK10。
循環 體 是 縮進 的_|_环球tv 3d精灵版:縮進是 Python 是 Python 組織語句的方法||31选7开奖号码走势图。Python (還)不提供集成的行編輯功能__药酒是哪个朝代之后出现的,所以你要為每一個縮進行輸入 TAB 或空格-|优酷付费电影。
實踐中建議你找個文本編輯來錄入複雜的 Python 程序__心跳宝贝之青涩回忆,大多數文本編輯器提供自動縮進__洗浴服务。交互式錄入複合語句時-喷立婷,必須在最後輸入一個空行來標識結束(因為解釋器沒辦法猜測你輸入的哪一行是最後一行)_-_红罂粟之生死之间,需要 注意的是同一個語句塊中的語句塊必須縮進同樣數量的空白_-青岛大哥骂雅阁女。
關鍵字 print() 語句輸出給定表達式的值-__赢彩网是不是真的假的。它控製多個表達式和字符串輸出為你想要字符串(就像我們在前麵計算器的例子中那樣)注册趣推安全吗。
字符串打印時不用引號包圍---青岛开发区十中,每兩個子項之間插入空間|-|盈彩网app,所以你可以把格式弄得很漂亮_|本溪张雷,像這樣:

i = 256256
print('The value of i is', i)
The value of i is 65536
用一個逗號結尾就可以禁止輸出換行:
a, b = 0, 1
while b < 1000:
... print(b, end=',')
... a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
letters[:] = []
>>> letters
[]
內置函數 len() 同樣適用於列表:
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
允許嵌套列表(創建一個包含其它列表的列表)__|众发彩票是人工干预开,例如:
>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
3.2. 編程的第一步
當然|-_涡阳高公,我們可以使用 Python 完成比二加二更複雜的任務|_cf迷茫。例如_-fps什么意思,我們可以寫一個生成 菲波那契 子序列的程序-_-惠蒙网,如下所示:
>>> # Fibonacci series:
... # the sum of two elements defines the next
... a, b = 0, 1
>>> while b < 10:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8
這個例子介紹了幾個新功能||_鹰彩写真机。
第一行包括了一個 多重賦值-_lame exe下载:變量 a 和 b 同時獲得了新的值 0 和 1 最後一行又使用了一次-||广州圣亚男性科。
在這個演示中||江苏省盐城中学,變量賦值前|_365彩票登录网址是多少,右邊首先完成計算_-注册送彩金彩票网址。右邊的表達式從左到右計算2000彩平台。
條件(這裏是 b < 10 )為 true 時-_-银盘服务, while 循環執行_-北京耳鼻喉科解放军466医院。在 Python 中--众赢彩票的骗局,類似於 C-肉图,任何非零整數都是 true--魏征进谏图;0 是 false 條件也可以是字符串或列表-_|160彩票软件是真的吗,實際上可以是任何序列|聂小倩的梦岛;
所有長度不為零的是 true_|258彩票注册,空序列是 false_众盈娱乐投注怎么样删。示例中的測試是一個簡單的比較|_正三棱锥的性质。標準比較操作符與 C 相同|陈奕迅老婆照片: < |-|我是歌手第10期排名, > _|1号站彩票娱乐平台登录, == ||-刘久龙, <=|_爱慕卡盟, >= 和 !=_-云顶在线娱乐。
循環 體 是 縮進 的__-塔罗牌大师tlp6868668:縮進是 Python 是 Python 組織語句的方法-|-许氏大酱。Python (還)不提供集成的行編輯功能__内地主持人排行榜,所以你要為每一個縮進行輸入 TAB 或空格||英皇国际棋牌官方下载。
實踐中建議你找個文本編輯來錄入複雜的 Python 程序|_众创联盟app,大多數文本編輯器提供自動縮進_-|隋唐大运河开凿顺序。交互式錄入複合語句時___306官方彩票靠谱吗?,必須在最後輸入一個空行來標識結束(因為解釋器沒辦法猜測你輸入的哪一行是最後一行)||_7k双人小游戏,需要 注意的是同一個語句塊中的語句塊必須縮進同樣數量的空白--银监局待遇。
關鍵字 print() 語句輸出給定表達式的值|_-糗友窝。它控製多個表達式和字符串輸出為你想要字符串(就像我們在前麵計算器的例子中那樣)_-盈彩娱乐是正规的吗。
字符串打印時不用引號包圍|_西本钢铁每日报价,每兩個子項之間插入空間-_国产车哪个牌子好,所以你可以把格式弄得很漂亮|__衣优库视频,像這樣:
>>> i = 256
256
>>> print('The value of i is', i)
The value of i is 65536
用一個逗號結尾就可以禁止輸出換行:
>>> a, b = 0, 1
>>> while b < 1000:
... print(b, end=',')
... a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
Footnotes
[1] 因為 ** 的優先級高於 -||-038彩票平台合法吗,所以 -32 將解釋為 -(32) 且結果為 -9-_铺铺儿。為了避免這點並得到 9||t8神奇魔轮,你可以使用 (-3)**2__维修电工技师总结。
[2] 與其它語言不同|始兴家园,特殊字符例如 \n 在單引號('...')和雙引號("...")中具有相同的含義_|娱乐天地检点实v力22956。兩者唯一的區別是在單引號中_||惠蒙网qig6,你不需要轉義 " (但你必須轉義 ' )_|永州八记作者,反之亦然_|_369开奖网。

  1. 深入 Python 流程控製
    除了前麵介紹的 while 語句__永盛彩票wwwys36com,Python 還從其它語言借鑒了一些流程控製功能-__智彩平台不锈钢茶,並有所改變_鹿少女。
    4.1. if 語句
    也許最有名的是 if 語句-|_苹果派电影院。例如:

x = int(input("Please enter an integer: "))
Please enter an integer: 42
if x < 0:
... x = 0
... print('Negative changed to zero')

while b < 10:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8
這個例子介紹了幾個新功能_闸北大悦城。
第一行包括了一個 多重賦值-_|实况8妖人:變量 a 和 b 同時獲得了新的值 0 和 1 最後一行又使用了一次__-038彩票可靠吗?。
在這個演示中--金立gn105怎么样,變量賦值前-|掌信彩官网下载,右邊首先完成計算_||和绳媲美。右邊的表達式從左到右計算_|_纤之秀。
條件(這裏是 b < 10 )為 true 時__-钱王美庐, while 循環執行||-亿客隆彩票平台。在 Python 中|nokia6120c软件下载,類似於 C|-jindon京东,任何非零整數都是 true|_|106官网彩票平台ios;0 是 false 條件也可以是字符串或列表-苏州园区博客门,實際上可以是任何序列-_亿融卡盟;
所有長度不為零的是 true__平谷聊天室,空序列是 false|cad2004下载破解版。示例中的測試是一個簡單的比較__芒草扫把。標準比較操作符與 C 相同||月光花图片: < _|51jiemeng, > ___360彩票导航走势图解, == ||_038彩票靠谱不, <=_|火把节是怎么一回事, >= 和 !=--康美药业主题曲。
循環 體 是 縮進 的-校园协奏曲:縮進是 Python 是 Python 組織語句的方法_|jindon京东。Python (還)不提供集成的行編輯功能__wow致命一击,所以你要為每一個縮進行輸入 TAB 或空格-__广珠城轨网上订票。
實踐中建議你找個文本編輯來錄入複雜的 Python 程序_-_2011qq官方下载,大多數文本編輯器提供自動縮進|_公顷换算。交互式錄入複合語句時-||桑叶采摘机,必須在最後輸入一個空行來標識結束(因為解釋器沒辦法猜測你輸入的哪一行是最後一行)|_-中大恒基,需要 注意的是同一個語句塊中的語句塊必須縮進同樣數量的空白|_注册送彩金时时彩。
關鍵字 print() 語句輸出給定表達式的值--白酒包装图片。它控製多個表達式和字符串輸出為你想要字符串(就像我們在前麵計算器的例子中那樣)||_bt核电站。
字符串打印時不用引號包圍||卓易彩票怎么用不了,每兩個子項之間插入空間-|丝图腾,所以你可以把格式弄得很漂亮_-亚当夏娃怡情谷,像這樣:
>>> i = 256256
>>> print('The value of i is', i)
The value of i is 65536
用一個逗號結尾就可以禁止輸出換行:
>>> a, b = 0, 1
>>> while b < 1000:
... print(b, end=',')
... a, b = b, a+b
...
1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,
Footnotes
[1] 因為 ** 的優先級高於 -|南滨是哪个省的,所以 -3
2 將解釋為 -(32) 且結果為 -9_-l龙。為了避免這點並得到 9_|深圳卫视第一现场,你可以使用 (-3)*2|-|铁鹰行动。
[2] 與其它語言不同__注册送28彩金不限ip,特殊字符例如 \n 在單引號('...')和雙引號("...")中具有相同的含義|-云顶国际赛车。兩者唯一的區別是在單引號中|-038彩票是官网平台吗,你不需要轉義 " (但你必須轉義 ' )|--qq炫舞紫钻,反之亦然_like to be alone。


4. 深入 Python 流程控製
除了前麵介紹的 while 語句--爱财部落网,Python 還從其它語言借鑒了一些流程控製功能--铍矿,並有所改變-2018高考最高分是谁。
4.1. if 語句
也許最有名的是 if 語句--虾窝。例如:
>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
... x = 0
... print('Negative changed to zero')
... elif x == 0:
... print('Zero')
... elif x == 1:
... print('Single')
... else:
... print('More')
...
More
可能會有零到多個 elif 部分__葛伦黛娜,else 是可選的-钱货两讫。關鍵字 ‘elif‘ 是 ’else if’ 的縮寫--_优乐彩网站是真的吗,這個可以有效地避免過深的縮進__-黑社会砍人。if ... elif ... elif ... 序列用於替代其它語言中的 switch 或 case 語句_||芙蓉中路二手房。
4.2. for 語句
Python 中的 for 語句和 C 或 Pascal 中的略有不同|-霍经伦。通常的循環可能會依據一個等差數值步進過程(如 Pascal)|-0165彩票iphone版,或由用戶來定義迭代步驟和中止條件(如 C )-_dsound dll病毒,Python 的 for 語句依據任意序列(鏈表或字符串)中的子項|_-3k娱乐负盈利,按它們在序列中的順序來進行迭代|__注册存1元送38的网站。例如(沒有暗指)||诺基亚2700c软件:

Measure some strings:

... words = ['cat', 'window', 'defenestrate']

for w in words:
... print(w, len(w))
...
cat 3
window 6
defenestrate 12
在迭代過程中修改迭代序列不安全(隻有在使用鏈表這樣的可變序列時才會有這樣的情況)_-重庆特产有哪些。如果你想要修改你迭代的序列(例如-|_舒南,複製選擇項)__-不灭之王波罗丁称号怎么做,你可以迭代它的複本-|深圳电视台第一现场。使用切割標識就可以很方便的做到這一點:
for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6:
... words.insert(0, w)
...
words
['defenestrate', 'cat', 'window', 'defenestrate']
4.3. range() 函數
如果你需要一個數值序列-|_htcg55,內置函數 range() 會很方便_-_读书郎f20,它生成一個等差級數鏈表:
for i in range(5):
... print(i)
...
0
1
2
3

4
range(10) 生成了一個包含 10 個值的鏈表|_-诺基亚ovi套件官方下载,它用鏈表的索引值填充了這個長度為 10 的列表--永盛国际安全,所生成的鏈表中不包括範圍中的結束值|中国国家主席是谁。也可以讓 range() 操作從另一個數值開始_|-优衣库bt,或者可以指定一個不同的步進值(甚至是負數|||cctv9女主持人,有時這也被稱為 “步長”):
range(5, 10)
5 through 9

range(0, 10, 3)
0, 3, 6, 9

range(-10, -100, -30)
-10, -40, -70
需要迭代鏈表索引的話_|105彩票返点怎么回事,如下所示結合使 用 range() 和 len()

a = ['Mary', 'had', 'a', 'little', 'lamb']
for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
不過_-红地毯影城,這種場合可以方便的使用 enumerate()-|-亿赢彩票平台,請參見 循環技巧-||澳门科大医院。
如果你隻是打印一個序列的話會發生奇怪的事情:
print(range(10))
range(0, 10)
在不同方麵 range() 函數返回的對象表現為它是一個列表--至尊争霸彩票能赚钱吗,但事實上它並不是-|花开淡墨痕19楼。當你迭代它時-|沈阳市财政局财会之窗,它是一個能夠像期望的序列返回連續項的對象-掌上彩票客户端;但為了節省空間_卓越网客服电话,它並不真正構造列表||28彩票有正规的吗。
我們稱此類對象是 可迭代的--|娱乐天地点检官方下载,即適合作為那些期望從某些東西中獲得連續項直到結束的函數或結構的一個目標(參數)_金地荔湖城业主论坛。我們已經見過的 for 語句就是這樣一個迭代器|||云顶国际娱永久网址。list() 函數是另外一個( 迭代器 )|_武松卡盟,它從可迭代(對象)中創建列表:
list(range(5))
[0, 1, 2, 3, 4]
稍後我們會看到更多返回可迭代(對象)和以可迭代(對象)作為參數的函數-2019网上怎么买彩票。
4.4. break 和 continue 語句, 以及循環中的 else 子句
break 語句和 C 中的類似_长江大桥有多长,用於跳出最近的一級 for 或 while 循環-|和讯基金净值。
循環可以有一個 else 子句_-|湖南移动梦网营业厅;它在循環迭代完整個列表(對於 for )或執行條件為 false (對於 while )時執行|--轰9,但循環被 break 中止的情況下不會執行|-员工行为规范。以下搜索素數的示例程序演示了這個子句:
for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
for i in range(5):
... print(i)
...
0
1
2
3
4
range(10) 生成了一個包含 10 個值的鏈表_|银彩下载,它用鏈表的索引值填充了這個長度為 10 的列表_|1288彩票是谁开,所生成的鏈表中不包括範圍中的結束值--大汉帝国美人心计。也可以讓 range() 操作從另一個數值開始_-|汪清县公众信息网,或者可以指定一個不同的步進值(甚至是負數-打屁沟,有時這也被稱為 “步長”):
range(5, 10)
5 through 9

range(0, 10, 3)
0, 3, 6, 9

range(-10, -100, -30)
-10, -40, -70
需要迭代鏈表索引的話_|-助赢软件,如下所示結合使 用 range() 和 len()
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
不過-qq2009官方下载正式版,這種場合可以方便的使用 enumerate()_2M彩票网,請參見 循環技巧|||11086移动彩票APP。
如果你隻是打印一個序列的話會發生奇怪的事情:
>>> print(range(10))
range(0, 10)
在不同方麵 range() 函數返回的對象表現為它是一個列表||芭蕾舞剧牡丹亭,但事實上它並不是---陈耀兴。當你迭代它時-_金宝街电影院,它是一個能夠像期望的序列返回連續項的對象__|众博彩票网址多少;但為了節省空間|_银装素裹 分外妖娆,它並不真正構造列表||-众盈彩票怎么样。
我們稱此類對象是 可迭代的|_永胜国际APP是干什么的,即適合作為那些期望從某些東西中獲得連續項直到結束的函數或結構的一個目標(參數)|菏泽医专吧。我們已經見過的 for 語句就是這樣一個迭代器-|-聚返吧。list() 函數是另外一個( 迭代器 )_-18彩彩票网站,它從可迭代(對象)中創建列表:
>>> list(range(5))
[0, 1, 2, 3, 4]
稍後我們會看到更多返回可迭代(對象)和以可迭代(對象)作為參數的函數|-_amd425。
4.4. break 和 continue 語句, 以及循環中的 else 子句
break 語句和 C 中的類似_闻一多的故事,用於跳出最近的一級 for 或 while 循環_||落跑甜心陈翔吻戏。
循環可以有一個 else 子句-东北二嫂水仙百度云;它在循環迭代完整個列表(對於 for )或執行條件為 false (對於 while )時執行|锈水财阀战袍在哪买,但循環被 break 中止的情況下不會執行_卓易彩票怎么不能买了。以下搜索素數的示例程序演示了這個子句:
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '
', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
(Yes, 這是正確的代碼--北京中医药大学药厂。看仔細|-|青年宫电影院影讯:else 語句是屬於 for 循環之中_-国世平本人, 不是 if 語句_永城彩票。)
與循環一起使用時--usb gps模块,else 子句與 try 語句的 else 子句比與 if 語句的具有更多的共同點|_-qq游戏商城网址:try 語句的 else 子句在未出現異常時運行--093彩票手机版客服,循環的 else 子句在未出現 break 時運行-|_康恒保险。更多關於 try 語句和異常的內容-|舞空术,請參見 異常處理__木吉他拾音器。
continue 語句是從 C 中借鑒來的|_保定独立团团购,它表示循環繼續執行下一次迭代:
for num in range(2, 10):
... if num % 2 == 0:
... print("Found an even number", num)
... continue
... print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
4.5. pass 語句
pass 語句什麼也不做|||暴走鞋在哪买。它用於那些語法上必須要有什麼語句_超级演说家总决赛,但程序什麼也不做的場合-_15876计划网时时彩,例如:
while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
這通常用於創建最小結構的類:
class MyEmptyClass:
... pass
...
另一方麵||古董估价,pass 可以在創建新代碼時用來做函數或控製體的占位符|_10元可提现的彩票网站。可以讓你在更抽象的級別上思考-租东西。pass 可以默默的被忽視:
def initlog(*args):
... pass # Remember to implement this!
...
4.6. 定義函數
我們可以創建一個用來生成指定邊界的斐波那契數列的函數:
def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...

Now call the function we just defined:

... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
關鍵字 def 引入了一個函數 定義|_央视王梁。在其後必須跟有函數名和包括形式參數的圓括號||kf qq com在线客服。函數體語句從下一行開始_||盈盈彩口碑怎么样,必須是縮進的--自贡富顺二中。
函數體的第一行語句可以是可選的字符串文本_-陈文恩,這個字符串是函數的文檔字符串_-妖精的尾巴421,或者稱為 docstring|_无限挑战120121。(更多關於 docstrings 的信息請參考 文檔字符串) 有些工具通過 docstrings 自動生成在線的或可打印的文檔||-反间谍工作的主管单位是,或者讓用戶通過代碼交互瀏覽_|助赢软件计划;在你的代碼中包含 docstrings 是一個好的實踐||2018明星死亡大全,讓它成為習慣吧___陈奕迅最新电影。
函數 調用 會為函數局部變量生成一個新的符號表|-锦州人流。確切的說_-038彩票平台是官方的吗,所有函數中的變量賦值都是將值存儲在局部符號表_|-邮政上班时间。變量引用首先在局部符號表中查找_-晋城五人,然後是包含函數的局部符號表-白酒包装图片,然後是全局符號表__雷霆咆哮打野出装,最後是內置名字表|_诗词生成器。因此-|宝安体育馆健身房,全局變量不能在函數中直接賦值(除非用 global 語句命名)--被下药后强干漫画全彩,盡管他們可以被引用--_动作猜谜游戏。
函數引用的實際參數在函數調用時引入局部符號表_|11选5黑彩平台,因此--168彩票大小怎么看输赢,實參總是 傳值調用 (這裏的 值 總是一個對象 引用 -_2013年母亲节是几月几号,而不是該對象的值)--_至尊彩是骗局吗?。[1] 一個函數被另一個函數調用時-_维加网,一個新的局部符號表在調用過程中被創建|__亿盈彩票骗局。
一個函數定義會在當前符號表內引入函數名-_雷明老师。函數名指代的值(即函數體)有一個被 Python 解釋器認定為 用戶自定義函數 的類型_|性价比较高的笔记本。 這個值可以賦予其他的名字(即變量名)-|qq炫舞极品宠物名字,然後它也可以被當做函數使用|-新型电子产品。這可以作為通用的重命名機製:

fib
<function fib at 10042ed0>
f = fib
f(100)
0 1 1 2 3 5 8 13 21 34 55 89
如果你使用過其他語言|-松鹤墓园,你可能會反對說|-永利网投平台:fib 不是一個函數-|-心理罪为什么看不了,而是一個方法|-花香满屋,因為它並不返回任何值_-勇士vs步行者。事實上__梁笙和沈言 卫生间,沒有 return 語句的函數確實會返回一個值-_永盛国际网址登录不上,雖然是一個相當令人厭煩的值(指 None )|-众彩国际是否合法。這個值被稱為 None (這是一個內建名稱)__盈彩网属于合法的吗。如果 None 值是唯一被書寫的值---雷神2 百度影音,那麼在寫的時候通常會被解釋器忽略(即不輸出任何內容)__测公司名字好坏。如果你確實想看到這個值的輸出內容|-注册彩票送58彩金,請使用 print() 函數:
fib(0)
print(fib(0))
None
定義一個返回斐波那契數列數字列表的函數_-聚美优品打不开,而不是打印它-|厦门工商红盾网,是很簡單的:
def fib2(n): # return Fibonacci series up to n
... """Return a list containing the Fibonacci series up to n."""
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a) # see below
... a, b = b, a+b
... return result
...
f100 = fib2(100) # call it
f100 # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
和以前一樣__|昨夜裙带解,這個例子演示了一些新的 Python 功能-_|ume 重庆:
return 語句從函數中返回一個值-盈盈彩是哪个公司出的,不帶表達式的 return 返回 None__|优彩网下载。
過程結束後也會返回 None_|至尊彩从哪里下载。
語句 result.append(b) 稱為鏈表對象 result 的一個 方法|||镇江老兵事件最新进展。方法是一個“屬於”某個對象的函數|-|陈浥萍,它被命名為 obj.methodename|0707彩票怎么样,這裏的 obj 是某個對象(可能是一個表達式)__现任国家领导人名单, methodename 是某個在該對象類型定義中的方法的命名_-7788电视剧百度影音。
不同的類型定義不同的方法_苏岑博客。不同類型可能有同樣名字的方法-|宏泰电影,但不會混淆-_|永城彩票网平台。(當你定義自己的對象類型和方法時||金陀,可能會出現這種情況-|王明勇博客,class 的定義方法詳見 類 )|_认命歌词。示例中演示的 append() 方法由鏈表對象定義-|_番禺桑拿论坛,它向鏈表中加入一個新元素|-女王厕奴。在示例中它等同於 result = result + [a]__-至尊1元彩票,不過效率更高-|外地车牌在北京。
4.7. 深入 Python 函數定義
在 Python 中||虞城县教育网,你也可以定義包含若幹參數的函數|-垃圾短信轰炸机。這裏有三種可用的形式|_新型电子产品,也可以混合使用--|政府最新打击云联惠。
4.7.1. 默認參數值
最常用的一種形式是為一個或多個參數指定默認值|-索爱w610。這會創建一個可以使用比定義時允許的參數更少的參數調用的函數|360彩票全国开奖公告,例如:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise OSError('uncooperative user')
print(complaint)

print(fib(0))
None
定義一個返回斐波那契數列數字列表的函數---十年寒窗苦读下一句,而不是打印它18146大乐透开奖结果,是很簡單的:
>>> def fib2(n): # return Fibonacci series up to n
... """Return a list containing the Fibonacci series up to n."""
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a) # see below
... a, b = b, a+b
... return result
...
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
和以前一樣_|-陈元安,這個例子演示了一些新的 Python 功能__仙剑五破解补丁:
return 語句從函數中返回一個值|认命歌词,不帶表達式的 return 返回 None|诺基亚6120ci软件下载。
過程結束後也會返回 None-|至尊快三APP。
語句 result.append(b) 稱為鏈表對象 result 的一個 方法-|淘宝开店认证。方法是一個“屬於”某個對象的函數-_-亿博彩观音图,它被命名為 obj.methodename-宋祖德近况,這裏的 obj 是某個對象(可能是一個表達式)_泉城海洋极地世界门票, methodename 是某個在該對象類型定義中的方法的命名-_月光花图片。
不同的類型定義不同的方法__|诗歌生成器。不同類型可能有同樣名字的方法_|王华买爹全集,但不會混淆_||西宁特产。(當你定義自己的對象類型和方法時||-小榄金逸,可能會出現這種情況-__2018公安部对云联惠,class 的定義方法詳見 類 )|_|钢贸商城网站。示例中演示的 append() 方法由鏈表對象定義_当当网尾品汇,它向鏈表中加入一個新元素___256买彩票安卓版2016。在示例中它等同於 result = result + [a]_|星空卫视直播,不過效率更高_106官网彩票高频版。
4.7. 深入 Python 函數定義
在 Python 中|-中兴彩票网是真的假的,你也可以定義包含若幹參數的函數_|珠海电大成绩查询。這裏有三種可用的形式_|_青岛友信机场宾馆,也可以混合使用_|诗月千年。
4.7.1. 默認參數值
最常用的一種形式是為一個或多個參數指定默認值|涨潮时间。這會創建一個可以使用比定義時允許的參數更少的參數調用的函數--travalue,例如:
def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise OSError('uncooperative user')
print(complaint)
這個函數可以通過幾種不同的方式調用:
隻給出必要的參數:
ask_ok('Do you really want to quit?')
給出一個可選的參數:
ask_ok('OK to overwrite the file?', 2)
或者給出所有的參數:
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
這個例子還介紹了 in 關鍵字_-解方程器。它測定序列中是否包含某個確定的值||_帅猴手机维修论坛。
默認值在函數 定義 作用域被解析_|-2018大乐透开奖号全部,如下所示:
i = 5

def f(arg=i):
print(arg)

i = 6
f()
將會輸出 5_-车商汇登陆。
重要警告: 默認值隻被賦值一次||优乐彩彩票官网。這使得當默認值是可變對象時會有所不同|_078彩票合法吗,比如列表-|_女相 陆贞传奇txt、字典或者大多數類的實例|_-2014新股发行一览表。例如__|众益彩苹果版如何下载,下麵的函數在後續調用過程中會累積(前麵)傳給它的參數:
def f(a, L=[]):
L.append(a)
return L

print(f(1))
print(f(2))
print(f(3))
這將輸出:
[1]
[1, 2]
[1, 2, 3]
如果你不想讓默認值在後續調用中累積|--劳动最光荣是谁说的,你可以像下麵一樣定義函數:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
4.7.2. 關鍵字參數
函數可以通過 關鍵字參數 的形式來調用_|51促销网,形如 keyword = value||_四家中乙队欠薪。例如|_幼儿教师格言,以下的函數:
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
接受一個必選參數 (voltage) 以及三個可選參數 (state, action, 和 type)_-邯郸晚报电子版。可以用以下的任一方法調用:
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword
不過以下幾種調用是無效的:
parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument after a keyword argument
parrot(110, voltage=220) # duplicate value for the same argument
parrot(actor='John Cleese') # unknown keyword argument
在函數調用中|-206 217 214 175,關鍵字的參數必須跟隨在位置參數的後麵__-白袍之恋主题曲。傳遞的所有關鍵字參數必須與函數接受的某個參數相匹配 (例如 actor 不是 parrot 函數的有效參數)_|-健贝,它們的順序並不重要-||怎么用手机开通黄钻。這也包括非可選參數(例如 parrot(voltage=1000) 也是有效的)__-娱乐天地是不是合法。任何參數都不可以多次賦值-英伦学院风男装。下麵的示例由於這種限製將失敗:

def function(a):
... pass
...
function(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument 'a'
引入一個形如 **name 的參數時-_仙剑5前传破解版,它接收一個字典(參見 Mapping Types — dict )-_广场娱乐项目,該字典包含了所有未出現在形式參數列表中的關鍵字參數-众赢彩票娱乐平台注册。這裏可能還會組合使用一個形如 *name (下一小節詳細介紹) 的形式參數|_抽大嘴巴,它接收一個元組(下一節中會詳細介紹)_|金丝蓉,包含了所有沒有出現在形式參數列表中的參數值( *name 必須在 **name 之前出現)_李家沱租房。 例如|长沙车展2013,我們這樣定義一個函數:
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
keys = sorted(keywords.keys())
for kw in keys:
print(kw, ":", keywords[kw])
它可以像這樣調用:
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
當然它會按如下內容打印:
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.


client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
注意在打印關鍵字參數之前-||雪菲官网,通過對關鍵字字典 keys() 方法的結果進行排序-_-本亮大叔简介,生成了關鍵字參數名的列表-白酒包装图片;如果不這樣做_-|亿发国际竞彩app安全吗,打印出來的參數的順序是未定義的_-_联众好友在线下载。
4.7.3. 可變參數列表
最後_|芝兰粉,一個最不常用的選擇是可以讓函數調用可變個數的參數||_金香蜜瓜。這些參數被包裝進一個元組(參見 元組和序列 )-_哈尔滨断桥。在這些可變個數的參數之前_-淘宝返利网哪个最好,可以有零到多個普通的參數:
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
通常||_新股上市公告,這些 可變 參數是參數列表中的最後一個||金清中学贴吧,因為它們將把所有的剩餘輸入參數傳遞給函數中央电视台张羽。任何出現在 *args 後的參數是關鍵字參數-_|祥康王晗,這意味著__222彩票网,他們隻能被用作關鍵字__英伦学院风男装,而不是位置參數:

def concat(args, sep="/"):
... return sep.join(args)
...
concat("earth", "mars", "venus")
'earth/mars/venus'
concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
4.7.4. 參數列表的分拆
另有一種相反的情況: 當你要傳遞的參數已經是一個列表-__168彩票手机app苹果,但要調用的函數卻接受分開一個個的參數值-|众彩彩票注册。這時候你要把已有的列表拆開來_-1号平台下载。例如內建函數 range() 需要要獨立的 start||语智通,stop 參數|_俗人岛 华人论坛。你可以在調用函數時加一個 * 操作符來自動把參數列表拆開:
list(range(3, 6)) # normal call with separate arguments
[3, 4, 5]
args = [3, 6]
list(range(
args)) # call with arguments unpacked from a list
[3, 4, 5]
以同樣的方式-_|众盈彩票新三d是骗局吗,可以使用 ** 操作符分拆關鍵字參數為字典:
def parrot(voltage, state='a stiff', action='voom'):
... print("-- This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!")
...
d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.7.5. Lambda 形式
出於實際需要|_-朱云来的妻子,有幾種通常在函數式編程語言例如 Lisp 中出現的功能加入到了 Python-|_食物养生馆。通過 lambda 關鍵字_|-河南省2017年度学生参加校外培训,可以創建短小的匿名函數_-2118彩票安卓官方版。這裏有一個函數返回它的兩個參數的和||永胜讨债2000会上门吗: lambda a, b: a+b||花样少女是多大。 Lambda 形式可以用於任何需要的函數對象-|雪弗莱乐风。出於語法限製|_我要看一级片,它們隻能有一個單獨的表達式---易点彩票网双色球专栏。語義上講|_-聚美优品河马家,它們隻是普通函數定義中的一個語法技巧--冬不拉的故事。類似於嵌套函數定義__-爱家乡的诗歌,lambda 形式可以從外部作用域引用變量:
def make_incrementor(n):
... return lambda x: x + n
...
f = make_incrementor(42)
f(0)
42
f(1)
43
上麵的示例使用 lambda 表達式返回一個函數--_英特杰。另一個用途是將一個小函數作為參數傳遞:
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.6. 文檔字符串
這裏介紹的文檔字符串的概念和格式|-易点彩票网开机号。
第一行應該是關於對象用途的簡介--亿人彩票娱乐。簡短起見_-|云端彩票,不用明確的陳述對象名或類型_-_沈阳男性病建国医院,因為它們可以從別的途徑了解到(除非這個名字碰巧就是描述這個函數操作的動詞)-_-德甲球队队徽。這一行應該以大寫字母開頭|02679时时彩万能用,以句號結尾--|12306晚点信息。
如果文檔字符串有多行|-旋转罗盘,第二行應該空出來_|长红娱乐官网,與接下來的詳細描述明確分隔众彩彩票平台。接下來的文檔應該有一或多段描述對象的調用約定_-诺曼琦官方网站专卖店、邊界效應等-|诚联网。
Python 的解釋器不會從多行的文檔字符串中去除縮進-||掌上彩票官方版下载,所以必要的時候應當自己清除縮進_云顶娱乐靠谱吗。這符合通常的習慣|_欧洲古典四大名著。第一行之後的第一個非空行決定了整個文檔的縮進格式_--苏州园区博客门。 (我們不用第一行是因為它通常緊靠著起始的引號||乐乐滋,縮進格式顯示的不清楚-|_韩国综艺节目runningman。)留白“相當於”是字符串的起始縮進--hp5100驱动。每一行都不應該有縮進__128彩票,如果有縮進的話_26岁毒贩获死刑,所 有的留白都應該清除掉-|香港大学集体欺凌。留白的長度應當等於擴展製表符的寬度(通常是8個空格)|亿博彩票平台可靠吗。
以下是一個多行文檔字符串的示例:
def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything.
... """
... pass
...
print(my_function.doc)
Do nothing, but document it.

No, really, it doesn't do anything.

4.7.7. 函數注解
函數注解 是關於用戶自定義的函數的完全可選的-_|305彩票、隨意的元數據信息_|_亿彩彩票钱能提现吗。無論 Python 本身或者標準庫中都沒有使用函數注解--热火吧;本節隻是描述了語法|_|360彩票安全购彩大厅。第三方的項目是自由地為文檔|_鬼域国语,類型檢查||爱死美女网,以及其它用途選擇函數注解||-逛网地图。
注解是以字典形式存儲在函數的 annotations 屬性中|--潍坊市教育信息港,對函數的其它部分沒有任何影響|_-碧月帆雪。參數注解(Parameter annotations)是定義在參數名稱的冒號後麵|-008彩票正规吗,緊隨著一個用來表示注解的值得表達式|苦中作乐的诗句。返回注釋(Return annotations)是定義在一個 -> 後麵-_-李贤威博客,緊隨著一個表達式_-|北京某高官儿子车祸,在冒號與 -> 之間|-_安泽征婚。下麵的示例包含一個位置參數_|-金螳螂 朱兴良,一個關鍵字參數男士眼霜,和沒有意義的返回值注釋:

def f(ham: 42, eggs: int = 'spam') -> "Nothing to see here":
... print("Annotations:", f.annotations)
... print("Arguments:", ham, eggs)
...
f('wonderful')
Annotations: {'eggs': <class 'int'>, 'return': 'Nothing to see here', 'ham': 42}
Arguments: wonderful spam
pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.6. 文檔字符串
這裏介紹的文檔字符串的概念和格式||-广安严春风的妻子。
第一行應該是關於對象用途的簡介_|_倚天2龙驹。簡短起見|-369彩票,不用明確的陳述對象名或類型|15选5缩水软件,因為它們可以從別的途徑了解到(除非這個名字碰巧就是描述這個函數操作的動詞)|||x女特工结局。這一行應該以大寫字母開頭|_|132彩票苹果版,以句號結尾-|北京市委书记。
如果文檔字符串有多行-_-芯睿单片机,第二行應該空出來|盈利国际娱乐,與接下來的詳細描述明確分隔||阜阳市卫生局。接下來的文檔應該有一或多段描述對象的調用約定__|missripley结局、邊界效應等|_2018大乐透走势图。
Python 的解釋器不會從多行的文檔字符串中去除縮進|京东商城手机充值,所以必要的時候應當自己清除縮進--|云顶至尊如何。這符合通常的習慣|_234彩票登录。第一行之後的第一個非空行決定了整個文檔的縮進格式-138影视。 (我們不用第一行是因為它通常緊靠著起始的引號|-娱乐彩票平台赚签到,縮進格式顯示的不清楚|-|锅盔牙子。)留白“相當於”是字符串的起始縮進-|_广州市花都区教育局。每一行都不應該有縮進_易旺彩票网下载,如果有縮進的話-_|农业银行黄金价格,所 有的留白都應該清除掉-__阳城县人力资源和社会保障局。留白的長度應當等於擴展製表符的寬度(通常是8個空格)|_36选7中奖规则及奖金。
以下是一個多行文檔字符串的示例:
>>> def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything.
... """
... pass
...
>>> print(my_function.doc)
Do nothing, but document it.

No, really, it doesn't do anything.
4.7.7. 函數注解
函數注解 是關於用戶自定義的函數的完全可選的__老歌听不完、隨意的元數據信息|-|诛仙入魔任务流程。無論 Python 本身或者標準庫中都沒有使用函數注解---静水天平;本節隻是描述了語法_-|宋慧乔谈结婚。第三方的項目是自由地為文檔--2m彩票永久免费资料,類型檢查_-|苘山租房,以及其它用途選擇函數注解--长虹i30。
注解是以字典形式存儲在函數的 annotations 屬性中-|-青海玉树地震时间,對函數的其它部分沒有任何影響_掌上永辉职工App下载。參數注解(Parameter annotations)是定義在參數名稱的冒號後麵|_珠海电大成绩查询,緊隨著一個用來表示注解的值得表達式-_基督教歌曲大全1218首。返回注釋(Return annotations)是定義在一個 -> 後麵|||苏铁惜,緊隨著一個表達式_-石家庄口碑网,在冒號與 -> 之間|_张玉其。下麵的示例包含一個位置參數||_男儿当入樽粤语版,一個關鍵字參數|_众发彩票计划群,和沒有意義的返回值注釋:
>>> def f(ham: 42, eggs: int = 'spam') -> "Nothing to see here":
... print("Annotations:", f.annotations)
... print("Arguments:", ham, eggs)
...
>>> f('wonderful')
Annotations: {'eggs': <class 'int'>, 'return': 'Nothing to see here', 'ham': 42}
Arguments: wonderful spam
4.8. 插曲-_阿玛拉王国锻造材料:編碼風格
此時你已經可以寫一些更長更複雜的 Python 程序||111cc彩票,是時候討論一下 編碼風格 了-_|5iwwe。大多數語言可以寫(或者更明白的說|||湖北恩施特产, 格式化 )作幾種不同的風格__雷神2 百度影音。有些比其它的更好讀_|美国vivid。讓你的代碼對別人更易讀是個好想法|_123手机开奖软件,養成良好的編碼風格對此很有幫助|_-帅同论坛。
對於 Pythonmc擦皮鞋歌词,PEP 8 引入了大多數項目遵循的風格指導-|360全国彩票开奖公告查询。它給出了一個高度可讀_-1号平台下载安装,視覺友好的編碼風格--钟舒曼。每個 Python 開發者都應該讀一下-|2018政府打击云联惠,大多數要點都會對你有幫助_||雅安江神医:
使用 4 空格縮進南汇酒吧斗殴视频,而非 TAB
在小縮進(可以嵌套更深)和大縮進(更易讀)之間||11086时时彩官网ip禁止,4空格是一個很好的折中_-_意彩官网注册。TAB 引發了一些混亂_-北京市市委书记是谁,最好棄用
折行以確保其不會超過 79 個字符
這有助於小顯示器用戶閱讀_-qq防沉迷网站,也可以讓大顯示器能並排顯示幾個代碼文件
使用空行分隔函數和類|-|上海情侣网吧门,以及函數中的大塊代碼
可能的話_智胜彩票平台,注釋獨占一行
使用文檔字符串
把空格放到操作符兩邊__重庆ume官网,以及逗號後麵_-注册送300娱乐网址,但是括號裏側不加空格|-芦荟棉是什么面料:a = f(1, 2) + g(3, 4)
統一函數和類命名
推薦類名用 駝峰命名-1960彩票, 函數和方法名用 小寫下劃線__铜管重量计算。總是用 self 作為方法的第一個參數(關於類和方法的知識詳見 初識類 )
不要使用花哨的編碼||恒大队歌,如果你的代碼的目的是要在國際化環境__车模走秀乳罩脱落。Python 的默認情況下-亿彩彩票计划连中号,UTF-8|-|范党育原型,甚至普通的 ASCII 總是工作的最好
同樣-|_长沙居家spa,也不要使用非 ASCII 字符的標識符-_|优彩娱乐平台是真的吗,除非是不同語種的會閱讀或者維護代碼--庆聊。

  1. 數據結構
    本章詳細討論了你已經學過的一些知識-|_试听卡,同樣也添加了一些新內容--苏畅畅加薪奋斗记。
    5.1. 關於列表更多的內容
    Python 的列表數據類型包含更多的方法||_优点彩票能赚钱吗。這裏是所有的列表對象方法-|昆明三夫妇:
    list.append(x)
    把一個元素添加到鏈表的結尾__小轿车图片,相當於 a[len(a):] = [x]_||诺基亚7070拆机视频。
    list.extend(L)
    將一個給定列表中的所有元素都添加到另一個列表中-_注册送300的彩票,相當於 a[len(a):] = L-|至尊时时彩平台。
    list.insert(i, x)
    在指定位置插入一個元素-||1995彩票反水。第一個參數是準備插入到其前麵的那個元素的索引--_fj12530,例如 a.insert(0, x) 會插入到整個鏈表之前-|注册趣步安全吗,而 a.insert(len(a), x) 相當於 a.append(x)-__105彩票提现要多久到账。
    list.remove(x)
    刪除鏈表中值為 x 的第一個元素|-|霍州到太原的火车。如果沒有這樣的元素-_众博棋牌vip,就會返回一個錯誤-|_邪恶少年eb的小站。
    list.pop([i])
    從鏈表的指定位置刪除元素_|_淘宝画报首页,並將其返回||n85软件下载。如果沒有指定索引-_-子宫日记中文版全集,a.pop() 返回最後一個元素__-11086移动彩票co。元素隨即從鏈表中被刪除(方法中 i 兩邊的方括號表示這個參數是可選的-|店招图片,而不是要求你輸入一對方括號-美元升值受益股,你會經常在Python 庫參考手冊中遇到這樣的標記)__我是歌手第十二期排名。
    list.clear()
    從列表中刪除所有元素||_361手机彩票登录入口。相當於 del a[:]|移动彩票平台怎么样。
    list.index(x)
    返回鏈表中第一個值為 x 的元素的索引|-广西财经学院论坛。如果沒有匹配的元素就會返回一個錯誤|__安哒塔图。
    list.count(x)
    返回 x 在鏈表中出現的次數|陈进平。
    list.sort()
    對鏈表中的元素就地進行排序|_长城彩票最重视信誉。
    list.reverse()
    就地倒排鏈表中的元素|_角马网。
    list.copy()
    返回列表的一個淺拷貝|_倩女幽魂伏魔牌。等同於 a[:]-_-中国胎记研究中心。
    下麵這個示例演示了鏈表的大部分方法:

a = [66.25, 333, 333, 1, 1234.5]
print(a.count(333), a.count(66.25), a.count('x'))
2 1 0
a.insert(2, -1)
a.append(333)
a
[66.25, 333, -1, 333, 1, 1234.5, 333]
a.index(333)
1
a.remove(333)
a
[66.25, -1, 333, 1, 1234.5, 333]
a.reverse()
a
[333, 1234.5, 1, 333, -1, 66.25]
a.sort()
a
[-1, 1, 66.25, 333, 333, 1234.5]
a.pop()
1234.5
a
[-1, 1, 66.25, 333, 333]
也許大家會發現像 insert_|义务教育课程标准实验教科书, remove 或者 sort 這些修改列表的方法沒有打印返回值–它們返回 None-__七彩尾房超市。 [1] 在 python 中對所有可變的數據類型這是統一的設計原則-|崆峒二手房网。
5.1.1. 把鏈表當作堆棧使用
鏈表方法使得鏈表可以很方便的做為一個堆棧來使用|黑社会砍人电影,堆棧作為特定的數據結構||联众好友在线下载,最先進入的元素最後一個被釋放(後進先出)_||虞城教育网。用 append() 方法可以把一個元素添加到堆棧頂__监察特使。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來--ro2银线。例如:
stack = [3, 4, 5]
stack.append(6)
stack.append(7)
stack
[3, 4, 5, 6, 7]
stack.pop()
7
stack
[3, 4, 5, 6]
stack.pop()
6
stack.pop()
5
stack
[3, 4]
5.1.2. 把鏈表當作隊列使用
你也可以把鏈表當做隊列使用__|英冠附加赛,隊列作為特定的數據結構|-happy together fx,最先進入的元素最先釋放(先進先出)_--306官方彩票靠谱吗?。不過|-众亿彩票注册,列表這樣用效率不高|__重生洪荒之逍遥至尊。相對來說從列表末尾添加和彈出很快|_苏宁电器五一活动;在頭部插入和彈出很慢(因為__千山暮雪浴缸吻戏,為了一個元素-|-yanhee减肥药的成分,要移動整個列表中的所有元素)-__许雯may。
要實現隊列|-_腾龙山,使用 collections.deque_|_陈公博简介,它為在首尾兩端快速插入和刪除而設計_铜镜反应。例如:
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry") # Terry arrives
queue.append("Graham") # Graham arrives
queue.popleft() # The first to arrive now leaves
'Eric'
queue.popleft() # The second to arrive now leaves
'John'
queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])

a.append(333)
>>> a
[66.25, 333, -1, 333, 1, 1234.5, 333]
>>> a.index(333)
1
>>> a.remove(333)
>>> a
[66.25, -1, 333, 1, 1234.5, 333]
>>> a.reverse()
>>> a
[333, 1234.5, 1, 333, -1, 66.25]
>>> a.sort()
>>> a
[-1, 1, 66.25, 333, 333, 1234.5]
>>> a.pop()
1234.5
>>> a
[-1, 1, 66.25, 333, 333]
也許大家會發現像 insert_-|圣元金币优惠多联盟, remove 或者 sort 這些修改列表的方法沒有打印返回值–它們返回 None__排球场地标准尺寸。 [1] 在 python 中對所有可變的數據類型這是統一的設計原則_-抓住偷水贼。
5.1.1. 把鏈表當作堆棧使用
鏈表方法使得鏈表可以很方便的做為一個堆棧來使用-|乞丐王子主题曲,堆棧作為特定的數據結構-_认识国旗,最先進入的元素最後一個被釋放(後進先出)_--易彩娱乐1957。用 append() 方法可以把一個元素添加到堆棧頂-|众赢国际是干什么的。用不指定索引的 pop() 方法可以把一個元素從堆棧頂釋放出來--_众博彩票合法吗。例如:
>>> stack = [3, 4, 5]
>>> stack.append(6)
>>> stack.append(7)
>>> stack
[3, 4, 5, 6, 7]
>>> stack.pop()
7
>>> stack
[3, 4, 5, 6]
>>> stack.pop()
6
>>> stack.pop()
5
>>> stack
[3, 4]
5.1.2. 把鏈表當作隊列使用
你也可以把鏈表當做隊列使用-|永盛彩票官网,隊列作為特定的數據結構_|_江西自驾游,最先進入的元素最先釋放(先進先出)__-来个身份证号码。不過_-_丝诺萄,列表這樣用效率不高--35彩票网站骗局。相對來說從列表末尾添加和彈出很快__开店程序;在頭部插入和彈出很慢(因為__赢彩票平台靠谱吗,為了一個元素__|问道维护到几点,要移動整個列表中的所有元素)--安康龙舟赛。
要實現隊列|__亿彩彩票网址,使用 collections.deque--铁将军防盗器接线图,它為在首尾兩端快速插入和刪除而設計-长城彩票网站平台。例如:
>>> from collections import deque
>>> queue = deque(["Eric", "John", "Michael"])
>>> queue.append("Terry") # Terry arrives
>>> queue.append("Graham") # Graham arrives
>>> queue.popleft() # The first to arrive now leaves
'Eric'
>>> queue.popleft() # The second to arrive now leaves
'John'
>>> queue # Remaining queue in order of arrival
deque(['Michael', 'Terry', 'Graham'])
5.1.3. 列表推導式
列表推導式為從序列中創建列表提供了一個簡單的方法---卧底军婚。普通的應用程式通過將一些操作應用於序列的每個成員並通過返回的元素創建列表-|花不如酒,或者通過滿足特定條件的元素創建子序列--|阿凡提物流查询。
例如, 假設我們創建一個 squares 列表, 可以像下麵方式:
squares = []
for x in range(10):
... squares.append(x**2)
...

squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
注意這個 for 循環中的被創建(或被重寫)的名為 x 的變量在循環完畢後依然存在__阜南县教育网。使用如下方法-_项城征婚,我們可以計算squares的值而不會產生任何的副作用:
squares = list(map(lambda x: x2, range(10)))
或者_|-临泉二手房,等價於:
squares = [x
2 for x in range(10)]
上麵這個方法更加簡明且易讀.
列表推導式由包含一個表達式的括號組成|-28彩官方下载,表達式後麵跟隨一個 for 子句---福益康托玛琳能量杯,之後可以有零或多個 for 或 if 子句__-优彩网靠谱吗。結果是一個列表_-|淘宝网开店,由表達式依據其後麵的 for 和 if 子句上下文計算而來的結果構成_重庆伟岸。
例如__12306火车票登录,如下的列表推導式結合兩個列表的元素|_2019最新亚洲足球排名,如果元素之間不相等的話:
[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
等同於:
combs = []
for x in [1,2,3]:
... for y in [3,1,4]:
... if x != y:
... combs.append((x, y))
...
combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
值得注意的是在上麵兩個方法中的 for 和 if 語句的順序-__凤舞摩天麦词。
如果想要得到一個元組(例如-|欧布 奥特曼,上麵例子中的 (x, y))-__cf千变轮回2017,必須要加上括號:
vec = [-4, -2, 0, 2, 4]

create a new list with the values doubled

[x*2 for x in vec]
[-8, -4, 0, 4, 8]

filter the list to exclude negative numbers

[x for x in vec if x >= 0]
[0, 2, 4]

apply a function to all the elements

[abs(x) for x in vec]
[4, 2, 0, 2, 4]

call a method on each element

freshfruit = [' banana', ' loganberry ', 'passion fruit ']
[weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']

create a list of 2-tuples like (number, square)

[(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

the tuple must be parenthesized, otherwise an error is raised

[x, x2 for x in range(6)]
File "<stdin>", line 1, in ?
[x, x
2 for x in range(6)]
^
SyntaxError: invalid syntax

flatten a list using a listcomp with two 'for'

vec = [[1,2,3], [4,5,6], [7,8,9]]
[num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推導式可使用複雜的表達式和嵌套函數:
from math import pi
[str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
5.1.4. 嵌套的列表推導式
列表解析中的第一個表達式可以是任何表達式-|能耐的意思,包括列表解析--众乐彩票登陆。
考慮下麵由三個長度為 4 的列表組成的 3x4 矩陣:
matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
現在-利民彩票网七星彩论坛,如果你想交換行和列-|靓眼网,可以用嵌套的列表推導式:
[[row[i] for row in matrix] for i in range(4)]

create a new list with the values doubled
>>> [x2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x
2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x
2 for x in range(6)]
File "<stdin>", line 1, in ?
[x, x
*2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推導式可使用複雜的表達式和嵌套函數:
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
5.1.4. 嵌套的列表推導式
列表解析中的第一個表達式可以是任何表達式__|英国商人,包括列表解析-远图国际彩票软件。
考慮下麵由三個長度為 4 的列表組成的 3x4 矩陣:
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
現在|_132彩票在线,如果你想交換行和列_-上海哪里可以蹦极,可以用嵌套的列表推導式:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

[x2 for x in vec]
[-8, -4, 0, 4, 8]
>>> # filter the list to exclude negative numbers
>>> [x for x in vec if x >= 0]
[0, 2, 4]
>>> # apply a function to all the elements
>>> [abs(x) for x in vec]
[4, 2, 0, 2, 4]
>>> # call a method on each element
>>> freshfruit = [' banana', ' loganberry ', 'passion fruit ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']
>>> # create a list of 2-tuples like (number, square)
>>> [(x, x
2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
>>> # the tuple must be parenthesized, otherwise an error is raised
>>> [x, x
2 for x in range(6)]
File "<stdin>", line 1, in ?
[x, x
*2 for x in range(6)]
^
SyntaxError: invalid syntax
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
列表推導式可使用複雜的表達式和嵌套函數:
>>> from math import pi
>>> [str(round(pi, i)) for i in range(1, 6)]
['3.1', '3.14', '3.142', '3.1416', '3.14159']
5.1.4. 嵌套的列表推導式
列表解析中的第一個表達式可以是任何表達式-|-苏州宽带转让,包括列表解析||刘求池。
考慮下麵由三個長度為 4 的列表組成的 3x4 矩陣:
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
現在__掌上税务平台下载,如果你想交換行和列||犇龙庙,可以用嵌套的列表推導式:
>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
像前麵看到的__掌上购彩是不是骗局,嵌套的列表推導式是對 for 後麵的內容進行求值|-2019网上能买双色球吗,所以上例就等價於:

transposed = []
for i in range(4):
... transposed.append([row[i] for row in matrix])
...
transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
反過來說||36选7好彩1玩法,如下也是一樣的:
transposed = []
for i in range(4):
... # the following 3 lines implement the nested listcomp
... transposed_row = []
... for row in matrix:
... transposed_row.append(row[i])
... transposed.append(transposed_row)
...
transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
在實際中_-|青岛海底世界门票,你應該更喜歡使用內置函數組成複雜流程語句-|168彩票网站返现正规吗。對此種情況 zip() 函數將會做的更好:
list(zip(*matrix))
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
更多關於本行中使用的星號的說明||花都区教育局网站,參考 參數列表的分拆|-初中物理实验总结。
5.2. del 語句
有個方法可以從列表中按給定的索引而不是值來刪除一個子項-_1号计划app: del 語句|_新塑料球。它不同於有返回值的 pop() 方法-||许昌胖子店。語句 del 還可以從列表中刪除切片或清空整個列表(我們以前介紹過一個方法是將空列表賦值給列表的切片)---仙桃影视。例如:
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
a
[1, 66.25, 333, 333, 1234.5]
del a[2:4]
a
[1, 66.25, 1234.5]
del a[:]
a
[]
del 也可以刪除整個變量:
del a
此後再引用命名 a 會引發錯誤(直到另一個值賦給它為止)|_-金范金素恩吻戏。我們在後麵的內容中可以看到 del 的其它用法_--斗罗大陆之三生武魂。
5.3. 元組和序列
我們知道鏈表和字符串有很多通用的屬性--|铁打一只船,例如索引和切割操作_赢钱彩app。它們是 序列 類型(參見 Sequence Types — list, tuple, range )中的兩種||狗儿山上的八路军。因為 Python 是一個在不停進化的語言-|_运盛娱乐彩票下载,也可能會加入其它的序列類型-2n3055功放,這裏介紹另一種標準序列類型_|-168开奖现场软件下载: 元組 |_哈雷摩托报价。
一個元組由數個逗號分隔的值組成|_冷酷殿下判出局,例如:
t = 12345, 54321, 'hello!'
t[0]
12345
t
(12345, 54321, 'hello!')

Tuples may be nested:

... u = t, (1, 2, 3, 4, 5)

u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))

Tuples are immutable:

... t[0] = 88888
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

but they can contain mutable objects:

... v = ([1, 2, 3], [3, 2, 1])

v
([1, 2, 3], [3, 2, 1])
如你所見-|_1号平台,元組在輸出時總是有括號的--言峰绮礼怎么死的,以便於正確表達嵌套結構|--盈彩网。在輸入時可以有或沒有括號|-定位烫图片,不過經常括號都是必須的(如果元組是一個更大的表達式的一部分)-电话拜年。不能給元組的一個獨立的元素賦值(盡管你可以通過聯接和切割來模擬)|_|深圳网吧牌照。還可以創建包含可變對象的元組|_重庆325,例如鏈表_阿里布达年记。
雖然元組和列表很類似-|东升伟业股票,它們經常被用來在不同的情況和不同的用途_|_易彩网。元組有很多用途|至尊无名。例如 (x, y) 坐標對|__北上广地铁神器,數據庫中的員工記錄等等__|22彩票正规吗?。元組就像字符串__-注册福利彩票账号, 不可變的--|注册存1元送18。通常包含不同種類的元素並通過分拆(參閱本節後麵的內容) 或索引訪問(如果是 namedtuples|-_谈爱李白原文,甚至可以通過屬性)-|_丧尸新人类。列表是 可變的 |-纽培乐,它們的元素通常是相同類型的並通過迭代訪問|--无锡排骨是什么地方的菜。
一個特殊的問題是構造包含零個或一個元素的元組-|造梦西游3号源怎么用:為了適應這種情況||qq2011最新版官方下载,語法上有一些額外的改變_|_请输入查询关键字。一對空的括號可以創建空元組--淘宝开店步骤;要創建一個單元素元組可以在值後麵跟一個逗號(在括號中放入一個單值不夠明確)_易付宝下载安装。醜陋_|家门的荣光国语版百度影音,但是有效|国安部邱进。例如:
empty = ()
singleton = 'hello', # <-- note trailing comma
len(empty)
0
len(singleton)
1
singleton

a
[1, 66.25, 333, 333, 1234.5]
>>> del a[2:4]
>>> a
[1, 66.25, 1234.5]
>>> del a[:]
>>> a
[]
del 也可以刪除整個變量:
>>> del a
此後再引用命名 a 會引發錯誤(直到另一個值賦給它為止)_-|考试作弊手表。我們在後麵的內容中可以看到 del 的其它用法-||鸡脚黑。
5.3. 元組和序列
我們知道鏈表和字符串有很多通用的屬性||武汉体育学院校园网,例如索引和切割操作_-陕西二台都市快报。它們是 序列 類型(參見 Sequence Types — list, tuple, range )中的兩種_||盈彩在线平台。因為 Python 是一個在不停進化的語言-|星际争霸2人族大讲堂,也可能會加入其它的序列類型-|nba2k online3分技巧,這裏介紹另一種標準序列類型_掌信彩app下载: 元組 _|-15700牛蚌彩票开奖现场。
一個元組由數個逗號分隔的值組成-||基加美修的召唤石,例如:
>>> t = 12345, 54321, 'hello!'
>>> t[0]
12345
>>> t
(12345, 54321, 'hello!')
>>> # Tuples may be nested:
... u = t, (1, 2, 3, 4, 5)
>>> u
((12345, 54321, 'hello!'), (1, 2, 3, 4, 5))
>>> # Tuples are immutable:
... t[0] = 88888
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> # but they can contain mutable objects:
... v = ([1, 2, 3], [3, 2, 1])
>>> v
([1, 2, 3], [3, 2, 1])
如你所見_-|陈良全,元組在輸出時總是有括號的|唐人街导航,以便於正確表達嵌套結構_-众彩国际合法吗。在輸入時可以有或沒有括號_-_万科云山花园,不過經常括號都是必須的(如果元組是一個更大的表達式的一部分)__仪华特卖。不能給元組的一個獨立的元素賦值(盡管你可以通過聯接和切割來模擬)_||沟帮子到医巫闾山。還可以創建包含可變對象的元組-|_中兴福彩,例如鏈表__湖南基础教育资源网。
雖然元組和列表很類似||陈照升,它們經常被用來在不同的情況和不同的用途|村村通卫星电视升级。元組有很多用途台湾身份证号码。例如 (x, y) 坐標對_温雅泡泡染发剂,數據庫中的員工記錄等等|-造梦西游3爆率。元組就像字符串-掌上足球app, 不可變的-_诺亚信a800。通常包含不同種類的元素並通過分拆(參閱本節後麵的內容) 或索引訪問(如果是 namedtuples_--菲诗曼尔,甚至可以通過屬性)|_|01彩票平台是犯法的吗。列表是 可變的 __陈国栋简历,它們的元素通常是相同類型的並通過迭代訪問|川师附中初中部。
一個特殊的問題是構造包含零個或一個元素的元組|||苏州36路公交车路线:為了適應這種情況--阿凡仔,語法上有一些額外的改變--|火车票转让58同城。一對空的括號可以創建空元組--didee;要創建一個單元素元組可以在值後麵跟一個逗號(在括號中放入一個單值不夠明確)||_盈彩网没有邀请码。醜陋|_娱乐天地点检怎么下载,但是有效|_|卓易彩票不能买了。例如:
>>> empty = ()
>>> singleton = 'hello', # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)
語句 t = 12345, 54321, 'hello!' 是 元組封裝 (tuple packing)的一個例子---360彩票详情:值 12345 __-里番a c g全彩, 54321 和 'hello!' 被封裝進元組|-易发彩票充值会被坑吗。其逆操作可能是這樣:
x, y, z = t
這個調用等號右邊可以是任何線性序列--_苏州36路公交车路线,稱之為 序列拆封 非常恰當||_南阳卫生网。序列拆封要求左側的變量數目與序列的元素個數相同_|诺基亚n79软件下载。要注意的是可變參數(multiple assignment )其實隻是元組封裝和序列拆封的一個結合_云顶娱乐提现。
5.4. 集合
Python 還包含了一個數據類型 —— set (集合)|-水貂图片。集合是一個無序不重複元素的集|众发娱乐是传销吗。基本功能包括關係測試和消除重複元素--|254彩票。集合對象還支持 union(聯合)__优秀学生干部主要事迹,intersection(交)_|_其实不想走简谱,difference(差)和 sysmmetric difference(對稱差集)等數學運算||金蝉脱壳造句。
大括號或 set() 函數可以用來創建集合|__脊柱宝。注意|||智彩平台注册:想要創建空集合_-_阎玺的微博,你必須使用 set() 而不是 {}_-造梦西游3号源怎么用。後者用於創建空字典--_戴刘菲,我們在下一節中介紹的一種數據結構_|-北京暴雨 死亡。
以下是一個簡單的演示:
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
'orange' in basket # fast membership testing
True
'crabgrass' in basket
False

Demonstrate set operations on unique letters from two words

...

a = set('abracadabra')
b = set('alacazam')
a # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
a - b # letters in a but not in b
{'r', 'd', 'b'}
a | b # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
a & b # letters in both a and b
{'a', 'c'}
a ^ b # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
類似 列表推導式|-镁合金密度,這裏有一種集合推導式語法:
a = {x for x in 'abracadabra' if x not in 'abc'}
a
{'r', 'd'}
5.5. 字典
x, y, z = t
這個調用等號右邊可以是任何線性序列-|淘宝开店步骤,稱之為 序列拆封 非常恰當--306手机彩票网站。序列拆封要求左側的變量數目與序列的元素個數相同_-吴立琪厉娜。要注意的是可變參數(multiple assignment )其實隻是元組封裝和序列拆封的一個結合|-圣元金币优惠多联盟。
5.4. 集合
Python 還包含了一個數據類型 —— set (集合)||-11选5反波。集合是一個無序不重複元素的集||我的家乡作文600字。基本功能包括關係測試和消除重複元素--_李贤威博客。集合對象還支持 union(聯合)-京东e卡换钱就到卡卡同盟,intersection(交)-11选5投注官网,difference(差)和 sysmmetric difference(對稱差集)等數學運算-|花狸猫娱乐社区。
大括號或 set() 函數可以用來創建集合--|霸王花4。注意|--杂音未来的歌:想要創建空集合_-重庆恒丰银行待遇,你必須使用 set() 而不是 {}||_078彩票合法吗。後者用於創建空字典_234彩票网站,我們在下一節中介紹的一種數據結構_-|chc动作电影。
以下是一個簡單的演示:
>>> basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket) # show that duplicates have been removed
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket # fast membership testing
True
>>> 'crabgrass' in basket
False

>>> # Demonstrate set operations on unique letters from two words
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a # unique letters in a
{'a', 'r', 'b', 'c', 'd'}
>>> a - b # letters in a but not in b
{'r', 'd', 'b'}
>>> a | b # letters in either a or b
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b # letters in both a and b
{'a', 'c'}
>>> a ^ b # letters in a or b but not both
{'r', 'd', 'b', 'm', 'z', 'l'}
類似 列表推導式|_-众赢彩票首页,這裏有一種集合推導式語法:
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
5.5. 字典
另一個非常有用的 Python 內建數據類型是 字典 (參見 Mapping Types — dict )__|2000彩。字典在某些語言中可能稱為 聯合內存 ( associative memories )或 聯合數組 ( associative arrays )|钱宝网最新消息2018年。序列是以連續的整數為索引|李晨阳年龄,與此不同的是_-chc动作电影,字典以 關鍵字 為索引--北交晨光bt,關鍵字可以是任意不可變類型-_-11选5黑彩平台,通常用字符串或數值-_038彩票官方版ios。如果元組中隻包含字符串和數字-_-浪翻云博客,它可以做為關鍵字|_苗知喻,如果它直接或間接的包含了可變對象___玉子金童,就不能當做關鍵字唱歌节目。不能用鏈表做關鍵字-_船讯网船位查询,因為鏈表可以用索引|_英烈寄语、切割或者 append() 和 extend() 等方法改變__金佳景。
理解字典的最佳方式是把它看做無序的鍵||-开通gprs5元套餐: 值對 (key:value 對)集合_-|说不得大师,鍵必須是互不相同的(在同一個字典之內)__戴刘菲。一對大括號創建一個空的字典_||博医堂保元汤: {} |-_亿彩堂app。初始化鏈表時|__易赢彩票团队,在大括號內放置一組逗號分隔的鍵_|_莅临的意思:值對|花境设计说明,這也是字典輸出的方式__运盛彩票以前叫什么。
字典的主要操作是依據鍵來存儲和析取值||22彩票关了。也可以用 del 來刪除鍵|-106平台时时彩:值對(key:value)-_-家乡美食。如果你用一個已經存在的關鍵字存儲值||-盈彩彩票网,以前為該關鍵字分配的值就會被遺忘--_158计划最新网站。試圖從一個不存在的鍵中取值會導致錯誤_-_众易彩票可靠吗?。
對一個字典執行 list(d.keys()) 將返回一個字典中所有關鍵字組成的無序列表(如果你想要排序-|大成基金2020,隻需使用 sorted(d.keys()) )|||365彩票走势图。[2] 使用 in 關鍵字(指Python語法)可以檢查字典中是否存在某個關鍵字(指字典)-12306智行火车票机票。
這裏是使用字典的一個小示例:
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
tel['jack']
4098
del tel['sape']
tel['irv'] = 4127
tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
list(tel.keys())
['irv', 'guido', 'jack']
sorted(tel.keys())
['guido', 'irv', 'jack']
'guido' in tel
True
'jack' not in tel
False
dict() 構造函數可以直接從 key-value 對中創建字典:
dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
此外|_|风行者观察站,字典推導式可以從任意的鍵值表達式中創建字典:
{x: x2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果關鍵字都是簡單的字符串_|亿彩彩票是不是违法的,有時通過關鍵字參數指定 key-value 對更為方便:
dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
5.6. 循環技巧
在字典中循環時-_|苏州金鸡湖景区,關鍵字和對應的值可以使用 items() 方法同時解讀出來:
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
在序列中循環時_未满20岁单身禁买房,索引位置和對應值可以使用 enumerate() 函數同時得到:
for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
同時循環兩個或更多的序列-_-新乡爱情网,可以使用 zip() 整體打包:
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
dict() 構造函數可以直接從 key-value 對中創建字典:
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
此外__htcg55,字典推導式可以從任意的鍵值表達式中創建字典:
>>> {x: x
2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果關鍵字都是簡單的字符串--_耐美金,有時通過關鍵字參數指定 key-value 對更為方便:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
5.6. 循環技巧
在字典中循環時_-专科学校排名及分数线,關鍵字和對應的值可以使用 items() 方法同時解讀出來:
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
在序列中循環時好片地址,索引位置和對應值可以使用 enumerate() 函數同時得到:
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
同時循環兩個或更多的序列|-168开奖网下载安装,可以使用 zip() 整體打包:
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
需要逆向循環序列的話--无主之地2发型不好的日子,先正向定位序列||钱永真,然後調用 reversed() 函數:
for i in reversed(range(1, 10, 2)):
... print(i)

tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> list(tel.keys())
['irv', 'guido', 'jack']
>>> sorted(tel.keys())
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
>>> 'jack' not in tel
False
dict() 構造函數可以直接從 key-value 對中創建字典:
>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
此外_加盟制笔厂怎么样,字典推導式可以從任意的鍵值表達式中創建字典:
>>> {x: x**2 for x in (2, 4, 6)}
{2: 4, 4: 16, 6: 36}
如果關鍵字都是簡單的字符串__云顶娱乐在线平台网址,有時通過關鍵字參數指定 key-value 對更為方便:
>>> dict(sape=4139, guido=4127, jack=4098)
{'sape': 4139, 'jack': 4098, 'guido': 4127}
5.6. 循環技巧
在字典中循環時_-星光大道娃娃李烁,關鍵字和對應的值可以使用 items() 方法同時解讀出來:
>>> knights = {'gallahad': 'the pure', 'robin': 'the brave'}
>>> for k, v in knights.items():
... print(k, v)
...
gallahad the pure
robin the brave
在序列中循環時-_银彩娱乐来玩送10app,索引位置和對應值可以使用 enumerate() 函數同時得到:
>>> for i, v in enumerate(['tic', 'tac', 'toe']):
... print(i, v)
...
0 tic
1 tac
2 toe
同時循環兩個或更多的序列__-亿人娱乐网址,可以使用 zip() 整體打包:
>>> questions = ['name', 'quest', 'favorite color']
>>> answers = ['lancelot', 'the holy grail', 'blue']
>>> for q, a in zip(questions, answers):
... print('What is your {0}? It is {1}.'.format(q, a))
...
What is your name? It is lancelot.
What is your quest? It is the holy grail.
What is your favorite color? It is blue.
需要逆向循環序列的話--陈桥兵变令人疑,先正向定位序列_|-辽宁彩铃,然後調用 reversed() 函數:
>>> for i in reversed(range(1, 10, 2)):
... print(i)
...
9
7
5
3
1
要按排序後的順序循環序列的話-109福彩,使用 sorted() 函數_|_111彩票v11安卓版,它不改動原序列_|-隆兴行,而是生成一個新的已排序的序列:
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
... print(f)
...
apple
banana
orange
pear
若要在循環內部修改正在遍曆的序列(例如複製某些元素)_|109福彩,建議您首先製作副本||街头篮球showtime。在序列上循環不會隱式地創建副本-||成都群芳录。切片表示法使這尤其方便:
words = ['cat', 'window', 'defenestrate']
for w in words[:]: # Loop over a slice copy of the entire list.
... if len(w) > 6:
... words.insert(0, w)
...

words
['defenestrate', 'cat', 'window', 'defenestrate']
5.7. 深入條件控製
while 和 if 語句中使用的條件不僅可以使用比較_-_陈豪陈茵媺车震,而且可以包含任意的操作|-|生生世世爱歌词。
比較操作符 in 和 not in 審核值是否在一個區間之內-_|虹口区小学排名。操作符 is 和 is not 比較兩個對象是否相同-|金华艾克医院院长孙尚见;這隻和諸如鏈表這樣的可變對象有關-|朱罗世纪公园2。所有的比較操作符具有相同的優先級-|_1号平台下载,低於所有的數值操作-__广州市花都区人事局。
比較操作可以傳遞_锐志功能。例如 a < b == c 審核是否 a 小於 b 並且 b 等於 c_筱月桂。
比較操作可以通過邏輯操作符 and 和 or 組合---234彩票最低版本,比較的結果可以用 not 來取反義__|保定航空证券。這些操作符的優先級又低於比較操作符-|-金池 后知后觉,在它們之中_|-淘宝网上开店的步骤,not 具有最高的優先級|14胜负彩18172, or 優先級最低|_易旺彩票彩种,所以 A and not B or C 等於 (A and (notB)) or C-__重庆ume影城。當然-_若风退役仪式视频,括號也可以用於比較表達式_234彩票真假。
邏輯操作符 and 和 or 也稱作短路操作符|-南滨是哪个省的:它們的參數從左向右解析__htc a3333,一旦結果可以確定就停止--|众创联盟app。例如|_2009版qq下载,如果 A 和 C 為真而 B 為假_|狼人 狼嚎再起, A and B and C 不會解析 C--_潘春春 樊玲。作用於一個普通的非邏輯值時-|注册自动送18,短路操作符的返回值通常是最後一個變量||_诺基亚5530xm软件。
可以把比較或其它邏輯表達式的返回值賦給一個變量__诺基亚103,例如:
string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
non_null = string1 or string2 or string3
non_null
'Trondheim'
需要注意的是 Python 與 C 不同_|臭作游戏截图,在表達式內部不能賦值__石家庄口碑网。C 程序員經常對此抱怨_-哪有那样的网站,不過它避免了一類在 C 程序中司空見慣的錯誤-||qq空间克隆下载:想要在解析式中使 == 時誤用了 = 操作符-铁山港365。
5.8. 比較序列和其它類型
序列對象可以與相同類型的其它對象比較|盐都政府网。比較操作按 字典序 進行马云投资云联惠5000亿:首先比較前兩個元素_-永盛彩票网址,如果不同__溶剂脱色剂,就決定了比較的結果||-世纪星影院;如果相同--鬼域国语,就比較後兩個元素-06新粤彩报图,依此類推--|谈爱李白原文,直到所有序列都完成比較--_www sonyericsson com。如果兩個元素本身就是同樣類 型的序列--健贝,就遞歸字典序比較-描写大自然的句子。如果兩個序列的所有子項都相等|||智行彩票注册,就認為序列相等___陈翔qq群。如果一個序列是另一個序列的初始子序列||_易发彩票邀请码怎么找?,較短的一個序列就小於另一個-_盈彩网属于合法的吗。字符 串的字典序按照單字符的 ASCII 順序||众益彩下载。下麵是同類型序列之間比較的一些例子:
(1, 2, 3) < (1, 2, 4)
[1, 2, 3] < [1, 2, 4]
'ABC' < 'C' < 'Pascal' < 'Python'
(1, 2, 3, 4) < (1, 2, 4)
(1, 2) < (1, 2, -1)
(1, 2, 3) == (1.0, 2.0, 3.0)
(1, 2, ('aa', 'ab')) < (1, 2, ('abc', 'a'), 4)
需要注意的是如果通過 < 或者 > 比較的對象隻要具有合適的比較方法就是合法的___新乡天气2345。比如__|csol腐化暴君,混合數值類型是通過它們的數值就行比較的-_138期香港12生肖彩票,所以 0 是等於 0.0 __舍得返利网。否則解釋器將會觸發一個 TypeError 異常--_2019年万达广场南阳,而不是提供一個隨意的結果-_上海哪里可以蹦极。

  1. 模塊
    如果你退出 Python 解釋器並重新進入__梦幻诛仙续魂珠,你做的任何定義(變量和方法)都會丟失_-诺亚舟np980。因此|_22彩票平台,如果你想要編寫一些更大的程序_|oppo805,為準備解釋器輸入使用一個文本編輯器會更好||冯绍峰qq号,並以那個文件替代作為輸入執行__|11选5开奖助手ios。這就是傳說中的 腳本_|成年人身份证。隨著你的程序變得越來越長-_注册银彩app,你可能想要將它分割成幾個更易於維護的文件_-11选5走势图软件。你也可能想在不同的程序中使用順手的函數-镭波吧,而不是把代碼在它們之間中拷來拷去_|11086移动彩票怎么样。
    為了滿足這些需要-_36元王者彩票是真的吗,Python 提供了一個方法可以從文件中獲取定義-_小米官网首页抢购红米,在腳本或者解釋器的一個交互式實例中使用|__何再贵。這樣的文件被稱為 模塊-_盈彩吧是不是真的;模塊中的定義可以 導入 到另一個模塊或 主模塊 中(在腳本執行時可以調用的變量集位於最高級_|尊龙娱乐登录,並且處於計算器模式)__01彩票597849com。
    模塊是包括 Python 定義和聲明的文件--陇桥学院地址。文件名就是模塊名加上 .py 後綴-_力月西批发。模塊的模塊名(做為一個字符串)可以由全局變量 name 得到--_168彩票是官方网站吗?。例如---有没有那样的网站,你可以用自己慣用的文件編輯器在當前目錄下創建一個叫 fibo.py 的文件-镶黄旗姓氏,錄入如下內容:

Fibonacci numbers module

def fib(n): # write Fibonacci series up to n
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()

def fib2(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
現在進入 Python 解釋器並使用以下命令導入這個模塊:

import fibo
這樣做不會直接把 fibo 中的函數導入當前的語義表|-|券老婆;它隻是引入了模塊名 fibo_-|2000彩注册。你可以通過模塊名按如下方式訪問這個函數:
fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
fibo.name
'fibo'
如果打算頻繁使用一個函數|_-掌上武汉APP,你可以將它賦予一個本地變量:
fib = fibo.fib
fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
6.1. 深入模塊
除了包含函數定義外_-驾校教练车图片,模塊也可以包含可執行語句-南安市委书记。這些語句一般用來初始化模塊_-民间故事和民间歌谣。他們僅在 第一次 被導入的地方執行一次__|胡梦舟。[1]
每個模塊都有自己私有的符號表-|118彩票apk,被模塊內所有的函數定義作為全局符號表使用_168高频彩开奖记录。因此___众赢彩票计划软件手机,模塊的作者可以在模塊內部使用全局變量_每日开放式基金,而無需擔心它與某個用戶的全局變量意外衝突|-诛仙代练。從另一個方麵講-_2019注册送彩金新网站,如果你確切的知道自己在做什麼|||福州哪里有学生鸡,你可以使用引用模塊函數的表示法訪問模塊的全局變量-|118彩图库和118论坛网址大全,modname.itemname||185cc太阳彩票。
模塊可以導入其他的模塊-_365彩票平台官方网站。一個(好的)習慣是將所有的 import 語句放在模塊的開始(或者是腳本)__ua女人网化妆技巧,這並非強製-|意彩彩票网站。被導入的模塊名會放入當前模塊的全局符號表中-后院有宝。
import 語句的一個變體直接從被導入的模塊中導入命名到本模塊的語義表中_123手机开奖软件。例如:
from fibo import fib, fib2
fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
這樣不會從局域語義表中導入模塊名(如上所示|-_01彩票网页, fibo 沒有定義)-_|11086移动彩票登不进去。
甚至有種方式可以導入模塊中的所有定義:
from fibo import *
fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
這樣可以導入所有除了以下劃線( _ )開頭的命名|-桃江二手房。
需要注意的是在實踐中往往不鼓勵從一個模塊或包中使用 * 導入所有|__邮局营业时间,因為這樣會讓代碼變得很難讀_|_北仑教科网。不過_雪域藏王散,在交互式會話中這樣用很方便省力|铜旗阵。
Note
出於性能考慮_|_色拉油的密度,每個模塊在每個解釋器會話中隻導入一遍__江简称。因此-|河南大象网,如果你修改了你的模塊_铅钢,需要重啟解釋器-|易赢彩票提现;或者-__徐粉林简历,如果你就是想交互式的測試這麼一個模塊_万圣节死亡之旅,可以用 imp.reload() 重新加載-|-郑小爽822,例如 import imp; imp.reload(modulename)-|143期双色球开奖中奖地。
6.1.1. 作為腳本來執行模塊
當你使用以下方式運行 Python 模塊時___徐茂根,模塊中的代碼便會被執行:
python fibo.py <arguments>
模塊中的代碼會被執行_|殷世航个人资料,就像導入它一樣_-番禺桑拿论坛,不過此時 name 被設置為 "main"-132彩票网是正规平台吗。這相當於||盈彩彩票是骗局吗,如果你在模塊後加入如下代碼:
if name == "main":
import sys
fib(int(sys.argv[1]))
就可以讓此文件像作為模塊導入時一樣作為腳本執行-|-106福彩苹果怎么下载。此代碼隻有在模塊作為 “main” 文件執行時才被調用:
$ python fibo.py 50
1 1 2 3 5 8 13 21 34

fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.name
'fibo'
如果打算頻繁使用一個函數-我爱淘折,你可以將它賦予一個本地變量:
>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
6.1. 深入模塊
除了包含函數定義外|_01彩票是怎么回事,模塊也可以包含可執行語句--|中科彩票印务。這些語句一般用來初始化模塊__|h bl。他們僅在 第一次 被導入的地方執行一次|_陈莎莎个人资料。[1]
每個模塊都有自己私有的符號表__-小爸爸拍摄地点,被模塊內所有的函數定義作為全局符號表使用-_火车票转让58同城。因此||_成年的人的身份证号,模塊的作者可以在模塊內部使用全局變量--众乐网彩票,而無需擔心它與某個用戶的全局變量意外衝突|-石家庄紫萱保健按摩。從另一個方麵講_11086移动彩票几年了,如果你確切的知道自己在做什麼_重庆省道103,你可以使用引用模塊函數的表示法訪問模塊的全局變量__青岛华臣影讯,modname.itemname-_玫琳凯督导。
模塊可以導入其他的模塊--突袭宝库。一個(好的)習慣是將所有的 import 語句放在模塊的開始(或者是腳本)__|火车票转让58同城,這並非強製-__火票网。被導入的模塊名會放入當前模塊的全局符號表中|||30元好彩头出奖模式。
import 語句的一個變體直接從被導入的模塊中導入命名到本模塊的語義表中|_掌上彩票pro网络异常。例如:
>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
這樣不會從局域語義表中導入模塊名(如上所示--09版qq下载, fibo 沒有定義)|-|智多星时时彩计划。
甚至有種方式可以導入模塊中的所有定義:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
這樣可以導入所有除了以下劃線( _ )開頭的命名_|古惑仔之笑看风云。
需要注意的是在實踐中往往不鼓勵從一個模塊或包中使用 * 導入所有|-_诺基亚c6 00软件,因為這樣會讓代碼變得很難讀_--159彩票网中奖不给钱。不過_亿彩彩票官网首页,在交互式會話中這樣用很方便省力|--钢八连。
Note
出於性能考慮---诺卡n9,每個模塊在每個解釋器會話中隻導入一遍-__秦国赵弋。因此--亿博国际娱乐登录,如果你修改了你的模塊_|中国梦想秀圆梦专场,需要重啟解釋器|_铁路托运价格表;或者__男儿当入樽粤语,如果你就是想交互式的測試這麼一個模塊|||索爱u5i刷机,可以用 imp.reload() 重新加載_-|百强中学,例如 import imp; imp.reload(modulename)-_|168彩票网站返现正规吗。
6.1.1. 作為腳本來執行模塊
當你使用以下方式運行 Python 模塊時|承德会计之家网站,模塊中的代碼便會被執行:
python fibo.py <arguments>
模塊中的代碼會被執行_淘宝怎么卖东西,就像導入它一樣_-|刘竟图片,不過此時 name 被設置為 "main"-|易富彩票注册。這相當於-_-qq空间克隆下载,如果你在模塊後加入如下代碼:
if name == "main":
import sys
fib(int(sys.argv[1]))
就可以讓此文件像作為模塊導入時一樣作為腳本執行|-_众赢彩票导航网。此代碼隻有在模塊作為 “main” 文件執行時才被調用:
$ python fibo.py 50
1 1 2 3 5 8 13 21 34
如果模塊被導入__|中博彩票系统,不會執行這段代碼:
import fibo

這通常用來為模塊提供一個便於測試的用戶接口(將模塊作為腳本執行測試需求)_-青年中国说余佳文。
6.1.2. 模塊的搜索路徑
導入一個叫 spam 的模塊時-|_语笑今生,解釋器先在當前目錄中搜索名為 spam.py 的文件-_|钻石刷q币。如果沒有找到的話_|-心理罪为什么看不了,接著會到 sys.path 變量中給出的目錄列表中查找1288彩票是干什么的。 sys.path 變量的初始值來自如下__|盈众彩票诈骗:
輸入腳本的目錄(當前目錄)___金冷降温理疗袋。
環境變量 PYTHONPATH 表示的目錄列表中搜索
(這和 shell 變量 PATH 具有一樣的語法|-moko美空模特路遥,即一係列目錄名的列表)__256买彩票iPhone版。
Python 默認安裝路徑中搜索-__珠江电视台今日关注。
Note
在支持符號連接的文件係統中__|娱乐天地手机登录,輸入的腳本所在的目錄是符號連接指向的目錄|_诺基亚滑盖手机大全图片及报价。 換句話說也就是包含符號鏈接的目錄不會被加到目錄搜索路徑中|单单堂。
實際上-|-有好看的僵尸电影吗,解釋器由 sys.path 變量指定的路徑目錄搜索模塊-09彩票,該變量初始化時默認包含了輸入腳本(或者當前目錄)-|云鼎彩票公司, PYTHONPATH 和安裝目錄-__金榜起名网。這樣就允許 Python 程序了解如何修改或替換模塊搜索目錄--|快视影院百度影音。需要注意的是由於這些目錄中包含有搜索路徑中運行的腳本|_诺基亚手机真伪查询,所以這些腳本不應該和標準模塊重名|_|净天之命1 60攻略,否則在導入模塊時 Python 會嚐試把這些腳本當作模塊來加載|__pc蛋蛋幸运28助赢软件。這通常會引發錯誤||金色笔记。請參見 標準模塊 以了解更多的信息--黄牛课件。
6.1.3. “編譯的” Python 文件
為了加快加載模塊的速度|_小爸爸优酷电视剧全集,Python 會在 pycache 目錄下以 module.version.pyc 名字緩存每個模塊編譯後的版本--|重生之逍遥风流,這裏的版本編製了編譯後文件的格式|__248彩票网站。它通常會包含 Python 的版本號||重生洪荒之逍遥至尊。例如-_-大连好旺角房屋中介,在 CPython 3.3 版中_--谈爱李白原文,spam.py 編譯後的版本將緩存為 pycache/spam.cpython-33.pyc-俗人岛华人。這種命名約定允許由不同發布和不同版本的 Python 編譯的模塊同時存在_-|武汉批发市场。
Python 會檢查源文件與編譯版的修改日期以確定它是否過期並需要重新編譯_|_京东商城打折。這是完全自動化的過程---表彰大会主持稿。同時_-动感最划算,編譯後的模塊是跨平台的-_-2018政府打击云联惠,所以同一個庫可以在不同架構的係統之間共享_|_敌人的力量。
Python 不檢查在兩個不同環境中的緩存|_-许昌胖子店。首先||观山湖区招考报名系统,它會永遠重新編譯而且不會存儲直接從命令行加載的模塊_||11选五中奖助手官方版。其次||_焦作武陟一中,如果沒有源模塊它不會檢查緩存-北仑中学。若要支持沒有源文件(隻有編譯版)的發布--仙剑五破解版,編譯後的模塊必須在源目錄下-|冠福家用股票,並且必須沒有源文件的模塊|_|qq下载2011正式版官方免费下载。
部分高級技巧:
為了減少一個編譯模塊的大小||钢铁悍将,你可以在 Python 命令行中使用 -O 或者 -OO__|11086移动彩票cn。-O 參數刪除了斷言語句|_淘1站,-OO 參數刪除了斷言語句和 doc 字符串|_f1视频直播。
因為某些程序依賴於這些變量的可用性|168彩票靠谱,你應該隻在確定無誤的場合使用這一選項|||汤唯在韩国视频。“優化的” 模塊有一個 .pyo 後綴而不是 .pyc 後綴_-南华苑路55号。未來的版本可能會改變優化的效果|--山海情缘东方神韵。
來自 .pyc 文件或 .pyo 文件中的程序不會比來自 .py 文件的運行更快_-镇江老兵事件最新进展;.pyc 或 .pyo 文件隻是在它們加載的時候更快一些-|快乐大本营之棒棒堂。
compileall 模塊可以為指定目錄中的所有模塊創建 .pyc 文件(或者使用 -O 參數創建 .pyo 文件)_|重庆歪歌横行。
在 PEP 3147 中有很多關這一部分內容的細節--2019注册送500彩金,並且包含了一個決策流程-|多彩宝石图纸。
6.2. 標準模塊
Python 帶有一個標準模塊庫_-_雅煊,並發布有獨立的文檔|_|杨幂11分钟,名為 Python 庫參考手冊(此後稱其為“庫參考手冊”)-|维生素k3别名。有一些模塊內置於解釋器之中_-leledy8,這些操作的訪問接口不是語言內核的一部分|_雄县地图,但是已經內置於解釋器了-_戴拿奥特曼国语全集。這既是為了提 高效率-博格利佳,也是為了給係統調用等操作係統原生訪問提供接口_镇坪路废弃学校。這類模塊集合是一個依賴於底層平台的配置選項-|_店招图片。例如--上海哪里有蹦极,winreg 模塊隻提供在 Windows 係統上才有||工人日报电子版。有一個具體的模塊值得注意||_希苒女装: sys |优点彩票北京PK10,這個模塊內置於所有的 Python 解釋器|兔瓣。變量 sys.ps1 和 sys.ps2 定義了主提示符和輔助提示符字符串:

import sys
sys.ps1
'>>> '
sys.ps2
'... '
sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
這兩個變量隻在解釋器的交互模式下有意義-__青岛极地海洋世界图片。
變量 sys.path 是解釋器模塊搜索路徑的字符串列表-_飞天侠女电影。它由環境變量 PYTHONPATH 初始化|||仇岗勇士,如果沒有設定 PYTHONPATH --易发彩票坑比,就由內置的默認值初始化-_-至尊许仙。你可以用標準的字符串操作修改它:
import sys
sys.path.append('/ufs/guido/lib/python')
6.3. dir() 函數
內置函數 dir() 用於按模塊名搜索模塊定義__|小学生秋诗网网,它返回一個字符串類型的存儲列表:
import fibo, sys
dir(fibo)
['name', 'fib', 'fib2']
dir(sys)
['displayhook', 'doc', 'excepthook', 'loader', 'name',
'package', 'stderr', 'stdin', 'stdout',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',

'
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>
這兩個變量隻在解釋器的交互模式下有意義_360彩票手机官方网站。
變量 sys.path 是解釋器模塊搜索路徑的字符串列表|vkke创始人何婧婧。它由環境變量 PYTHONPATH 初始化-_艾艾社区,如果沒有設定 PYTHONPATH -|-易彩—彩民福地登录app,就由內置的默認值初始化-|锦州铁通影院网址。你可以用標準的字符串操作修改它:
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
6.3. dir() 函數
內置函數 dir() 用於按模塊名搜索模塊定義--掌上平台336时时彩,它返回一個字符串類型的存儲列表:
>>> import fibo, sys
>>> dir(fibo)
['name', 'fib', 'fib2']
>>> dir(sys)
['displayhook', 'doc', 'excepthook', 'loader', 'name',
'package', 'stderr', 'stdin', 'stdout',
'_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
'_home', '_mercurial', 'xoptions', 'abiflags', 'api_version', 'argv',
'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
'call_tracing', 'callstats', 'copyright', 'displayhook',
'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
'thread_info', 'version', 'version_info', 'warnoptions']
無參數調用時_||二手军用吉普车,dir() 函數返回當前定義的命名:
a = [1, 2, 3, 4, 5]
import fibo
fib = fibo.fib
dir()
['builtins', 'doc', 'file', 'name', 'a', 'fib', 'fibo', 'sys']
注意該列表列出了所有類型的名稱__-苏西 埃米斯:變量--冰火三重天,模塊||陈楚河张檬,函數||安全部邱进,等等|搬运工包吃住8000月结。
dir() 不會列出內置函數和變量名-|_038彩票网提现快吗?。如果你想列出這些內容_|_群芳录,它們在標準模塊 builtins 中定義:
import builtins
dir(builtins)
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException',
'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning',
'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError',
'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning',
'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False',
'FileExistsError', 'FileNotFoundError', 'FloatingPointError',
'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError',
'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError',
'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError',
'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented',
'NotImplementedError', 'OSError', 'OverflowError',
'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError',
'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning',
'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError',
'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError',
'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError',
'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning',
'ValueError', 'Warning', 'ZeroDivisionError', '
', 'build_class',
'debug', 'doc', 'import', 'name', 'package', 'abs',
'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable',
'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits',
'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit',
'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview',
'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars',
'zip']
6.4. 包
包通常是使用用“圓點模塊名”的結構化模塊命名空間|-105彩票骗局。例如--11选5彩票走势怎么分析,名為 A.B 的模塊表示了名為 A 的包中名為 B 的子模塊|_csol防沉迷。正如同用模塊來保存不同的模塊架構可以避免全局變量之間的相互衝突--_苏西 埃米斯,使用圓點模塊名保存像 NumPy 或 Python Imaging Library 之類的不同類庫架構可以避免模塊之間的命名衝突___男科悍医。
假設你現在想要設計一個模塊集(一個“包”)來統一處理聲音文件和聲音數據||云顶娱乐平台注册送78。存在幾種不同的聲音格式(通常由它們的擴展名來標識|-运盛彩票登录,例如-||糗友窝:.wav_-成都购房入户政策, .aiff-_客户资料登记表格,.au )_|自行车比汽车污染更严重,於是--_空间留言代码爱情,為了在不同類型的文件格式之間轉換__灵芝体,你需要維護一個不斷增長的包集合-顺丰便利店。可能你還想要對聲音數據做很多不同的操作(例如混音__捡钱街,添加回聲_劫机哥,應用平衡 功能---嘉兴口碑网,創建一個人造效果)-|_2019香港赛駌会彩经,所以你要加入一個無限流模塊來執行這些操作__|众购彩票网站。你的包可能會是這個樣子(通過分級的文件體係來進行分組):
sound/ Top-level package
init.py Initialize the sound package
formats/ Subpackage for file format conversions
init.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ Subpackage for sound effects
init.py
echo.py
surround.py
reverse.py
...
filters/ Subpackage for filters
init.py
equalizer.py
vocoder.py
karaoke.py
...
當導入這個包時__诺基亚c202,Python 通過 sys.path 搜索路徑查找包含這個包的子目錄|优彩娱乐正规的吗。
為了讓 Python 將目錄當做內容包__|小鸽子图片,目錄中必須包含 init.py 文件-_意彩怎么注册代理。這是為了避免一個含有爛俗名字的目錄無意中隱藏了稍後在模塊搜索路徑中出現的有效模塊_|-青岛二胎新政策2014,比如 string_英国玛格丽特公主。最簡單的情況下|--金华职业技术学院邮编,隻需要一個空的 init.py 文件即可-今天股票开盘吗。當然它也可以執行包的初始化代碼|||亿赢彩票1000反300,或者定義稍後介紹的 all 變量|--免费空间克隆。
用戶可以每次隻導入包裏的特定模塊-_金宝贝取名网,例如:
import sound.effects.echo
這樣就導入了 sound.effects.echo 子模塊__长三角经济区。它必需通過完整的名稱來引用:
sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)
導入包時有一個可以選擇的方式:
from sound.effects import echo
這樣就加載了 echo 子模塊|--易投彩票网站,並且使得它在沒有包前綴的情況下也可以使用|监察特使,所以它可以如下方式調用:
echo.echofilter(input, output, delay=0.7, atten=4)
還有另一種變體用於直接導入函數或變量:
from sound.effects.echo import echofilter
這樣就又一次加載了 echo 子模塊_|-东港宋老六,但這樣就可以直接調用它的 echofilter() 函數:
echofilter(input, output, delay=0.7, atten=4)
需要注意的是使用 from package import item 方式導入包時|__2019最新捕鱼游戏排行,這個子項(item)既可以是包中的一個子模塊(或一個子包)_-吉林省中小学教师研修网,也可以是包中定義的其它命名|艺术生百日冲刺这本书,像函數-||索爱w750、類或變量-__中央少儿频道节目表。import 語句首先核對是否包中有這個子項|-抓住偷水贼,如果沒有__花都区教育局电话,它假定這是一個模塊_|什么电影最好看,並嚐試加載它|优信彩票预测。如果沒有找到它|-国世平本人,會引發一個 ImportError 異常|-苏州园区三中。
相反||强心脏20110823,使用類似 import item.subitem.subsubitem 這樣的語法時-_糗友窝,這些子項必須是包---今日山东鸡蛋价格,最後的子項可以是包或模塊|-|沈阳热线宽带测速,但不能是前麵子項中定義的類-_360彩票苹果客户端、函數或變量_|青岛台东八路洗头房。
6.4.1. 從 * 導入包
那麼當用戶寫下 from sound.Effects import * 時會發生什麼事|-青楼十2房?理想中___dnf6月21日,總是希望在文件係統中找出包中所有的子模塊|钻石夜总会主持人,然後導入它們|_-038彩票是真的假的。這可能會花掉委有長時間_|13彩票,並且出現期待之外的邊界效應__淘宝店标尺寸,導出了希望隻能顯式導入的包-|海豚音那首歌叫什么。
對於包的作者來說唯一的解決方案就是給提供一個明確的包索引-__许鹤缤 家在远方。import 語句按如下條件進行轉換-_|22福利彩票官方手机版:執行 from package import * 時|_01彩票怎么样,如果包中的 init.py 代碼定義了一個名為 all 的列表|--基督教赞美歌曲大全,就會按照列表中給出的模塊名進行導入-|-朗姿代购。新版本的包發布時作者可以任意更新這個列表___038com彩票官方网。如果包作者不想 import * 的時候導入他們的包中所有模塊--_n79软件,那麼也可能會決定不支持它( import * )---青年中国说余佳文。例如|-博客大巴, sound/effects/init.py 這個文件可能包括如下代碼:
all = ["echo", "surround", "reverse"]
這意味著 from Sound.Effects import * 語句會從 sound 包中導入以上三個已命名的子模塊_|198彩苹果下载。
如果沒有定義 all -_爱国者同盟网, from Sound.Effects import * 語句 不會 從 sound.effects 包中導入所有的子模塊-_宅男躲艳记。無論包中定義多少命名__三中三规律,隻能確定的是導入了 sound.effects 包(可能會運行 init.py 中的初始化代碼)以及包中定義的所有命名會隨之導入|-132彩票官方。這樣就從 init.py 中導入了每一個命名(以及明確導入的子模塊)--11kkxx。同樣也包括了前述的 import 語句從包中明確導入的子模塊_||01彩票真的能赚钱吗,考慮以下代碼:
import sound.effects.echo
import sound.effects.surround
from sound.effects import *
在這個例子中|||模特庞盼盼,echo 和 surround 模塊導入了當前的命名空間_|阿里魔战,這是因為執行 from...import 語句時它們已經定義在 sound.effects 包中了(定義了 all 時也會同樣工作)|||1博彩票官网。
盡管某些模塊設計為使用 import * 時它隻導出符全某種模式的命名|芳香假日,仍然不建議在生產代碼中使用這種寫法||仙剑5前传破解。
記住_||大运河开凿于,from Package import specific_submodule 沒有錯誤_我是传奇2百度影音!事實上_||清华同方太阳能价格,除非導入的模塊需要使用其它包中的同名子模塊|--106官网彩票可靠吗,否則這是推薦的寫法_--四川电信综合调度网址。
6.4.2. 包內引用
如果包中使用了子包結構(就像示例中的 sound 包)-||往日时光吉他谱,可以按絕對位置從相鄰的包中引入子模塊-_-整理英语。例如|_小轿车图片,如果 sound.filters.vocoder 包需要使用 sound.effects 包中的 echo 模塊-|芭芭卡伦,它可以 from Sound.Effects import echo_|-找一段塑料包装袋。
你可以用這樣的形式 from module import name 來寫顯式的相對位置導入--|shinee隐藏摄像机。那些顯式相對導入用點號標明關聯導入當前和上級包||_艺考生百日冲刺。以 surround 模塊為例_--中国石油价格表,你可以這樣用:
from . import echo
from .. import formats
from ..filters import equalizer
需要注意的是顯式或隱式相對位置導入都基於當前模塊的命名_|亿彩堂官方下载。因為主模塊的名字總是 "main"_|_破解小黄车密码方法,Python 應用程序的主模塊應該總是用絕對導入||蛮荒之友。
6.4.3. 多重目錄中的包
包支持一個更為特殊的特性__亿人娱乐官网下载, path|_148买马开奖结果查询。 在包的 init.py 文件代碼執行之前--_等你爱我原唱,該變量初始化一個目錄名列表|_36选7开奖中奖规则。該變量可以修改_|_众赢彩票论坛,它作用於包中的子包和模塊的搜索功能_-_易发大吉大利下载。
這個功能可以用於擴展包中的模塊集|仙五破解,不過它不常用|-杨幂被灌醉全图种子。
Footnotes
[1] 事實上函數定義既是“聲明”又是“可執行體”|_华医网首页;執行體由函數在模塊全局語義表中的命名導入--云顶国际网页不见了。

  1. 輸入和輸出
    一個程序可以有幾種輸出方式|-铠甲勇士刑天后传1:以人類可讀的方式打印數據_-三湾改编时间,或者寫入一個文件供以後使用||初中游记作文。本章將討論幾種可能性||-逛网地图。
    7.1. 格式化輸出
    我們有兩種大相徑庭地輸出值方法-_芦山县委书记:表達式語句 和 print() 函數(第三種訪求是使用文件對象的 write() 方法-|风流少年唐伯虎2,標準文件輸出可以參考 sys.stdout_||注册送彩金68不限id,詳細內容參見庫參考手冊)_射阳中学。
    通常-攻略男神h书包网手机版,你想要對輸出做更多的格式控製_-家门的荣光国语版百度影音,而不是簡單的打印使用空格分隔的值|-爱慕卡盟。有兩種方法可以格式化你的輸出_-觅血者斯基尔:第一種方法是由你自己處理整個字符串__挠脚心动漫图,通 過使用字符串切割和連接操作可以創建任何你想要的輸出形式__物合网。string 類型包含一些將字符串填充到指定列寬度的有用操作|_-非诚勿扰房地产商,隨後就會討論這些_-中兴彩票ApP。第二種方法是使用 str.format() 方法---阿玛拉王国锻造材料。
    標準模塊 string 包括了一些操作_-森马连衣裙,將字符串填充入給定列時--lt27,這些操作很有用--_重修之灭仙弑神续集。隨後我們會討論這部分內容||陈志平博客。第二種方法是使用 Template 方法|__与狼共舞oa。
    當然-|_360双色球专家杀号定胆,還有一個問題_|-黄梁txt,如何將值轉化為字符串__电视剧军刺?很幸運|||衡水电大成绩查询,Python 有辦法將任意值轉為字符串|-_亚洲区:將它傳入 repr() 或 str() 函數_|致命交易市长放过我。
    函數 str() 用於將值轉化為適於人閱讀的形式|__永城彩票软件苹果下载,而 repr() 轉化為供解釋器讀取的形式(如果沒有等價的語法_-|降龙之剑boss坐标,則會發生 SyntaxError 異常)某對象沒有適於人閱讀的解釋形式的話--c罗电梯球教学,str() 會返回與 repr() 等同的值--|1234成人网站。很多類型-_河间吧,諸如數值或鏈表_|2002年春晚节目单、字典這樣的結構--_河南瘦肉精事件,針對各函數都有著統一的解讀方式-运盛娱乐彩票。字符串和浮點數-_|武汉自驾游,有著獨特的解讀方式_||动感地带积分兑换商城。
    下麵有些例子:

s = 'Hello, world.'
str(s)
'Hello, world.'
repr(s)
"'Hello, world.'"
str(1/7)
'0.14285714285714285'
x = 10 * 3.25
y = 200 * 200
s = 'The value of x is ' + repr(x) + ', and y is ' + repr(y) + '...'
print(s)
The value of x is 32.5, and y is 40000...

The repr() of a string adds string quotes and backslashes:

... hello = 'hello, world\n'

hellos = repr(hello)
print(hellos)
'hello, world\n'

The argument to repr() may be any Python object:

... repr((x, y, ('spam', 'eggs')))
"(32.5, 40000, ('spam', 'eggs'))"
有兩種方式可以寫平方和立方表:

for x in range(1, 11):
... print(repr(x).rjust(2), repr(xx).rjust(3), end=' ')
... # Note use of 'end' on previous line
... print(repr(x
x*x).rjust(4))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000

for x in range(1, 11):
... print('{0:2d} {1:3d} {2:4d}'.format(x, xx, xxx))
...
1 1 1
2 4 8
3 9 27
4 16 64
5 25 125
6 36 216
7 49 343
8 64 512
9 81 729
10 100 1000
(注意第一個例子|-重庆力帆公子尹喜地,print() 在每列之間加了一個空格_|_中科彩票不能提现,它總是在參數間加入空格_|朱晓东我型我秀。)
以上是一個 str.rjust() 方法的演示_|诺基亚5700主题下载,它把字符串輸出到一列__|皇家马德里电影,並通過向左側填充空格來使其右對齊-|五星体育f1直播。類似的方法還有 str.ljust() 和 str.center()__-台风银河登陆海南。這些函數隻是輸出新的字符串||-男扮女装过程,並不改變什麼---皇室的赏赐。如果輸出的字符串太長|__256彩票注册,它們也不會截斷它_||许君浩新浪博客,而是原樣輸出-|_腾翼c70论坛,這會使你的輸出格式變得混亂|_|松鹤墓园,不過總強過另一種選擇(截斷字符串)_|花溪论坛,因為那樣會產生錯誤的輸出值(如果你確實需要截斷它-||盈彩在线邀请码,可以使用切割操作_|-八马赛珍珠5800价格,例如_qq炫舞答题答案每日更新:x.ljust(n)[:n] )_锚杆垫板。
還有另一個方法|-断纸机, str.zfill() 它用於向數值的字符串表達左側填充 0|_黄河电视台直播。該函數可以正確理解正負號:
'12'.zfill(5)
'00012'
'-3.14'.zfill(7)
'-003.14'
'3.14159265359'.zfill(5)
'3.14159265359'
方法 str.format() 的基本用法如下:
print('We are the {} who say "{}!"'.format('knights', 'Ni'))
We are the knights who say "Ni!"
大括號和其中的字符會被替換成傳入 str.format() 的參數||_陈梓嘉。大括號中的數值指明使用傳入 str.format() 方法的對象中的哪一個:
print('{0} and {1}'.format('spam', 'eggs'))
spam and eggs
print('{1} and {0}'.format('spam', 'eggs'))
eggs and spam
如果在 str.format() 調用時使用關鍵字參數|2125火影世界,可以通過參數名來引用值:
print('This {food} is {adjective}.'.format(
... food='spam', adjective='absolutely horrible'))
This spam is absolutely horrible.
位置參數和關鍵字參數可以隨意組合:
print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred',
other='Georg'))
The story of Bill, Manfred, and Georg.
'!a' (應用 ascii())||陈志平博客,'!s' (應用 str() )和 '!r' (應用 repr() )可以在格式化之前轉換值:
import math
print('The value of PI is approximately {}.'.format(math.pi))
The value of PI is approximately 3.14159265359.
print('The value of PI is approximately {!r}.'.format(math.pi))
The value of PI is approximately 3.141592653589793.
字段名後允許可選的 ':' 和格式指令_--炫舞双开工具下载。這允許對值的格式化加以更深入的控製--亿发彩票靠谱不。下例將 Pi 轉為三位精度|-淘宝企业开店流程。
import math
print('The value of PI is approximately {0:.3f}.'.format(math.pi))
The value of PI is approximately 3.142.
在字段後的 ':' 後麵加一個整數會限定該字段的最小寬度|-盈彩彩票v258,這在美化表格時很有用:
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
for name, phone in table.items():
... print('{0:10} ==> {1:10d}'.format(name, phone))
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
如果你有個實在是很長的格式化字符串_|青苹果家园系统,不想分割它_|_黑铁酒杯。如果你可以用命名來引用被格式化的變量而不是位置就好了|-高仿古画。有個簡單的方法_||盈彩网pk10计划,可以傳入一個字典-许小年微博,用中括號( '[]' )訪問它的鍵:
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
也可以用 ‘
’ 標誌將這個字典以關鍵字參數的方式傳入:
table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(
*table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
這種方式與新的內置函數 vars() 組合使用非常有效|-2019六香港145期。該函數返回包含所有局部變量的字典_|_李政宰台风。
要進一步了解字符串格式化方法 str.format()__爵迹风津道单行本,參見 格式字符串語法|_-优乐彩网站是真的吗。
7.1.1. 舊式的字符串格式化
操作符 % 也可以用於字符串格式化_|江门首富。它以類似 sprintf()-style 的方式解析左參數-|_160彩票邀请,將右參數應用於此_-|长垣车祸,得到格式化操作生成的字符串-|-乐乐滋,例如:
import math
print('The value of PI is approximately %5.3f.' % math.pi)
The value of PI is approximately 3.142.
更多的信息可以參見 printf-style String Formatting 一節___才子骂小花2。
7.2. 文件讀寫
函數 open() 返回 文件對象-__诺基亚手机真伪查询,通常的用法需要兩個參數|__4466kk:open(filename, mode)--16楼网。
f = open('workfile', 'w')
第一個參數是一個含有文件名的字符串|_童小牛是哪个电视剧。第二個參數也是一個字符串_--永宁公众网,含有描述如何使用該文件的幾個字符-__沈绛红。mode 為 'r' 時表示隻是讀取文件耽美h;'w' 表示隻是寫入文件(已經存在的同名文件將被刪掉)_||裤子尺寸换算;'a' 表示打開文件進行追加-_|歌手2017第三期排名,寫入到文件中的任何數據將自動添加到末尾_|_易彩快3是真的吗。 'r+' 表示打開文件進行讀取和寫入-|_l龙。mode 參數是可選的_-欣荣图片,默認為 'r'|-1分时时彩人工计划。

table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
>>> for name, phone in table.items():
... print('{0:10} ==> {1:10d}'.format(name, phone))
...
Jack ==> 4098
Dcab ==> 7678
Sjoerd ==> 4127
如果你有個實在是很長的格式化字符串--_致富彩票快3,不想分割它|注册送彩的彩票app大全。如果你可以用命名來引用被格式化的變量而不是位置就好了---运盛彩票行大运。有個簡單的方法_-|邱光慈,可以傳入一個字典--_范党育原型,用中括號( '[]' )訪問它的鍵:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; '
'Dcab: {0[Dcab]:d}'.format(table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
也可以用 ‘’ 標誌將這個字典以關鍵字參數的方式傳入:
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
>>> print('Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(
table))
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
這種方式與新的內置函數 vars() 組合使用非常有效---说话犀利是什么意思。該函數返回包含所有局部變量的字典__|湖北专科学校排名。
要進一步了解字符串格式化方法 str.format()__许绍峰,參見 格式字符串語法|_掌上购彩App是不是骗局。
7.1.1. 舊式的字符串格式化
操作符 % 也可以用於字符串格式化_--142期富婆看图肖特。它以類似 sprintf()-style 的方式解析左參數--智彩电子走势图,將右參數應用於此|-_11086时时彩官网电话,得到格式化操作生成的字符串||药酒是哪个朝代,例如:
>>> import math
>>> print('The value of PI is approximately %5.3f.' % math.pi)
The value of PI is approximately 3.142.
更多的信息可以參見 printf-style String Formatting 一節|-亿人娱乐登录csyi。
7.2. 文件讀寫
函數 open() 返回 文件對象_15876计划网时时彩,通常的用法需要兩個參數-36选7好彩1开奖记录:open(filename, mode)--金庸群侠传之苍龙逐日地图。
>>> f = open('workfile', 'w')
第一個參數是一個含有文件名的字符串_||跑狼电动车报价。第二個參數也是一個字符串--银尖宝戟,含有描述如何使用該文件的幾個字符|-|1号娱乐平台下载网址。mode 為 'r' 時表示隻是讀取文件-|_芙蓉中路二手房;'w' 表示隻是寫入文件(已經存在的同名文件將被刪掉)__反间谍工作的主管单位是;'a' 表示打開文件進行追加|-青海卫视直播,寫入到文件中的任何數據將自動添加到末尾-_-阿发祥。 'r+' 表示打開文件進行讀取和寫入_|地窖囚奴。mode 參數是可選的|_青岛洗头房,默認為 'r'-||丧尸国度第四季。
通常--_永盛彩票iOS,文件以 文本 打開|_|长微博工具,這意味著__|我们结婚了泰民停拍,你從文件讀出和向文件寫入的字符串會被特定的編碼方式(默認是UTF-8)編碼___2019哪款app可以买足彩。模式後麵的 'b' 以 二進製模式 打開文件|快乐大本营之棒棒堂:數據會以字節對象的形式讀出和寫入|_-游彩网登录网址。這種模式應該用於所有不包含文本的文件|-观心者胡戈伦。
在文本模式下-_038彩票合法吗147,讀取時默認會將平台有關的行結束符(Unix上是 \n , Windows上是 \r\n)轉換為 \n||_上海蹦极事故。在文本模式下寫入時-_阴阳云,默認會將出現的 \n 轉換成平台有關的行結束符-莱州教育科研网。這種暗地裏的修改對 ASCII 文本文件沒有問題|-李玉刚星光大道月赛,但會損壞 JPEG 或 EXE 這樣的二進製文件中的數據-qq空间情侣模块。使用二進製模式讀寫此類文件時要特別小心_-11086移动彩票怎么样。
7.2.1. 文件對象方法
本節中的示例都默認文件對象 f 已經創建_|-川娇网。
要讀取文件內容-_|航嘉功率计算器,需要調用 f.read(size)|--139彩票怎么关闭了,該方法讀取若幹數量的數據並以字符串形式返回其內容-_宅男躲艳记,size 是可選的數值_永盛娱乐赛车,指定字符串長度-_成都工商局网上年检。如果沒有指定 size 或者指定為負數_-_众博平台登录网址,就會讀取並返回整個文件-__快手福利视频。當文件大小為當前機器內存兩倍時|-助赢计划软件,就會產生問題_-第一财经英强被刑拘。反之_-|金根男爵,會盡可能按比較大的 size 讀取和返回數據||missripley。如果到了文件末尾-_盈彩网计划怎么样,f.read() 會返回一個空字符串(''):
f.read()
'This is the entire file.\n'

f.read()
''
f.readline() 從文件中讀取單獨一行-_2d横版格斗网游,字符串結尾會自動加上一個換行符( \n )--_宋慧乔和玄彬结婚照,隻有當文件最後一行沒有以換行符結尾時||诺基亚6120ci主题下载,這一操作才會被忽略_-|红色警戒2全能王。這樣返回值就不會有混淆_-_殷世航一个月赚多少钱,如果 f.readline() 返回一個空字符串-_罗西尼手表5393,那就表示到達了文件末尾_-哪有那种电影,如果是一個空行-__石家庄43中电话,就會描述為 '\n'-长沙市消防支队,一個隻包含換行符的字符串:
f.readline()
'This is the first line of the file.\n'
f.readline()
'Second line of the file\n'
f.readline()
''
你可以循環遍曆文件對象來讀取文件中的每一行_|_众彩娱乐可以举报吗。這是一種內存高效_血呷、快速|_易富彩票平台,並且代碼簡介的方式:
for line in f:
... print(line, end='')
...
This is the first line of the file.
Second line of the file
如果你想把文件中的所有行讀到一個列表中-|北京黄标车报废补贴,你也可以使用 list(f) 或者 f.readlines()-大中电器客服电话。
f.write(string) 方法將 string 的內容寫入文件_-18136期大乐透开奖结果,並返回寫入字符的長度:
f.write('This is a test\n')
15
想要寫入其他非字符串內容-|强心脏20121127,首先要將它轉換為字符串:
value = ('the answer', 42)
s = str(value)
f.write(s)
18
f.tell() 返回一個整數-kc2005,代表文件對象在文件中的指針位置|camera什么意思,該數值計量了自文件開頭到指針處的比特數---优秀学生干部主要事迹。需要改變文件對象指針話話|-_众博AG平台,使用 f.seek(offset,from_what)__|耳鸣466专家。指針在該操作中從指定的引用位置移動 offset 比特__娱乐天地登录,引用位置由 from_what 參數指定|联想a60手机游戏。 from_what 值為 0 表示自文件起始處開始-优乐彩平台安全吗,1 表示自當前文件指針位置開始__永盛彩票app,2 表示自文件末尾開始|-电视台标志。from_what 可以忽略|__阿卡纳之王,其默認值為零-浪漫刺客片尾曲,此時從文件頭開始:
f = open('workfile', 'rb+')
f.write(b'0123456789abcdef')
16
f.seek(5) # Go to the 6th byte in the file
5
f.read(1)
b'5'
f.seek(-3, 2) # Go to the 3rd byte before the end
13
f.read(1)
b'd'
在文本文件中(沒有以 b 模式打開)励志小说排行榜前十名,隻允許從文件頭開始尋找(有個例外是用 seek(0, 2) 尋找文件的最末尾處)而且合法的 偏移 值隻能是 f.tell() 返回的值或者是零|掌上彩票pro进不去。其它任何 偏移 值都會產生未定義的行為|-cad2004免费版下载。
當你使用完一個文件時_-_敬一丹公开质疑打虎,調用 f.close() 方法就可以關閉它並釋放其占用的所有係統資源--_诺基亚5238微信下载。 在調用 f.close() 方法後-|海豚音那首歌叫什么,試圖再次使用文件對象將會自動失敗|-_靠我。
f.close()
f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
用關鍵字 with 處理文件對象是個好習慣_|_芙蓉中路二手房。它的先進之處在於文件用完後會自動關閉|-|丰田路霸汽车报价,就算發生異常也沒關係||苏州相城红星美凯龙。它是 try-finally 塊的簡寫:
with open('workfile', 'r') as f:
... read_data = f.read()
f.closed
True
文件對象還有一些不太常用的附加方法__超级p57怎么吃,比如 isatty() 和 truncate() 在庫參考手冊中有文件對象的完整指南__阳光工资标准。
7.2.2. 使用 json 存儲結構化數據
從文件中讀寫字符串很容易_|_360彩票彩票走势大全。數值就要多費點兒周折||苏宁电器积分兑换,因為 read() 方法隻會返回字符串||增距,應將其傳入 int() 這樣的函數|新浪亲子,就可以將 '123' 這樣的字符串轉換為對應的數值 123_|_cfve卡枪代码。當你想要保存更為複雜的數據類型||艾艾社区,例如嵌套的列表和字典-|金宝贝取名网,手工解析和序列化它們將變得更複雜_|_3218彩城视频。
好在用戶不是非得自己編寫和調試保存複雜數據類型的代碼_|永盛投资,Python 允許你使用常用的數據交換格式 JSON(JavaScript Object Notation)_-168极速开奖结果。標準模塊 json 可以接受 Python 數據結構-|_重庆ume电影院,並將它們轉換為字符串表示形式|_365彩票怎么买不了?;此過程稱為 序列化-|陕西西凤酒价格表。從字符串表示形式重新構建數據結構稱為 反序列化_无限挑战120121。序列化和反序列化的過程中-_我想看一级片,表示該對象的字符串可以存儲在文件或數據中|_365约彩开奖结果可靠吗,也可以通過網絡連接傳送給遠程的機器_-阿鲁科尔沁绿源网。
Note
JSON 格式經常用於現代應用程序中進行數據交換__蒙牛牛奶图片。許多程序員都已經熟悉它了--_基督教赞美诗歌1218,使它成為相互協作的一個不錯的選擇--易富娱乐。
如果你有一個對象 x__长寿益民网,你可以用簡單的一行代碼查看其 JSON 字符串表示形式:
json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'
dumps() 函數的另外一個變體 dump()||搔脚心漫画,直接將對象序列化到一個文件__-qq炫舞答题答案每日更新。所以如果 f 是為寫入而打開的一個 文件對象__2019时时彩精准计划,我們可以這樣做:

f.write(b'0123456789abcdef')
16
>>> f.seek(5) # Go to the 6th byte in the file
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # Go to the 3rd byte before the end
13
>>> f.read(1)
b'd'
在文本文件中(沒有以 b 模式打開)_-|都匀蓝宇装饰,隻允許從文件頭開始尋找(有個例外是用 seek(0, 2) 尋找文件的最末尾處)而且合法的 偏移 值隻能是 f.tell() 返回的值或者是零_娱乐天地代理。其它任何 偏移 值都會產生未定義的行為___杭州sn。
當你使用完一個文件時_--觅血者,調用 f.close() 方法就可以關閉它並釋放其占用的所有係統資源|政府最新打击云联惠。 在調用 f.close() 方法後||地耳菜,試圖再次使用文件對象將會自動失敗-|许美静 倾城。
>>> f.close()
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: I/O operation on closed file
用關鍵字 with 處理文件對象是個好習慣|_-镇平效能网。它的先進之處在於文件用完後會自動關閉-038com彩票安全吗,就算發生異常也沒關係_-|小时代电影票价。它是 try-finally 塊的簡寫:
>>> with open('workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
文件對象還有一些不太常用的附加方法|-|全际通物流,比如 isatty() 和 truncate() 在庫參考手冊中有文件對象的完整指南_-马杰克。
7.2.2. 使用 json 存儲結構化數據
從文件中讀寫字符串很容易|-何瑶照片。數值就要多費點兒周折__古蔺教育网,因為 read() 方法隻會返回字符串-|22选5河南最新开奖公告,應將其傳入 int() 這樣的函數-|_建始网留言板,就可以將 '123' 這樣的字符串轉換為對應的數值 123-|_快板网。當你想要保存更為複雜的數據類型|-2014新股发行一览表,例如嵌套的列表和字典___陈默的新浪微博,手工解析和序列化它們將變得更複雜|-|开店程序。
好在用戶不是非得自己編寫和調試保存複雜數據類型的代碼|--106彩票是不是正规的,Python 允許你使用常用的數據交換格式 JSON(JavaScript Object Notation)|-妇女的定义。標準模塊 json 可以接受 Python 數據結構|-青岛31中,並將它們轉換為字符串表示形式|陈莎莎个人资料;此過程稱為 序列化--132彩票是正规平台么。從字符串表示形式重新構建數據結構稱為 反序列化__360怎么设置主页。序列化和反序列化的過程中-|_色中色账号,表示該對象的字符串可以存儲在文件或數據中|_|移动3g套餐资费,也可以通過網絡連接傳送給遠程的機器-_运盛彩票行大运赢天下。
Note
JSON 格式經常用於現代應用程序中進行數據交換|-花语梦之恋人。許多程序員都已經熟悉它了_|河北中基吧,使它成為相互協作的一個不錯的選擇--|众发娱乐注册下载不了。
如果你有一個對象 x|__好看的电影你懂的,你可以用簡單的一行代碼查看其 JSON 字符串表示形式:
>>> json.dumps([1, 'simple', 'list'])
'[1, "simple", "list"]'
dumps() 函數的另外一個變體 dump()-_造梦西游3号源怎么用,直接將對象序列化到一個文件--小狼狗心水论坛。所以如果 f 是為寫入而打開的一個 文件對象|--盈彩网是真的吗,我們可以這樣做:
json.dump(x, f)
為了重新解碼對象_|苏州怡园,如果 f 是為讀取而打開的 文件對象:
x = json.load(f)
這種簡單的序列化技術可以處理列表和字典-__满月部屋13,但序列化任意類實例為 JSON 需要一點額外的努力-大中电器总部电话。 json 模塊的手冊對此有詳細的解釋__长治教育信息网。
See also
pickle - pickle 模塊
與 JSON 不同-祥康快车王晗,pickle 是一個協議|-晶体敌百虫,它允許任意複雜的 Python 對象的序列化__|胡悦yue。因此--众赢国际下载,它隻能用於 Python 而不能用來與其他語言編寫的應用程序進行通信|_|众博平台登录网址。默認情況下它也是不安全的|花儿乐队好听的歌:如果數據由熟練的攻擊者精心設計_移动彩票注册, 反序列化來自一個不受信任源的 pickle 數據可以執行任意代碼||_新泽西护栏。

  1. 錯誤和異常
    至今為止還沒有進一步的談論過錯誤信息-|好研网,不過在你已經試驗過的那些例子中_18彩彩票网站,可能已經遇到過一些_苦瓜减肥茶。Python 中(至少)有兩種錯誤---盈和国际:語法錯誤和異常( syntax errors 和 exceptions )_--马云投资云联惠5000亿。
    8.1. 語法錯誤
    語法錯誤_|陈梓嘉,也被稱作解析錯誤_|盐城一中贴吧,也許是你學習 Python 過程中最常見抱怨:

while True print('Hello world')
File "<stdin>", line 1, in ?
while True print('Hello world')
^
SyntaxError: invalid syntax
語法分析器指出錯誤行-_苏州报恩寺,並且在檢測到錯誤的位置前麵顯示一個小“箭頭”-|中科彩票下载。 錯誤是由箭頭 前麵 的標記引起的(或者至少是這麼檢測的)-|-云联惠最新消息: 這個例子中-|11086分分彩,函數 print() 被發現存在錯誤|盈彩网站首页,因為它前麵少了一個冒號( ':' )--nba2k online辅助。 錯誤會輸出文件名和行號_圆通400电话多少,所以如果是從腳本輸入的你就知道去哪裏檢查錯誤了|_|33选7走势图综合。
8.2. 異常
即使一條語句或表達式在語法上是正確的___空运狗狗多少钱,當試圖執行它時也可能會引發錯誤__青田信息港。運行期檢測到的錯誤稱為 異常__花样少女是多大,並且程序不會無條件的崩潰_--要听h的话:很快__-助赢计划官网,你將學到如何在 Python 程序中處理它們_|陕西2套都市快报。然而-|_爱维侦察 地址,大多數異常都不會被程序處理|_尊彩app下载苹果,像這裏展示的一樣最終會產生一個錯誤信息:
10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: int division or modulo by zero
4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
'2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: Can't convert 'int' object to str implicitly
錯誤信息的最後一行指出發生了什麼錯誤_|_苍井空作品 百度云。異常也有不同的類型-_|001彩票网站,異常類型做為錯誤信息的一部分顯示出來_-|132彩票在线:示例中的異常分別為 零除錯誤( ZeroDivisionError ) -|_金梅子,命名錯誤( NameError) 和 類型錯誤( TypeError )-|俄罗斯男排。打印錯誤信息時_-电影天堂快车下载,異常的類型作為異常的內置名顯示||_康鸥移动电源怎么样。對於所有的內置異常都是如此--|励志网名大全2013最新版的,不過用戶自定義異常就不一定了(盡管這是一個很有用的約定)-||008彩票论坛ii。標準異常名是內置的標識(沒有保留關鍵字)_|-众博棋牌下载安装官网。
這一行後一部分是關於該異常類型的詳細說明-_注册彩金送38,這意味著它的內容依賴於異常類型|_-注册送28元体验金app彩票。
錯誤信息的前半部分以堆棧的形式列出異常發生的位置|_|南通电影。通常在堆棧中列出了源代碼行_|2698头彩网,然而|_易中彩票代玩账号兼职,來自標準輸入的源碼不會顯示出來_|杨幂被灌醉性侵全图。
內置的異常 列出了內置異常和它們的含義房室交叉。
8.3. 異常處理
通過編程處理選擇的異常是可行的||丽谯楼。看一下下麵的例子_--公羊羽:它會一直要求用戶輸入_-_106彩票官网,直到輸入一個合法的整數為止-|_康恒保险,但允許用戶中斷這個程序(使用 Control-C 或係統支持的任何方法)_|诺基亚5320xm软件。注意|135彩票是正规网站吗:用戶產生的中斷會引發一個 KeyboardInterrupt 異常-_-08vip。
while True:
... try:
... x = int(input("Please enter a number: "))
... break
... except ValueError:
... print("Oops! That was no valid number. Try again...")
...
try 語句按如下方式工作_安全部邱进。
首先|-01彩票,執行 try 子句 (在 try 和 except 關鍵字之間的部分)||娱乐天地客服联系不上。
如果沒有異常發生|-满舒克的小站, except 子句 在 try 語句執行完畢後就被忽略了||娱乐天地有手机版本吗。
如果在 try 子句執行過程中發生了異常||-093彩票网站,那麼該子句其餘的部分就會被忽略_-英雄联盟定级赛规则。
如果異常匹配於 except 關鍵字後麵指定的異常類型__-nokia翻盖手机,就執行對應的except子句-|nba2k online 外挂。然後繼續執行 try 語句之後的代碼--11086移动彩票app。
如果發生了一個異常__爵迹风津道14,在 except 子句中沒有與之匹配的分支_-剑灵李素梅在哪,它就會傳遞到上一級 try 語句中__-舒城交友。
如果最終仍找不到對應的處理語句|_-科幻片排行榜,它就成為一個 未處理異常|_105彩票网,終止程序運行|105彩票平台正规吗,顯示提示信息|移动彩票官11086。
一個 try 語句可能包含多個 except 子句--苏州联建科技倒闭,分別指定處理不同的異常-078彩票正规吗。至多隻會有一個分支被執行-|_26岁毒贩获死刑。異常處理程序隻會處理對應的 try 子句中發生的異常||劫后余生3 9,在同一個 try 語句中-_南京滨江开发区招聘,其他子句中發生的異常則不作處理_|-厦门宏基笔记本维修。一個 except 子句可以在括號中列出多個異常的名字|正品普拉达,例如:
... except (RuntimeError, TypeError, NameError):
... pass
最後一個 except 子句可以省略異常名稱-_陈德铭去向,以作為通配符使用__龙炎电商非法集资。你需要慎用此法|||306官方彩票内地版,因為它會輕易隱藏一個實際的程序錯誤_|_抽油机模型!可以使用這種方法打印一條錯誤信息|_卡通战争破解版,然後重新拋出異常(允許調用者處理這個異常):
import sys

try:
f = open('myfile.txt')
s = f.readline()
i = int(s.strip())
except OSError as err:
print("OS error: {0}".format(err))
except ValueError:
print("Could not convert data to an integer.")
except:
print("Unexpected error:", sys.exc_info()[0])
raise
try ... except 語句可以帶有一個 else子句-|_盈盈彩是赌博吗,該子句隻能出現在所有 except 子句之後---历届德甲冠军。當 try 語句沒有拋出異常時--pk 3调试,需要執行一些代碼|__丁丁和杨坤后场接吻,可以使用這個子句_长江电力电子商务。例如:
for arg in sys.argv[1:]:
try:
f = open(arg, 'r')
except IOError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
使用 else 子句比在 try 子句中附加代碼要好-_街头篮球葡萄登陆器,因為這樣可以避免 try ... except 意外的截獲本來不屬於它們保護的那些代碼拋出的異常-||众博棋牌骗了我二十万。
發生異常時--鹿喜微七天断食,可能會有一個附屬值|-优惠券打印机,作為異常的 參數 存在-_|256平台彩票什么情况。這個參數是否存在-涨潮时间、是什麼類型_--小爸爸拍摄地点,依賴於異常的類型_-苗老表。
在異常名(列表)之後|--反间谍工作的主管单位是什么,也可以為 except 子句指定一個變量__中国达人秀年度盛典。這個變量綁定於一個異常實例_||央视春节晚会,它存儲在 instance.args 的參數中106平台时时彩。為了方便起見-|光明农场好玩吗,異常實例定義了 str() _|迪吧现场图片,這樣就可以直接訪問過打印參數而不必引用 .args-__陈思远新浪微博。這種做法不受鼓勵|_-穆勒故意跪倒。相反_|1号彩票网APP,更好的做法是給異常傳遞一個參數(如果要傳遞多個參數-|_重庆信鸽信息网,可以傳遞一個元組)|-张玉其,把它綁定到 message 屬性_-|阮加根。一旦異常發生_菲亚斯,它會在拋出前綁定所有指定的屬性_-莱州教育科研网。

try:
... raise Exception('spam', 'eggs')
... except Exception as inst:
... print(type(inst)) # the exception instance
... print(inst.args) # arguments stored in .args
... print(inst) # str allows args to be printed directly,
... # but may be overridden in exception subclasses
... x, y = inst.args # unpack args
... print('x =', x)
... print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
對於那些未處理的異常_--男士眼霜,如果一個它們帶有參數||qq2011下载正式版免费下载,那麼就會被作為異常信息的最後部分(“詳情”)打印出來___东北二嫂水仙磁力下载。
異常處理器不僅僅處理那些在 try 子句中立刻發生的異常-_-云顶国际赌场,也會處理那些 try 子句中調用的函數內部發生的異常_||移动手机怎么开通黄钻。例如:
def this_fails():
... x = 1/0
...
try:
... this_fails()
... except ZeroDivisionError as err:
... print('Handling run-time error:', err)
...
Handling run-time error: int division or modulo by zero
8.4. 拋出異常
raise 語句允許程序員強製拋出一個指定的異常__|元素太初。例如:
raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
要拋出的異常由 raise 的唯一參數標識|_长城p800。它必需是一個異常實例或異常類(繼承自 Exception 的類)_-|暴龙摩托车价格。
如果你需要明確一個異常是否拋出||234彩票是合法的吗,但不想處理它|-|106彩票官网,raise 語句可以讓你很簡單的重新拋出該異常:
try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
8.5. 用戶自定義異常
在程序中可以通過創建新的異常類型來命名自己的異常(Python 類的內容請參見 類 )_|qq2009官方下载正式版。異常類通常應該直接或間接的從 Exception 類派生|__甘萍简历,例如:
class MyError(Exception):
... def init(self, value):
... self.value = value
... def str(self):
... return repr(self.value)
...
try:
... raise MyError(22)
... except MyError as e:
... print('My exception occurred, value:', e.value)
...
My exception occurred, value: 4
raise MyError('oops!')
Traceback (most recent call last):

('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
對於那些未處理的異常__|小丑娃娃,如果一個它們帶有參數-_078彩票推荐人,那麼就會被作為異常信息的最後部分(“詳情”)打印出來-|_118彩图库和118论坛网址大全。
異常處理器不僅僅處理那些在 try 子句中立刻發生的異常_-3分快三是官方的吗,也會處理那些 try 子句中調用的函數內部發生的異常__铁三角atht50。例如:
>>> def this_fails():
... x = 1/0
...
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print('Handling run-time error:', err)
...
Handling run-time error: int division or modulo by zero
8.4. 拋出異常
raise 語句允許程序員強製拋出一個指定的異常-|东莞酒店一条龙服务。例如:
>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: HiThere
要拋出的異常由 raise 的唯一參數標識_--阿坝州人事网。它必需是一個異常實例或異常類(繼承自 Exception 的類)-众购彩票手机app下载。
如果你需要明確一個異常是否拋出-_-河北保定38军,但不想處理它_-360购彩大厅怎么样,raise 語句可以讓你很簡單的重新拋出該異常:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in ?
NameError: HiThere
8.5. 用戶自定義異常
在程序中可以通過創建新的異常類型來命名自己的異常(Python 類的內容請參見 類 )__|锦龙堂。異常類通常應該直接或間接的從 Exception 類派生__今日股市行情查询,例如:
>>> class MyError(Exception):
... def init(self, value):
... self.value = value
... def str(self):
... return repr(self.value)
...
>>> try:
... raise MyError(2
2)
... except MyError as e:
... print('My exception occurred, value:', e.value)
...
My exception occurred, value: 4
>>> raise MyError('oops!')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
main.MyError: 'oops!'
在這個例子中_|陕西二套都市快报,Exception 默認的 init() 被覆蓋|_韩仙子。新的方式簡單的創建 value 屬性-|35选7大星走势图。這就替換了原來創建 args 屬性的方式|-|刷qb软件。
異常類中可以定義任何其它類中可以定義的東西|张一山股票视频下载,但是通常為了保持簡單|-_金冷降温理疗袋,隻在其中加入幾個屬性信息-|盈彩二维码,以供異常處理句柄提取_|kingroot pc官网。如果一個新創建的模塊中需要拋出幾種不同的錯誤時||河马家老总,一個通常的作法是為該模塊定義一個異常基類-|_易购彩票安全不安全,然後針對不同的錯誤類型派生出對應的異常子類:
class Error(Exception):
"""Base class for exceptions in this module."""
pass

class InputError(Error):
"""Exception raised for errors in the input.

Attributes:
    expression -- input expression in which the error occurred
    message -- explanation of the error
"""

def __init__(self, expression, message):
    self.expression = expression
    self.message = message

class TransitionError(Error):
"""Raised when an operation attempts a state transition that's not
allowed.

Attributes:
    previous -- state at beginning of transition
    next -- attempted new state
    message -- explanation of why the specific transition is not allowed
"""

def __init__(self, previous, next, message):
    self.previous = previous
    self.next = next
    self.message = message

與標準異常相似_|_金陵科技学院地址,大多數異常的命名都以 “Error” 結尾-|_静水天平。
很多標準模塊中都定義了自己的異常-||维尚律声,用以報告在他們所定義的函數中可能發生的錯誤_-_易购彩票。關於類的進一步信息請參見 類 一章|_何小萌萌萌微博。
8.6. 定義清理行為
try 語句還有另一個可選的子句-_御诚电脑配件,目的在於定義在任何情況下都一定要執行的功能---这五个人要火了照片。例如:

try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
KeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 2, in ?
不管有沒有發生異常__-舞团之心,finally子句 在程序離開 try 後都一定會被執行|-n81软件下载。當 try 語句中發生了未被 except 捕獲的異常(或者它發生在 except 或 else 子句中)|霞飞路28号,在 finally 子句執行完後它會被重新拋出_广州阳光家缘网。 try 語句經由 break -_-非常了得陈星光,continue 或 return 語句退 出也一樣會執行 finally 子句-|南华苑路。以下是一個更複雜些的例子:
def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
...
divide(2, 1)
result is 2
executing finally clause
divide(2, 0)
division by zero!
executing finally clause
divide("2", "1")
executing finally clause
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "<stdin>", line 3, in divide
TypeError: unsupported operand type(s) for /: 'str' and 'str'
如你所見qqkongjiankelong, finally 子句在任何情況下都會執行__-与狼共舞oa。TypeError 在兩個字符串相除的時候拋出-_|云购梦想,未被 except 子句捕獲--小狼狗高手论坛,因此在 finally 子句執行完畢後重新拋出-|娱乐天地代理。
在真實場景的應用程序中-狼人 狼嚎再起,finally 子句用於釋放外部資源(文件 或網絡連接之類的)-1010cc时时彩票安卓版,無論它們的使用過程中是否出錯||吹情药。
8.7. 預定義清理行為
有些對象定義了標準的清理行為|-众赢彩票计划软件手机,無論對象操作是否成功_||中诚快递网点查询,不再需要該對象的時候就會起作用-_-帕斯卡显卡。以下示例嚐試打開文件並把內容打印到屏幕上__168娱乐2。
for line in open("myfile.txt"):
print(line)
這段代碼的問題在於在代碼執行完後沒有立即關閉打開的文件|||盐都区政府。這在簡單的腳本裏沒什麼|病毒杀手,但是大型應用程序就會出問題_|北京466耳鼻咽喉医院。with 語句使得文件之類的對象可以 確保總能及時準確地進行清理||_永盛投资。
with open("myfile.txt") as f:
for line in f:
print(line)
語句執行後|赢天下彩与你开奖同行,文件 f 總會被關閉--150期马会资料,即使是在處理文件中的數據時出錯也一樣-衡水老白干72度。其它對象是否提供了預定義的清理行為要查看它們的文檔|||欧式蒙牛奶粉事件。


  1. Python 的類機製通過最小的新語法和語義在語言中實現了類--|五个人出名了。它是 C++ 或者 Modula-3 語言中類機製的混合_|scc江智背景。就像模塊一樣__众赢国际下载,Python 的類並沒有在用戶和定義之間設立絕對的屏障_|英雄联盟定级赛规则,而是依賴於用戶不去“強行闖入定義”的優雅_--阿美珍珠微博。另一方麵|-青岛米娜婚纱摄影,類的大多數重要特性都被完整的保留下來__霍启仁antonia:類繼承機製允 許多重繼承__无氨显影液,派生類可以覆蓋(override)基類中的任何方法或類_--盈彩被骗,可以使用相同的方法名稱調用基類的方法_通辽刘大鹏。對象可以包含任意數量的私有數據__|许昌三中校服。
    用 C++ 術語來講-_|掌上永辉下载,所有的類成員(包括數據成員)都是公有( public )的(其它情況見下文 私有變量)-_天天酷跑大猫头,所有的成員函數都是虛( virtual )的_-超级演说家总决赛。用 Modula-3 的術語來講-_环球智控网,在成員方法中沒有簡便的方式引用對象的成員-常熟新闻:方法函數在定義時需要以引用的對象做為第一個參數___105彩票官网281,調用時則會隱式引用對象|割让台湾。像在 Smalltalk 中一個花印药妆,類也是對象|至尊无名。這就提供了導入和重命名語義_至尊彩安下载安装苹果。不像 C++ 和 Modula-3 中那樣||-苦咖啡邓杰,大多數帶有特殊語法的內置操作符(算法運算符-_针织带、下標等)都可以針對類的需要重新定義__-银河时时彩。
    在討論類時_萧瑟流光,沒有足夠的得到共識的術語|2018白菜网论坛,我會偶爾從 Smalltalk 和 C++ 借用一些-26岁毒贩获死刑。我比較喜歡用 Modula-3 的用語-_本月牌照,因為比起 C++_殷佳心,Python 的麵向對象語法更像它-_铁粉吧,但是我想很少有讀者聽過這個|青岛华臣电影城。
    9.1. 術語相關
    對象具有特性-36元彩票赚钱,並且多個名稱(在多個作用於中)可以綁定在同一個對象上_-|长江电力商务网。在其它語言中被稱為別名-爸爸的木朵。在對 Python 的第一印象中這通常會被忽略|-_优游平台登录地址,並且當處理不可變基礎類型(數字__-空间留言代码爱情,字符串-|分宜租房网,元組)時可以被放心的忽略-|阿斯玛 阿萨德。但是||纳雍党建网,在調用列表_-_搞笑试卷、字典這類可變對象|云顶娱乐现金版斗地主,或者大多數程序 外部類型(文件-_永盛彩票赢了不给钱,窗體等)描述實體時|_菊丸英二bg,別名對 Python 代碼的語義便具有(有意而為)影響|_|亿万彩票APP平台合法吗?。這通常有助於程序的優化|强度电影,因為在某些方麵別名表現的就像是指針__幼香阁网址。例如-|下载qq2011正式版免费下载,你可以輕易的傳遞一個對象--鞍山职教城,因為通過繼承隻是傳 遞一個指針|-360彩票安全购彩。並且如果一個方法修改了一個作為參數傳遞的對象||金够败,調用者可以接收這一變化——這消除了兩種不同的參數傳遞機製的需要|_|苏明星,像 Pascal 語言-|坛缘坊。
    9.2. Python 作用域和命名空間
    在介紹類之前|--视觉卡盟,我首先介紹一些有關 Python 作用域的規則|_朱云来的妻子。類的定義非常巧妙的運用了命名空間__重庆李俊案,要完全理解接下來的知識_-_乔氏活络宝,需要先理解作用域和命名空間的工作原理|--西餐团购。另外_-_我们结婚了泰民停拍,這一切的知識對於任何高級 Python 程序員都非常有用_圆管规格表。
    讓我們從一些定義說起--_安桥506。
    命名空間 是從命名到對象的映射_-易彩集团靠谱吗?。當前命名空間主要是通過 Python 字典實現的_-_掌上彩票官方版下载,不過通常不關心具體的實現方式(除非出於性能考慮)__-镇江老兵事件最新进展,以後也有可能會改變其實現方式||男扮女装过程。以下有一些命名空間的例子_-|7看7k:內置命名(像 abs() 這樣的函數||弹珠传说玩具,以及內置異常名)集__|齐齐哈尔大学校内网,模塊中的全局命名|_138影视,函數調用中的局部命名__csol防沉迷。某種意義上講對象的屬性集也是一個命名空間_|01彩票官方APP。關於命名空間需要了解的一件很重要的事就是不同命名空間中的命名沒有任何聯係|-河北职称信息管理系统,例如兩個不同的模塊可能都會定義一個名為 maximize 的函數而不會發生混淆-用戶必須以模塊名為前綴來引用它們_鬼域国语。
    順便提一句_--陈氏太极拳教程,我稱 Python 中任何一個“.”之後的命名為 屬性 --例如|__优选彩票是什么,表達式 z.real 中的 real 是對象 z 的一個屬性财经郎眼 余额宝。嚴格來講365彩票,從模塊中引用命名是引用屬性|-01彩票ios:表達式 modname.funcname 中__陈奎元简历,modname 是一個模塊對象_电影节目表,funcname 是它的一個屬性||畅宜左旋肉碱。因此_-刘教授甩葱歌,模塊的屬性和模塊中的全局命名有直接的映射關係-_长沙王府井影城:它們共享同一命名空間_-|众亿彩票被骗![1]
    屬性可以是隻讀過或寫的亿盈彩票骗局。後一種情況下_|迪丽热巴怀孕大肚照,可以對屬性賦值-|-黑暗之光伴奏。你可以這樣作||_松原启众网: modname.the_answer = 42 _-人形何首乌。可寫的屬性也可以用 del 語句刪除_||优乐彩提不给提现。例如--亿彩彩票可以提现吗: del modname.the_answer 會從 modname 對象中刪除 the_answer 屬性_|宋慧乔李秉宪。
    不同的命名空間在不同的時刻創建|||云顶娱乐棋牌游戏ios,有不同的生存期___川师附中吧。包含內置命名的命名空間在 Python 解釋器啟動時創建|||106官网彩票106版,會一直保留__ok数据网,不被刪除-_阿拉酷。模塊的全局命名空間在模塊定義被讀入時創建___徐子淇八字,通常|-28彩票是正规的吗,模塊命名空間也會一直保存到解釋器退出-_来个身份证号码。由解釋器在最高層調 用執行的語句-雷文加点,不管它是從腳本文件中讀入還是來自交互式輸入_-cfve修改器怎么过安,都是 main 模塊的一部分-自动捆扎机,所以它們也擁有自己的命名空間(內置命名也同樣被包含在一個模塊中|-|重生的博穆博果尔,它被稱作 builtins )||-o记实录刑警。
    當調用函數時--_华硕f83s,就會為它創建一個局部命名空間|陈翔qq群,並且在函數返回或拋出一個並沒有在函數內部處理的異常時被刪除|11选五任选7胆拖表。(實際上||九九归一打一生肖,用遺忘來形容到底發生了什麼更為貼切--萌节。)當然__www hzxxt com,每個遞歸調用都有自己的局部命名空間||_北京爱情故事吕夏。
    作用域 就是一個 Python 程序可以直接訪問命名空間的正文區域--长武网。這裏的直接訪問意思是一個對名稱的錯誤引用會嚐試在命名空間內查找-_-雷州壹网。盡管作用域是靜態定義||亿客隆pk10,在使用時他們都是動態的__诺基亚5238刷机。每次執行時-|14胜负彩,至少有三個命名空間可以直接訪問的作用域嵌套在一起-_小提琴座套:
    包含局部命名的使用域在最裏麵__|仲博彩票,首先被搜索||_天津津工超市火车票代售点;其次搜索的是中層的作用域_|凹凸绕梁三日,這裏包含了同級的函數|-|坐即瘦;
    最後搜索最外麵的作用域|-|金清二中,它包含內置命名|||锈水财阀战袍。
    首先搜索最內層的作用域|-_168开奖网APP,它包含局部命名任意函數包含的作用域||锤子rom小米1s,是內層嵌套作用域搜索起點--|铜皮厚度,包含非局部_银河娱乐为何登录不上,但是也非全局的命名
    接下來的作用域包含當前模塊的全局命名
    最外層的作用域(最後搜索)是包含內置命名的命名空間
    如果一個命名聲明為全局的_-_2580彩票,那麼對它的所有引用和賦值會直接搜索包含這個模塊全局命名的作用域|_-阜康市地图。如果要重新綁定最裏層作用域之外的變量__-新晃红网百姓呼声,可以使用 nonlocal 語句__锦州有线宽带;如果不聲明為 nonlocal__永盛彩票导航,這些變量將是隻讀的(對這樣的變量賦值會在最裏麵的作用域創建一個新的局部變量|_航班查询携程,外部具有相同命名的那個變量不會改變)||雅马哈r1报价。
    通常-__南昌商学院教务网,局部作用域引用當前函數的命名-公爵多少钱。在函數之外__格瑞特月神学院,局部作用域與全局使用域引用同一命名空間|四家中乙队欠薪:模塊命名空間--|娱乐天地彩票。類定義也是局部作用域中的另一個命名空間|-|长红彩票店。
    重要的是作用域決定於源程序的意義-|-360彩票走势图大全:一個定義於某模塊中的函數的全局作用域是該模塊的命名空間--|解方程计算器,而不是該函數的別名被定義或調用的位置_-东港宋老六,了解這一點 非常重要||_许晋龙。另一方麵_-_花溪论坛,命名的實際搜索過程是動態的|春节节目,在運行時確定的——然而|-妖精的尾巴洒洒,Python 語言也在不斷發展__-金橘花剧情,以後有可能會成為靜態的“編譯”時確定_-狗儿山上的八路军,所以不要依賴動態解析-|_里番a c g!(事實上|_黄牛课件网,局部變量已經是靜態確定了--ups快递招聘。)
    Python 的一個特別之處在於||-永盛国际重庆时时:如果沒有使用 global 語法||_57bt龙发布,其賦值操作總是在最裏層的作用域-||国家医考网登录入口。賦值不會複製數據-|198彩票平台,隻是將命名綁定到對象--金地荔湖城业主论坛。刪除也是如此|_众赢彩票投注:del x 隻是從局部作用域的命名空間中刪除命名 x -||天津热线adsl。事實上_-在线双升,所有引入新命名的操作都作用於局部作用域-英仙座remix。特別是 import 語句和函數定將模塊名或函數綁定於局部作用域(可以使用 global 語句將變量引入到全局作用域)-|_水族之家zadull。
    global 語句用以指明某個特定的變量為全局作用域_-19500彩票网苹果版,並重新綁定它||_360全国彩票开奖号码。nonlocal 語句用以指明某個特定的變量為封閉作用域-_石家庄紫萱保健按摩,並重新綁定它|||江苏盐城技师学院。
    9.2.1. 作用域和命名空間示例
    以下是一個示例_|阜阳卫生局,演示了如何引用不同作用域和命名空間_|亿客隆彩票官网,以及 global 和 nonlocal 如何影響變量綁定:
    def scope_test():
    def do_local():
    spam = "local spam"
    def do_nonlocal():
    nonlocal spam
    spam = "nonlocal spam"
    def do_global():
    global spam
    spam = "global spam"
    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)
以上示例代碼的輸出為:
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
注意-_鹿喜微七天断食:local 賦值語句是無法改變 scope_test 的 spam 綁定|-重庆食品舞厅。nonlocal 賦值語句改變了 scope_test 的 spam 綁定|_东北二嫂水仙车震ed2k,並且 global 賦值語句從模塊級改變了 spam 綁定--芝兰粉。
你也可以看到在 global 賦值語句之前對 spam 是沒有預先綁定的_-|陈奎元。
9.3. 初識類
類引入了一些新語法|_|和龙政务信息网:三種新的對象類型和一些新的語義_|觅食的意思。
9.3.1. 類定義語法
類定義最簡單的形式如下:
class ClassName:
<statement-1>
.
.
.
<statement-N>
類的定義就像函數定義( def 語句)_|射雕之乞儿传说,要先執行才能生效|-掌上大赢家时时彩。(你當然可以把它放進 if 語句的某一分支-_-认识国旗,或者一個函數的內部_|_静音飞翼龙。)
習慣上-_-衣尚网,類定義語句的內容通常是函數定義__-卓易彩票怎么用不了,不過其它語句也可以___优衣库11分24秒视频,有時會很有用_重庆永川经贸学院,後麵我們再回過頭來討論|-易赢彩票骗局。類中的函數定義通常包括了一個特殊形式的參數列表_|-长沙口碑网租房,用於方法調用約定——同樣我們在後麵討論這些-_155是移动的吗。
進入類定義部分後-_-铁梨花41,會創建出一個新的命名空間_|-106官方彩票注册,作為局部作用域__闽江学院教务系统。因此_--银色黎明声望怎么刷,所有的賦值成為這個新命名空間的局部變量-||金宝贝取名软件破解版。特別是函數定義在此綁定了新的命名-|火票网。
類定義完成時(正常退出)|_注册送28彩金不限ip,就創建了一個 類對象|染衣培训。基本上它是對類定義創建的命名空間進行了一個包裝_|197彩票平台;我們在下一節進一步學習類對象的知識--|106彩票。原始的局部作用域(類定義引入之前生效的那個)得到恢複|众盈网彩票安全吗,類對象在這裏綁定到類定義頭部的類名(例子中是 ClassName )-_众乐彩票APP。
9.3.2. 類對象
類對象支持兩種操作_-助赢软件手机版有吗:屬性引用和實例化---小狼狗高手论坛。
屬性引用 使用和 Python 中所有的屬性引用一樣的標準語法|_掌上红云下载:obj.name--火瀑吧。類對象創建後_龙炎电商开启财富自由人生,類命名空間中所有的命名都是有效屬性名__勇士vs步行者。所以如果類定義是這樣:
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
那麼 MyClass.i 和 MyClass.f 是有效的屬性引用-|_高考几天时间,分別返回一個整數和一個方法對象__|qq2011最新版官方下载。也可以對類屬性賦值|_绕梁三日作品,你可以通過給 MyClass.i 賦值來修改它-|唐易康官网。 doc 也是一個有效的屬性--挠脚心动漫图,返回類的文檔字符串||易点彩票手机版双色球:"A simple example class"_|往日时光吉他谱。
類的 實例化 使用函數符號|--二重重装。隻要將類對象看作是一個返回新的類實例的無參數函數即可-_july缩写。例如(假設沿用前麵的類):
x = MyClass()
以上創建了一個新的類 實例 並將該對象賦給局部變量 x-_注册送100彩金。
這個實例化操作(“調用”一個類對象)來創建一個空的對象_农业银行黄金价格。很多類都傾向於將對象創建為有初始狀態的_-脸部美容手法视频。因此類可能會定義一個名為 init() 的特殊方法__长春房地产报房源,像下麵這樣:
def init(self):
self.data = []
類定義了 init() 方法的話_|尊龙娱乐人生就是赌,類的實例化操作會自動為新創建的類實例調用 init() 方法-_亿彩彩票不能提现了。所以在下例中||_卓易彩票是不是没有了,可以這樣創建一個新的實例:
x = MyClass()
當然_-_易富彩票官网,出於彈性的需要||台湾雅虎奇摩首页,init() 方法可以有參數__|至尊争霸怎样充值。事實上__-众发彩票违法吗,參數通過 init() 傳遞到類的實例化操作上--30码期期必中特。例如||动作猜谜游戏,

class Complex:
... def init(self, realpart, imagpart):
... self.r = realpart
... self.i = imagpart
...
x = Complex(3.0, -4.5)
x.r, x.i
(3.0, -4.5)
9.3.3. 實例對象
現在我們可以用實例對象作什麼-||锤子rom小米1s?實例對象唯一可用的操作就是屬性引用_|-1号彩。有兩種有效的屬性名_-相逢是首歌简谱。
數據屬性 相當於 Smalltalk 中的“實例變量”或 C++ 中的“數據成員”--挠脚心动漫图。和局部變量一樣-|-昨夜裙带解,數據屬性不需要聲明-_掌上彩票没有了,第一次使用時它們就會生成|青田封门青。例如-_钟秀全,如果 x 是前麵創建的 MyClass 實例_|仲博平台会不会黑钱啊,下麵這段代碼會打印出 16 而在堆棧中留下多餘的東西:
x.counter = 1
while x.counter < 10:
x.counter = x.counter * 2
print(x.counter)
del x.counter
另一種為實例對象所接受的引用屬性是 方法|-印度电视剧新娘第五部。方法是“屬於”一個對象的函數|-320彩票。(在 Python 中-_-木层网,方法不止是類實例所獨有|-_cctv6 直播:其它類型的對象也可有方法_|钻石刷q币。例如--阿巴克大帝,鏈表對象有 append|_多特软件站单机游戏,insert|众购彩票网站,remove|369彩票,sort 等等方法_218四柱彩测图。然而qq2011版本,在後麵的介紹中|-_玉子金童,除非特別說明_|许昌胖子店,我們提到的方法特指類方法)
實例對象的有效名稱依賴於它的類--_掌上彩票骗局。按照定義||衡水电影,類中所有(用戶定義)的函數對象對應它的實例中的方法-|_2015gdp世界排名。所以在我們的例子中__|江陵肃父母是谁,x.f 是一個有效的方法引用|_|粥面故事,因為 MyClass.f 是一個函數_蓝工房。但 x.i 不是||芭芭卡伦,因為 MyClass.i 不是函數-|艾尔之光狂心武者。不過 x.f 和 MyClass.f 不同--038彩票ios下载,它是一個 方法對象 ___印度新娘之无悔的爱,不是一個函數對象|-_抓住偷水贼。
9.3.4. 方法對象
通常-2019十大彩票黑网,方法通過右綁定方式調用:
x.f()
在 MyClass 示例中|-_135彩票诈骗,這會返回字符串 'hello world'_诛仙入魔任务流程。然而_360彩票网官网60彩票,也不是一定要直接調用方法|-31选7走势图福建省。 x.f 是一個方法對象|_众盈娱乐靠谱吗?,它可以存儲起來以後調用_-12 8事件。例如:
xf = x.f
while True:
print(xf())
會不斷的打印 hello world-||晶体敌百虫。
調用方法時發生了什麼-_李乐伟?你可能注意到調用 x.f() 時沒有引用前麵標出的變量||_云购彩票YG888COM,盡管在 f() 的函數定義中指明了一個參數_进口摩托车市场。這個參數怎麼了|长汀南禅寺?事實上如果函數調用中缺少參數--|2019香港赛駌会彩经,Python 會拋出異常--甚至這個參數實際上沒什麼用……
實際上_||marta krylova,你可能已經猜到了答案__狩猎狂狮:方法的特別之處在於實例對象作為函數的第一個參數傳給了函數|||关于龙的对联。在我們的例子中_-流动人口信息,調用 x.f() 相當於 MyClass.f(x) -永盛国际网址多少。通常-巃bt,以 n 個參數的列表去調用一個方法就相當於將方法的對象插入到參數列表的最前麵後-_-众发彩票合法吗?,以這個列表去調用相應的函數_钢八连。
如果你還是不理解方法的工作原理-_优彩app,了解一下它的實現也許有幫助-镇江老兵事件。引用非數據屬性的實例屬性時|||网点支付,會搜索它的類微店网是真的吗。如果這個命名確認為一個有效的函數對象 類屬性|_苏州日报电子版,就會將實例對象和函數對象封裝進一個抽象對象_|诺基亚翻盖手机:這就是方法對象--nod32激活码网络之窗论坛。以一個參數列表調用方法對象時-_-魏征进谏图作者,它被重新拆封|河北省学位网,用實例對象和原始的參數列表構造一 個新的參數列表|-_7kk7小游戏,然後函數對象調用這個新的參數列表--分宜租房网。
9.3.5. 類和實例變量
一般來說-||魔兽大唐双龙传,實例變量用於對每一個實例都是唯一的數據_-雪狼狗图片,類變量用於類的所有實例共享的屬性和方法:
class Dog:

kind = 'canine'         # class variable shared by all instances

def __init__(self, name):
    self.name = name    # instance variable unique to each instance

d = Dog('Fido')
e = Dog('Buddy')
d.kind # shared by all dogs
'canine'
e.kind # shared by all dogs
'canine'
d.name # unique to d
'Fido'
e.name # unique to e
'Buddy'
正如在 術語相關 討論的___璎珞潮牌服装批发网, 可變 對象-_山西环法尊道长,例如列表和字典-|尊龙国际娱乐平台app,的共享數據可能帶來意外的效果-||自摸摸和努呸呸。例如-花都区教育局,下麵代碼中的 tricks 列表不應該用作類變量|阴魂镇,因為所有的 Dog 實例將共享同一個列表:
class Dog:

tricks = []             # mistaken use of a class variable

def __init__(self, name):
    self.name = name

def add_trick(self, trick):
    self.tricks.append(trick)

d = Dog('Fido')
e = Dog('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
d.tricks # unexpectedly shared by all dogs
['roll over', 'play dead']
這個類的正確設計應該使用一個實例變量:
class Dog:

def __init__(self, name):
    self.name = name
    self.tricks = []    # creates a new empty list for each dog

def add_trick(self, trick):
    self.tricks.append(trick)

d = Dog('Fido')
e = Dog('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
d.tricks
['roll over']
e.tricks
['play dead']
9.4. 一些說明
數據屬性會覆蓋同名的方法屬性-__亿博娱乐。為了避免意外的名稱衝突_王晗祥康快车讲座,這在大型程序中是極難發現的 Bug__诺基亚 7280,使用一些約定來減少衝突的機會是明智的-||清梦无痕2。可能的約定包括|_|97香港回归晚会:大寫方法名稱的首字母-__北京皮肤科燕都,使用一個唯一的小字符串(也許隻是一個下劃線)作為數據屬性名稱 的前綴-_老司机导航(原avsoso,或者方法使用動詞而數據屬性使用名詞--艺龙团购后台。
數據屬性可以被方法引用__|身边的科学有哪些,也可以由一個對象的普通用戶(客戶)使用-_四川教育学院温江校区。換句話說-_金宝街百丽宫,類不能用來實現純淨的數據類型|_|德国thomas锅具。事實上_-365彩票手机app下载,Python 中不可能強製隱藏數據——一切基於約定(如果需要-侍从加文,使用 C 編寫的 Python 實現可以完全隱藏實現細節並控製對象的訪問优彩网靠谱吗43167。這可以用來通過 C 語言擴展 Python)_-|镇江舰。
客戶應該謹慎的使用數據屬性——客戶可能通過踐踏他們的數據屬性而使那些由方法維護的常量變得混亂_东港宋老六。注意|_302sh:隻要能避免衝突_-诛仙漫画下载,客戶可以向一個實例對象添加他們自己的數據屬性-|365彩票不能买,而不會影響方法的正確性——再次強調||天猫砍商品攻略,命名約定可以避免很多麻煩-111cc彩票送彩金。
從方法內部引用數據屬性(或其他方法)並沒有快捷方式|_优信彩票APP。我覺得這實際上增加了方法的可讀性|-_字谜七则:當瀏覽一個方法時-|-致富彩骗局,在局部變量和實例變量之間不會出現令人費解的情況_-运盛彩票提不了钱。
一般|_-掌上彩票登录不了,方法的第一個參數被命名為 self_|_众购彩票网平台。這僅僅是一個約定--淮安草根网:對 Python 而言_-_145期富婆看图肖特,名稱 self 絕對沒有任何特殊含義|_-长沙居家spa。(但是請注意_--要听h的话:如果不遵循這個約定|-038彩票148,對其他的 Python 程序員而言你的代碼可讀性就會變差-长安大剧院,而且有些 類查看器 程序也可能是遵循此約定編寫的|-公安县政府网。)
類屬性的任何函數對象都為那個類的實例定義了一個方法||_邦尼延时汀官网。函數定義代碼不一定非得定義在類中_-|123手机开奖软件:也可以將一個函數對象賦值給類中的一個局部變量_7小游戏大全。例如:

Function defined outside the class

def f1(self, x, y):
return min(x, x+y)

class C:
f = f1
def g(self):
return 'hello world'
h = g
現在 f|王的第十七妾, g 和 h 都是類 C 的屬性_-|芳村客运站网上订票,引用的都是函數對象_人妻 中文字幕 ed2k,因此它們都是 C 實例的方法-- h 嚴格等於 g ||_优选彩票能玩到几点。要注意的是這種習慣通常隻會迷惑程序的讀者-淘宝股票代码。
通過 self 參數的方法屬性-水族疾病,方法可以調用其它的方法:
class Bag:
def init(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
方法可以像引用普通的函數那樣引用全局命名--1368棋牌官方下载。與方法關聯的全局作用域是包含類定義的模塊|||亿博彩票是正规平台吗。(類本身永遠不會做為全局作用域使用_-|城轨网上订票。)盡管很少有好的理 由在方法 中使用全局數據_||丁丁网 上海,全局作用域確有很多合法的用途-|_永胜国际福彩靠谱么:其一是方法可以調用導入全局作用域的函數和方法-|-11086移动彩票每日红包,也可以調用定義在其中的類和函數-|铁道兵战友网。通常-_长武公众信息网,包含此方法的類 也會定義在這個全局作用域_1234成人网站,在下一節我們會了解為何一個方法要引用自己的類|-沣渭新区规划图。
每個值都是一個對象|__gts3370,因此每個值都有一個 類( class ) (也稱為它的 類型( type ) )__门头沟歌华有线电话,它存儲為 object.class --苏联卫国战争歌曲。
9.5. 繼承
當然_诺氟沙星副作用,如果一種語言不支持繼承就|天通银个人代理,“類”就沒有什麼意義永盛国际。派生類的定義如下所示:
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
命名 BaseClassName (示例中的基類名)必須與派生類定義在一個作用域內-|_奥术扰动。除了類-__优优娱乐彩票反向,還可以用表達式__雄县地图,基類定義在另一個模塊中時這一點非常有用:
class DerivedClassName(modname.BaseClassName):
派生類定義的執行過程和基類是一樣的_--不属于国家领土。構造派生類對象時_|全民英雄辅助,就記住了基類-_中成快递。這在解析屬性引用的時候尤其有用_-|济南买菜网:如果在類中找不到請求調用的屬性-迅雷看看绿屏,就搜索基類|-黑暗之光伴奏。如果基類是由別的類派生而來|-|咖啡恋人,這個規則會遞歸的應用上去---至诚健身中心。
派生類的實例化沒有什麼特殊之處-_|捡钱街: DerivedClassName() (示列中的派生類)創建一個新的類實例_-娱乐赌博软件大全。方法引用按如下規則解析_-_要听h的话:搜索對應的類屬性--_无限挑战120121,必要時沿基類鏈逐級搜索__|半裸江山结局,如果找到了函數對象這個方法引用就是合法的|_沈阳网通宽带测速。
派生類可能會覆蓋其基類的方法-|_三星b7732微信。因為方法調用同一個對象中的其它方法時沒有特權_--2019年买马生肖对照表,基類的方法調用同一個基類的方法時-||阳台门 陈怡,可能實際上最終調用了派生類中的覆蓋方法__新观兰。(對於 C++ 程序員來說-_|帕斯卡显卡,Python 中的所有方法本質上都是 虛 方法__蛊惑总裁。)
派生類中的覆蓋方法可能是想要擴充而不是簡單的替代基類中的重名方法-||谭国箱。有一個簡單的方法可以直接調用基類方法-众赢国际彩票平台,隻要調用-_-索爱u5i刷机: BaseClassName.methodname(self, arguments)_||助赢软件手机版有吗。有時這對於客戶也很有用||芦山县委书记被免职。(要注意隻有 BaseClassName 在同一全局作用域定義或導入時才能這樣用-重庆到奉节坐船。)
Python 有兩個用於繼承的函數||-许小年微博:
函數 isinstance() 用於檢查實例類型|_|云顶娱乐平台大全: isinstance(obj, int) 隻有在 obj.class 是 int 或其它從 int 繼承的類型
函數 issubclass() 用於檢查類繼承_-106官网彩票怎么下: issubclass(bool, int) 為 True-|078彩票包赔本金是真的吗,因為 bool 是 int 的子類-|构橘。
然而_-k mic, issubclass(float, int) 為 False-|重庆信鸽信息网,因為 float 不是 int 的子類|-jthysh。
9.5.1. 多繼承
Python 同樣有限的支持多繼承形式|__11068彩票。多繼承的類定義形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
在大多數情況下|_-孝义广电传媒,在最簡單的情況下|永城,你能想到的搜索屬性從父類繼承的深度優先|-黄翘,左到右|-_纳斯机构,而不是搜索兩次在同一個類層次結構中_-x小爸爸,其中有一個重疊_||皇帝龙之崛起布局。因此||1234成人,如果在 DerivedClassName (示例中的派生類)中沒有找到某個屬性|_防患于未然的意思,就會搜索 Base1||_不思议游戏国语版,然後(遞歸的)搜索其基類cces快递查询单号,如果最終沒有找到_狼堡行动,就搜索 Base2-_盈盈彩是哪个公司出的,以此類推|_|二手奢侈品寄卖店。
實際上__反间谍工作的主管单位,super() 可以動態的改變解析順序-八福晋的多夫人生 np。這個方式可見於其它的一些多繼承語言__新台湾星光大道,類似 call-next-method|_-最新功率计算器,比單繼承語言中的 super 更強大 ---冬泉豹幼崽怎么获得。
動態調整順序十分必要的|135时时彩彩票,因為所有的多繼承會有一到多個菱形關係(指有至少一個祖先類可以從子類經由多個繼承路徑到達)_京东收购一号店。例如---038彩票官方正版,所有的 new-style 類繼承自 object -游彩客户端下载,所以任意的多繼承總是會有多於一條繼承路徑到達 object ---娱乐天地线路官网。
為了防止重複訪問基類--|虾窝,通過動態的線性化算法-__重庆城投集团董事长,每個類都按從左到右的順序特別指定了順序__天迈g18,每個祖先類隻調用一次-_|123彩票官网站首页,這是單調的(意味著一個類被繼承時不會影響它祖先的次序)__|13彩怎么玩不亏。總算可以通過這種方式使得設計一個可靠並且可擴展的多繼承類成為可能_|1号彩票网靠谱吗?。進一步的內容請參見 http://www.python.org/download/releases/2.3/mro/ _-xiannuhu。
9.6. 私有變量
隻能從對像內部訪問的“私有”實例變量|__魏氏膏,在 Python 中不存在_昆明39手机网。然而凹凸 绕梁三日,也有一個變通的訪問用於大多數 Python 代碼|_-小学生美术作品:以一個下劃線開頭的命名(例如 _spam )會被處理為 API 的非公開部分(無論它是一個函數|-95598网上营业厅、方法或數據成員)-邪恶少年eb的小站。它會被視為一個實現細節_|青岛大哥骂雅阁女,無需公開|花狸猫娱乐社区。
因為有一個正當的類私有成員用途(即避免子類裏定義的命名與之衝突)_-艾克医院院长,Python 提供了對這種結構的有限支持||吉林省中小学教师研修网,稱為 name mangling (命名編碼) __运盛彩票导航密集。任何形如 __spam 的標識(前麵至少兩個下劃線_|蹲坑姐,後麵至多一個)_|许氏大酱,被替代為 _classname__spam ||_kf qq com在线客服,去掉前導下劃線的 classname 即當前的類名__管栎。此語法不關注標識的位置|||维族电影,隻要求在類定義內-||2013年考驾照多少钱。
名稱重整是有助於子類重寫方法|-|薄樱鬼同人羁绊,而不會打破組內的方法調用-|_游彩网登录注册网址。例如:
class Mapping:
def init(self, iterable):
self.items_list = []
self.__update(iterable)

def update(self, iterable):
    for item in iterable:
        self.items_list.append(item)

__update = update   # private copy of original update() method

class MappingSubclass(Mapping):

def update(self, keys, values):
    # provides new signature for update()
    # but does not break __init__()
    for item in zip(keys, values):
        self.items_list.append(item)

需要注意的是編碼規則設計為盡可能的避免衝突|_|诺基亚6760,被認作為私有的變量仍然有可能被訪問或修改|_-laichien。在特定的場合它也是有用的__|歌手2017第五期,比如調試的時候||金螳螂朱兴良。
要注意的是代碼傳入 exec()__|白酒包装盒设计, eval() 時不考慮所調用的類的類名__玄魔神变,視其為當前類__天弘基金余额宝计算器,這類似於 global 語句的效應||_卓易彩票老版本,已經按字節編譯的部分也有同樣的限製_|_金瓜钺斧朝天蹬。這也同樣作用於 getattr()||132彩票软件app, setattr() 和 delattr()_-_祥康快车王晗,像直接引用 dict 一樣-_|四播。
9.7. 補充
有時類似於 Pascal 中“記錄(record)”或 C 中“結構(struct)”的數據類型很有用--35彩票没人管吗?,它將一組已命名的數據項綁定在一起|_亿客隆彩票正规吗。一個空的類定義可以很好的實現它:
class Employee:
pass

john = Employee() # Create an empty employee record

Fill the fields of the record

john.name = 'John Doe'
john.dept = 'computer lab'
john.salary = 1000
某一段 Python 代碼需要一個特殊的抽象數據結構的話||锦州公交公司,通常可以傳入一個類_-零纪元特权礼包,事實上這模仿了該類的方法|中国达人秀张冯喜初赛。例如_||注册送58元彩票体验金,如果你有一個用於從文件對象中格式化數據的函數-|雅安芦山县委书记,你可以定義一個帶有 read() 和 readline() 方法的類-给个身份证号,以此從字符串緩衝讀取數據_-_东方热线测速,然後將該類的對象作為參數傳入前述的函數||_写给方大同歌词。
實例方法對象也有屬性_-掌上购彩破解:m.self 是一個實例方法所屬的對象___198彩怎么样,而 m.func 是這個方法對應的函數對象|_-众购彩票开户。
9.8. 異常也是類
用戶自定義異常也可以是類--诚毅学院体育教研室。利用這個機製可以創建可擴展的異常體係__|焊锡大师。
以下是兩種新的|毛衣外套编织花样,有效的(語義上的)異常拋出形式_||三九祛痘灵官网,使用 raise 語句:
raise Class

raise Instance
第一種形式中-__李晨阳年龄,instance 必須是 type 或其派生類的一個實例||-雪福来 克鲁兹。第二種形式是以下形式的簡寫:
raise Class()
發生的異常其類型如果是 except 子句中列出的類||_ella和言承旭,或者是其派生類-||云端彩票主页,那麼它們就是相符的(反過來說--發生的異常其類型如果是異常子句中列出的類的基類_-英达锐香港入口网站,它們就不相符)|-|金星啤酒厂。例如__重庆关海洋,以下代碼會按順序打印 B_|镇江代驾,C|通辽刘大鹏,D:
class B(Exception):
pass
class C(B):
pass
class D(C):
pass

for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")
要注意的是如果異常子句的順序顛倒過來( execpt B 在最前)_-天弘基金网站,它就會打印 B_|ab汽车网,B-||qvodsetup exe,B--第一個匹配的異常被觸發苯乙烯用途。
打印一個異常類的錯誤信息時|_保定独立团团购,先打印類名--|断纸机,然後是一個空格|解放军胸章、一個冒號-|120富婆看图中肖特,然後是用內置函數 str() 將類轉換得到的完整字符串_-_中央领导人名单。
9.9. 迭代器
現在你可能注意到大多數容器對象都可以用 for 遍曆:
for element in [1, 2, 3]:
print(element)
for element in (1, 2, 3):
print(element)
for key in {'one':1, 'two':2}:
print(key)
for char in "123":
print(char)
for line in open("myfile.txt"):
print(line, end='')
這種形式的訪問清晰-_-1rdt军海、簡潔-__爱唯侦查发布器、方便||_3分PK10。迭代器的用法在 Python 中普遍而且統一_-_助赢软件官网下载。在後台__168彩票IOS, for 語句在容器對象中調用 iter() |-2000彩平台。該函數返回一個定義了 next() 方法的迭代器對象_-盐都政府网,它在容器中逐一訪問元素|_仲博彩票苹果版客户端。沒有後續的元素時_|2240期海南头尾规律, next() 拋出一個 StopIteration 異常通知 for 語句循環結束_|比波网。你可以是用內建的 next() 函數調用 next() 方法|_邪恶少年eb的小站;以下是其工作原理的示例:

s = 'abc'
it = iter(s)
it
<iterator object at 0x00A1DB50>
next(it)
'a'
next(it)
'b'
next(it)
'c'
next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
next(it)
StopIteration
了解了迭代器協議的後台機製---2019年送彩金网站大全,就可以很容易的給自己的類添加迭代器行為__-众博国际合法吗。定義一個 iter() 方法_|_说服的艺术,使其返回一個帶有 next() 方法的對象|诺基亚oro。如果這個類已經定義了 next() |-意大利凯撒卫浴,那麼 iter() 隻需要返回 self:
class Reverse:
"""Iterator for looping over a sequence backwards."""
def init(self, data):
self.data = data
self.index = len(data)
def iter(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index = self.index - 1
return self.data[self.index]
rev = Reverse('spam')
iter(rev)
<main.Reverse object at 0x00A1DB50>
for char in rev:
... print(char)
...
m
a
p
s
9.10. 生成器
Generator 是創建迭代器的簡單而強大的工具_||南京水货手机市场。它們寫起來就像是正規的函數-白色松木家具,需要返回數據的時候使用 yield 語句||运盛彩票。每次 next() 被調用時|-金铭结婚了吗,生成器回複它脫離的位置(它記憶語句最後一次執行的位置和所有的數據值)_--离宫属东四命。以下示例演示了生成器可以很簡單的創建出來:
def reverse(data):
for index in range(len(data)-1, -1, -1):
yield data[index]
for char in reverse('golf'):
... print(char)
...
f
l
o
g
前一節中描述了基於類的迭代器-_|吴双战简历,它能作的每一件事生成器也能作到-__苏州相城红星美凯龙。因為自動創建了 iter() 和 next() 方法||_长青贝妮,生成器顯得如此簡潔_-浦东科普网。
另一個關鍵的功能在於兩次執行之間_拳皇97大蛇版,局部變量和執行狀態都自動的保存下來|||众益彩苹果版如何下载。這使函數很容易寫_-quickoffice下载,而且比使用 self.index 和 self.data 之類的方式更清晰|__网曝 查开房 网址。
除了創建和保存程序狀態的自動方法--c罗电梯球教学,當發生器終結時_2018明星死亡大全,還會自動拋出 StopIteration 異常|-青岛大哥骂雅阁女。綜上所述_-江淮愿景iii,這些功能使得編寫一個正規函數成為創建迭代器的最簡單方法__-金域华府业主论坛。
9.11. 生成器表達式
有時簡單的生成器可以用簡潔的方式調用||234彩票安卓,就像不帶中括號的鏈表推導式|易利主管qq。這些表達式是為函數調用生成器而設計的_--鼠明博。生成器表達式比完整的生成器定義更簡潔-青田信息港,但是沒有那麼多變__-办厂好项目,而且通常比等價的鏈表推導式更容易記|||永盛国彩。
例如:
sum(i*i for i in range(10)) # sum of squares
285

xvec = [10, 20, 30]
yvec = [7, 5, 3]
sum(x*y for x,y in zip(xvec, yvec)) # dot product
260

from math import pi, sin
sine_table = {x: sin(x*pi/180) for x in range(0, 91)}

unique_words = set(word for line in page for word in line.split())

valedictorian = max((student.gpa, student.name) for student in graduates)

data = 'golf'
list(data[i] for i in range(len(data)-1, -1, -1))
['f', 'l', 'o', 'g']
Footnotes
[1] 有一個例外_掌信彩官网下载。模塊對象有一個隱秘的隻讀對象|-至尊宝v530,名為 dict -|枫无涯下部,它返回用於實現模塊命名空間的字典_||黑暗之光伴奏,命名 dict 是一個屬性而非全局命名_|1号计划的目的是培养。顯然||阿巴克大帝,使用它違反了命名空間實現的抽象原則--真人cs枪械专卖,應該被嚴格限製於調試中---八马赛珍珠5800价格。

  1. Python 標準庫概覽
    10.1. 操作係統接口
    os 模塊提供了很多與操作係統交互的函數:

import os
os.getcwd() # Return the current working directory
'C:\Python35'
os.chdir('/server/accesslogs') # Change current working directory
os.system('mkdir today') # Run the command mkdir in the system shell
0
應該用 import os 風格而非 from os import __白酒包装盒设计。這樣可以保證隨操作係統不同而有所變化的 os.open() 不會覆蓋內置函數 open()||魔龙辅助。
在使用一些像 os 這樣的大型模塊時內置的 dir() 和 help() 函數非常有用:
import os
dir(os)
<returns a list of all module functions>
help(os)
<returns an extensive manual page created from the module's docstrings>
針對日常的文件和目錄管理任務__天府新区总体规划图,shutil 模塊提供了一個易於使用的高級接口:
import shutil
shutil.copyfile('data.db', 'archive.db')
'archive.db'
shutil.move('/build/executables', 'installdir')
'installdir'
10.2. 文件通配符
glob 模塊提供了一個函數用於從目錄通配符搜索中生成文件列表:
import glob
glob.glob('
.py')
['primes.py', 'random.py', 'quote.py']
10.3. 命令行參數
通用工具腳本經常調用命令行參數--永城彩票。這些命令行參數以鏈表形式存儲於 sys 模塊的 argv 變量_滴胶铭板。例如在命令行中執行 python demo.py one two three 後可以得到以下輸出結果:
import sys
print(sys.argv)
['demo.py', 'one', 'two', 'three']
getopt 模塊使用 Unix getopt() 函處理 sys.argv--金惠明。更多的複雜命令行處理由 argparse 模塊提供-|富诚电商平台。
10.4. 錯誤輸出重定向和程序終止
sys 還有 stdin--3分pk10是正规彩票吗, stdout 和 stderr 屬性-_htcg5,即使在 stdout 被重定向時|_lb是什么单位,後者也可以用於顯示警告和錯誤信息:
sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
大多腳本的定向終止都使用 sys.exit()-李晨阳年龄。
10.5. 字符串正則匹配
re 模塊為高級字符串處理提供了正則表達式工具--反间谍工作的主管单位是什么。對於複雜的匹配和處理-|_10500com彩票开,正則表達式提供了簡潔|鹰彩注册、優化的解決方案:
import re
re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
隻需簡單的操作時_脑出血圈,字符串方法最好用___盈盈彩正规吗,因為它們易讀|-小明的储蓄罐,又容易調試:
'tea for too'.replace('too', 'two')
'tea for two'
10.6. 數學
math 模塊為浮點運算提供了對底層C函數庫的訪問:
import math
math.cos(math.pi / 4.0)

dir(os)
<returns a list of all module functions>
>>> help(os)
<returns an extensive manual page created from the module's docstrings>
針對日常的文件和目錄管理任務||锦旗感谢词,shutil 模塊提供了一個易於使用的高級接口:
>>> import shutil
>>> shutil.copyfile('data.db', 'archive.db')
'archive.db'
>>> shutil.move('/build/executables', 'installdir')
'installdir'
10.2. 文件通配符
glob 模塊提供了一個函數用於從目錄通配符搜索中生成文件列表:
>>> import glob
>>> glob.glob('.py')
['primes.py', 'random.py', 'quote.py']
10.3. 命令行參數
通用工具腳本經常調用命令行參數_-|云顶娱乐网页能打开吗。這些命令行參數以鏈表形式存儲於 sys 模塊的 argv 變量|_-1953年1月8日人民日报。例如在命令行中執行 python demo.py one two three 後可以得到以下輸出結果:
>>> import sys
>>> print(sys.argv)
['demo.py', 'one', 'two', 'three']
getopt 模塊使用 Unix getopt() 函處理 sys.argv_-黑帮图片。更多的複雜命令行處理由 argparse 模塊提供|||038手机彩票。
10.4. 錯誤輸出重定向和程序終止
sys 還有 stdin--定襄新闻, stdout 和 stderr 屬性_-注册送100彩金,即使在 stdout 被重定向時--狱霸电影,後者也可以用於顯示警告和錯誤信息:
>>> sys.stderr.write('Warning, log file not found starting a new one\n')
Warning, log file not found starting a new one
大多腳本的定向終止都使用 sys.exit()|-|x女特工结局。
10.5. 字符串正則匹配
re 模塊為高級字符串處理提供了正則表達式工具_-|雅漾防晒霜保质期。對於複雜的匹配和處理-|_兰西小屋论坛,正則表達式提供了簡潔-|-诺亚信a700、優化的解決方案:
>>> import re
>>> re.findall(r'\bf[a-z]
', 'which foot or hand fell fastest')
['foot', 'fell', 'fastest']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat')
'cat in the hat'
隻需簡單的操作時--_水果鞋,字符串方法最好用-|铜电阻率,因為它們易讀-意彩,又容易調試:
>>> 'tea for too'.replace('too', 'two')
'tea for two'
10.6. 數學
math 模塊為浮點運算提供了對底層C函數庫的訪問:
>>> import math
>>> math.cos(math.pi / 4.0)
0.70710678118654757
math.log(1024, 2)
10.0
random 提供了生成隨機數的工具:
import random
random.choice(['apple', 'pear', 'banana'])
'apple'
random.sample(range(100), 10) # sampling without replacement
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
random.random() # random float
0.17970987693706186
random.randrange(6) # random integer chosen from range(6)
4
SciPy http://scipy.org 項目提供了許多數值計算的模塊_易建宝怎么样。
10.7. 互聯網訪問
有幾個模塊用於訪問互聯網以及處理網絡通信協議-|_栾海燕。其中最簡單的兩個是用於處理從 urls 接收的數據的 urllib.request 以及用於發送電子郵件的 smtplib:
from urllib.request import urlopen

for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
... line = line.decode('utf-8') # Decoding the binary data to text.
... if 'EST' in line or 'EDT' in line: # look for Eastern Time
... print(line)

<BR>Nov. 25, 09:43:32 PM EST

import smtplib
server = smtplib.SMTP('localhost')
server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
server.quit()
(注意第二個例子需要在 localhost 運行一個郵件服務器-|中环放电影院。)
10.8. 日期和時間
datetime 模塊為日期和時間處理同時提供了簡單和複雜的方法-至尊彩大发快三破解。支持日期和時間算法的同時_--强心脏20121127,實現的重點放在更有效的處理和格式化輸出--_欧式蒙牛奶粉事件。該模塊還支持時區處理-亿彩彩票网页版。

dates are easily constructed and formatted

from datetime import date
now = date.today()
now
datetime.date(2003, 12, 2)
now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

dates support calendar arithmetic

birthday = date(1964, 7, 31)
age = now - birthday
age.days
14368
10.9. 數據壓縮
以下模塊直接支持通用的數據打包和壓縮格式-_|午夜神:zlib--陈嘉男, gzip青岛44中, bz2_优博彩票网站, lzma_-阿朵减肥, zipfile 以及 tarfile_快乐向前冲崔璀车祸。
import zlib
s = b'witch which has which witches wrist watch'
len(s)
41
t = zlib.compress(s)
len(t)
37
zlib.decompress(t)
b'witch which has which witches wrist watch'
zlib.crc32(s)
226805979
10.10. 性能度量
有些用戶對了解解決同一問題的不同方法之間的性能差異很感興趣||_南通开沙岛。Python 提供了一個度量工具_|深圳观澜田背花园,為這些問題提供了直接答案__星岛田阳子。
例如||夫妻轩,使用元組封裝和拆封來交換元素看起來要比使用傳統的方法要誘人的多||杨浦区小学排名。timeit 證明了後者更快一些:
from timeit import Timer
Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
相對於 timeit 的細粒度宋家王朝 喜多郎,profile 和 pstats 模塊提供了針對更大代碼塊的時間度量工具___国家领导人名单。
server.sendmail('soothsayer@example.org', 'jcaesar@example.org',
... """To: jcaesar@example.org
... From: soothsayer@example.org
...
... Beware the Ides of March.
... """)
>>> server.quit()
(注意第二個例子需要在 localhost 運行一個郵件服務器-_|云端彩票是真的吗。)
10.8. 日期和時間
datetime 模塊為日期和時間處理同時提供了簡單和複雜的方法--音乐银行111223。支持日期和時間算法的同時-_-优博彩票平台,實現的重點放在更有效的處理和格式化輸出-_战地3沙漠巡逻车。該模塊還支持時區處理---冷酷殿下判出局。
>>> # dates are easily constructed and formatted
>>> from datetime import date
>>> now = date.today()
>>> now
datetime.date(2003, 12, 2)
>>> now.strftime("%m-%d-%y. %d %b %Y is a %A on the %d day of %B.")
'12-02-03. 02 Dec 2003 is a Tuesday on the 02 day of December.'

>>> # dates support calendar arithmetic
>>> birthday = date(1964, 7, 31)
>>> age = now - birthday
>>> age.days
14368
10.9. 數據壓縮
以下模塊直接支持通用的數據打包和壓縮格式--_北京市统计局信息直报网:zlib|-叶彤倩, gzip_-智能手机, bz2-__优秀英文文章, lzma||运盛娱乐平台登录, zipfile 以及 tarfile|_南昌商学院教务网。
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979
10.10. 性能度量
有些用戶對了解解決同一問題的不同方法之間的性能差異很感興趣_众发娱乐是不是赌博。Python 提供了一個度量工具_||无翼乌,為這些問題提供了直接答案--|索爱刷机软件。
例如--3218彩城,使用元組封裝和拆封來交換元素看起來要比使用傳統的方法要誘人的多--肉体契约书。timeit 證明了後者更快一些:
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791
相對於 timeit 的細粒度|七彩尾房超市,profile 和 pstats 模塊提供了針對更大代碼塊的時間度量工具--易彩彩名福地。
10.11. 質量控製
開發高質量軟件的方法之一是為每一個函數開發測試代碼||_1分钟开大发快三规律,並且在開發過程中經常進行測試|_nba2k online外挂。
doctest 模塊提供了一個工具|--普拉达官网中文官方网,掃描模塊並根據程序中內嵌的文檔字符串執行測試__超级中国纪录片 下载。測試構造如同簡單的將它的輸出結果剪切並粘貼到文檔字符串中|--投融贷网。通過用戶提供的例子_幼儿教师年度工作总结,它發展了文檔--_重庆历任公安局长,允許 doctest 模塊確認代碼的結果是否與文檔一致:
def average(values):
"""Computes the arithmetic mean of a list of numbers.

>>> print(average([20, 30, 70]))
40.0
"""
return sum(values) / len(values)

import doctest
doctest.testmod() # automatically validate the embedded tests
unittest 模塊不像 doctest 模塊那麼容易使用|--五里牌租房,不過它可以在一個獨立的文件裏提供一個更全麵的測試集:
import unittest

class TestStatisticalFunctions(unittest.TestCase):

def test_average(self):
    self.assertEqual(average([20, 30, 70]), 40.0)
    self.assertEqual(round(average([1, 5, 7]), 1), 4.3)
    with self.assertRaises(ZeroDivisionError):
        average([])
    with self.assertRaises(TypeError):
        average(20, 30, 70)

unittest.main() # Calling from the command line invokes all tests
10.12. “瑞士軍刀”
Python 展現了“瑞士軍刀”的哲學__重庆419。這可以通過它更大的包的高級和健壯的功能來得到最好的展現|_|诺基亚n82刷机。列如:
xmlrpc.client 和 xmlrpc.server 模塊讓遠程過程調用變得輕而易舉||_132彩票网址是不是骗局。盡管模塊有這樣的名字--qq2011版下载,用戶無需擁有 XML 的知識或處理 XML||-注册送300娱乐网址。
email 包是一個管理郵件信息的庫-_长篇小说征稿,包括MIME和其它基於 RFC2822 的信息文檔_-_云顶彩票注册。
不同於實際發送和接收信息的 smtplib 和 poplib 模塊-|_众博彩票是不是黑平台,email 包包含一個構造或解析複雜消息結構(包括附件)及實現互聯網編碼和頭協議的完整工具集|||温州口碑网。
xml.dom 和 xml.sax 包為流行的信息交換格式提供了強大的支持_|01彩票官方版。同樣_|锐度五花大绑, csv 模塊支持在通用數據庫格式中直接讀寫_--锐度锦绣江南。
綜合起來|-_小狼狗心水论坛,這些模塊和包大大簡化了 Python 應用程序和其它工具之間的數據交換-_十女九丝。
國際化由 gettext--众彩彩票app下载安装, locale 和 codecs 包支持-|金地荔湖城业主论坛。

  1. 標準庫瀏覽 – Part II
    第二部分包含了支持專業編程工作所需的更高級的模塊|_-长春新东方外语学校,這些模塊很少出現在小腳本中__北华信集团董事长。
    11.1. 輸出格式
    reprlib 模塊為大型的或深度嵌套的容器縮寫顯示提供了 :repr() 函數的一個定製版本:

import reprlib
reprlib.repr(set('supercalifragilisticexpialidocious'))
"set(['a', 'c', 'd', 'e', 'f', 'g', ...])"
pprint 模塊給老手提供了一種解釋器可讀的方式深入控製內置和用戶自定義對象的打印--168娱乐2。當輸出超過一行的時候_花将军,“美化打印(pretty printer)”添加斷行和標識符|-上海乐购仕,使得數據結構顯示的更清晰:
import pprint
t = [[[['black', 'cyan'], 'white', ['green', 'red']], [['magenta',
... 'yellow'], 'blue']]]
...
pprint.pprint(t, width=30)
[[[['black', 'cyan'],
'white',
['green', 'red']],
[['magenta', 'yellow'],
'blue']]]
textwrap 模塊格式化文本段落以適應設定的屏寬:
import textwrap
doc = """The wrap() method is just like fill() except that it returns
... a list of strings instead of one big string with newlines to separate
... the wrapped lines."""
...
print(textwrap.fill(doc, width=40))
The wrap() method is just like fill()
except that it returns a list of strings
instead of one big string with newlines
to separate the wrapped lines.
locale 模塊按訪問預定好的國家信息數據庫|漯河军嫂被拘留。locale 的格式化函數屬性集提供了一個直接方式以分組標示格式化數字:
import locale
locale.setlocale(locale.LC_ALL, 'English_United States.1252')
'English_United States.1252'
conv = locale.localeconv() # get a mapping of conventions
x = 1234567.8
locale.format("%d", x, grouping=True)
'1,234,567'
locale.format_string("%s%.*f", (conv['currency_symbol'],
... conv['frac_digits'], x), grouping=True)
'1,234,567.80' 11.2. 模板 string 提供了一個靈活多變的模版類 Template __-广州圣亚男性科,使用它最終用戶可以用簡單的進行編輯|-_鲁阁初恋。這使用戶可以在不進行改變的情況下定製他們的應用程序--台风银河登陆海南。 格式使用 為開頭的 Python 合法標識(數字_-_藤步阁、字母和下劃線)作為占位符_-深圳网吧牌照。占位符外麵的大括號使它可以和其它的字符不加空格混在一起-_-宋慧乔李秉宪。 創建一個單獨的 $: from string import Template t = Template('${village}folk send10 to cause.') t.substitute(village='Nottingham', cause='the ditch fund') 'Nottinghamfolk send10 to the ditch fund.'
當一個占位符在字典或關鍵字參數中沒有被提供時_|闽江学院教务管理系统,substitute() 方法就會拋出一個 KeyError 異常|盈彩彩票苹果版。 對於郵件合並風格的應用程序___鹿喜微断食,用戶提供的數據可能並不完整|-运盛彩票网手机版,這時使用 safe_substitute() 方法可能更適合 — 如果數據不完整|_360老时时彩开奖代购,它就不會改變占位符:
t = Template('Return the item toowner.')
d = dict(item='unladen swallow')
t.substitute(d)
Traceback (most recent call last):
...
KeyError: 'owner'
t.safe_substitute(d)
'Return the unladen swallow to $owner.'
模板子類可以指定一個自定義分隔符_夺宝传世挂机。例如|_紫金矿业分红,圖像查看器的批量重命名工具可能選擇使用百分號作為占位符_--钳子先生的魔法龙虾盒,像當前日期-__1588彩票是真的吗,圖片序列號或文件格式:
import time, os.path
photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
class BatchRename(Template):
... delimiter = '%'
fmt = input('Enter rename style (%d-date %n-seqnum %f-format): ')
Enter rename style (%d-date %n-seqnum %f-format): Ashley_%n%f

t = BatchRename(fmt)
date = time.strftime('%d%b%y')
for i, filename in enumerate(photofiles):
... base, ext = os.path.splitext(filename)
... newname = t.substitute(d=date, n=i, f=ext)
... print('{0} --> {1}'.format(filename, newname))

img_1074.jpg --> Ashley_0.jpg
img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg
模板的另一個應用是把多樣的輸出格式細節從程序邏輯中分類出來-纳雪莱。這便使得 XML 文件__辽宁都市频道,純文本報表和 HTML WEB 報表定製模板成為可能-_诺基亚asha503。
11.3. 使用二進製數據記錄布局
struct 模塊為使用變長的二進製記錄格式提供了 pack() 和 unpack() 函數|_铁三角atht50。下麵的示例演示了在不使用 zipfile 模塊的情況下如何迭代一個 ZIP 文件的頭信息||掉下了眼泪音译。壓縮碼 "H" 和 "I" 分別表示2和4字節無符號數字__-上海电玩巴士实体店, "<" 表明它們都是標準大小並且按照 little-endian 字節排序|_kingroot pc版官方下载。
import struct

with open('myfile.zip', 'rb') as f:
data = f.read()

start = 0
for i in range(3): # show the first 3 file headers
start += 14
fields = struct.unpack('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields

start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print(filename, hex(crc32), comp_size, uncomp_size)

start += extra_size + comp_size     # skip to the next header

11.4. 多線程
線程是一個分離無順序依賴關係任務的技術|-刨光材。在某些任務運行於後台的時候應用程序會變得遲緩||圣元优惠多金币联盟,線程可以提升其速度-345彩票这几天提现不了。一個有關的用途是在 I/O 的同時其它線程可以並行計算诺基亚c6 00软件。
下麵的代碼顯示了高級模塊 threading 如何在主程序運行的同時運行任務:
import threading, zipfile

class AsyncZip(threading.Thread):
def init(self, infile, outfile):
threading.Thread.init(self)
self.infile = infile
self.outfile = outfile
def run(self):
f = zipfile.ZipFile(self.outfile, 'w', zipfile.ZIP_DEFLATED)
f.write(self.infile)
f.close()
print('Finished background zip of:', self.infile)

background = AsyncZip('mydata.txt', 'myarchive.zip')
background.start()
print('The main program continues to run in foreground.')

background.join() # Wait for the background task to finish
print('Main program waited until background was done.')
多線程應用程序的主要挑戰是協調線程_|斯丽,諸如線程間共享數據或其它資源-_剑气侠虹。為了達到那個目的__评剧发源地,線程模塊提供了許多同步化的原生支持-__4466k最近10天更新,包括__裙地垫卫生巾:鎖-|_自动烹饪锅 林志鹏,事件||-注册彩票网站,條件變量和信號燈-|csol防沉迷系统。
盡管這些工具很強大||辽宁电视台都市频道,微小的設計錯誤也可能造成難以挽回的故障||重庆医科大学校徽。因此---极品公子混在校园,任務協調的首選方法是把對一個資源的所有訪問集中在一個單獨的線程中|-_许氏大酱,然後使用 queue 模塊用那個線程服務其他線程的請求-|艾依欧。為內部線程通信和協調而使用 Queue 對象的應用程序更易於設計--|冷酷殿下判出局,更可讀--_赢咖娱乐赢钱提现不了,並且更可靠|倚天2龙驹私服。
11.5. 日誌
logging 模塊提供了完整和靈活的日誌係統||-娇妍经痛贴。它最簡單的用法是記錄信息並發送到一個文件或 sys.stderr:
import logging
logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')
輸出如下:
WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down
默認情況下捕獲信息和調試消息並將輸出發送到標準錯誤流|-|autocad2004下载。其它可選的路由信息方式通過 email__36选7复式9个号多少钱,數據報文_||卡通战争剑灵中文版,socket 或者 HTTP Server__金立gn105刷机包。基於消息屬性|-118主图库免费红姐图库,新的過濾器可以選擇不同的路由|||村村通卫星电视升级: DEBUG|_亿彩彩票安卓, INFO||哈尔滨断桥, WARNING||-霍州到太原的火车, ERROR 和 CRITICAL -|-野孩子美国电影高清。
日誌係統可以直接在 Python 代碼中定製_-198彩注册平台官网,也可以不經過應用程序直接在一個用戶可編輯的配置文件中加載|-_衡水热线专业聊天室。
11.6. 弱引用
Python 自動進行內存管理(對大多數的對象進行引用計數和垃圾回收—— 垃圾回收 ——以循環利用)在最後一個引用消失後__纳税人管理码是什么,內存會很快釋放|英杰交流中心。
這個工作方式對大多數應用程序工作良好-_描写大自然的句子,但是偶爾會需要跟蹤對象來做一些事-易彩票网址下载。不幸的是_廊坊消费广场招聘,僅僅為跟蹤它們創建引用也會使其長期存在___英皇国际版本363。 weakref 模塊提供了不用創建引用的跟蹤對象工具---台州美食,一旦對象不再存在_|_长宁温水游泳池,它自動從弱引用表上刪除並觸發回調_-|100%竞彩篮球分析预测。典型的應用包括捕獲難以構造的對象:

import weakref, gc
class A:
... def init(self, value):
... self.value = value
... def repr(self):
... return str(self.value)
...
a = A(10) # create a reference
d = weakref.WeakValueDictionary()
d['primary'] = a # does not create a reference
d['primary'] # fetch the object if it is still alive
10
del a # remove the one reference
gc.collect() # run garbage collection right away
0
d['primary'] # entry was automatically removed
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
d['primary'] # entry was automatically removed
File "C:/python34/lib/weakref.py", line 46, in getitem
o = self.datakey
KeyError: 'primary'
11.7. 列表工具
很多數據結構可能會用到內置列表類型_|主持人大鹏。然而_5个人出名了,有時可能需要不同性能代價的實現_-|宜昌隆胸。
array 模塊提供了一個類似列表的 array() 對象_|_采婷,它僅僅是存儲數據|写给方大同歌词,更為緊湊-|_优点彩票。以下的示例演示了一個存儲雙字節無符號整數的數組(類型編碼 "H" )而非存儲 16 字節 Python 整數對象的普通正規列表:
from array import array
a = array('H', [4000, 10, 700, 22222])
sum(a)
26932
a[1:3]
array('H', [10, 700])
collections 模塊提供了類似列表的 deque() 對象|-_赢发彩票首页,它從左邊添加(append)和彈出(pop)更快||卓易彩票最新,但是在內部查詢更慢|-易赢彩票网站。這些對象更適用於隊列實現和廣度優先的樹搜索:
from collections import deque
d = deque(["task1", "task2", "task3"])
d.append("task4")
print("Handling", d.popleft())
Handling task1
unsearched = deque([starting_node])
def breadth_first_search(unsearched):
node = unsearched.popleft()
for m in gen_moves(node):
if is_goal(m):

        return m
    unsearched.append(m)

除了鏈表的替代實現-长城彩票最重视信誉,該庫還提供了 bisect 這樣的模塊以操作存儲鏈表:

import bisect
scores = [(100, 'perl'), (200, 'tcl'), (400, 'lua'), (500, 'python')]
bisect.insort(scores, (300, 'ruby'))
scores
[(100, 'perl'), (200, 'tcl'), (300, 'ruby'), (400, 'lua'), (500, 'python')]
heapq 提供了基於正規鏈表的堆實現-_038彩票平台。最小的值總是保持在 0 點_|网上三好街报价。這在希望循環訪問最小元素但是不想執行完整堆排序的時候非常有用:
from heapq import heapify, heappop, heappush
data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapify(data) # rearrange the list into heap order
heappush(data, -5) # add a new entry
[heappop(data) for i in range(3)] # fetch the three smallest entries
[-5, 0, 1]
11.8. 十進製浮點數算法
decimal 模塊提供了一個 Decimal 數據類型用於浮點數計算|__nokia pc套件官方下载。相比內置的二進製浮點數實現 float-|_金枝玉叶玉琪,這個類型有助於
金融應用和其它需要精確十進製表達的場合-广州缓交,
控製精度||李驰新浪博客,
控製舍入以適應法律或者規定要求-铁路调度系统,
確保十進製數位精度_|永城彩票网真假,
或者
用戶希望計算結果與手算相符的場合_|智彩平台。
例如|-|双色球67期开奖结果,計算 70 分電話費的 5% 稅計算-_-报关单样本,十進製浮點數和二進製浮點數計算結果的差別如下_-运盛app。如果在分值上舍入-||年年顺调和油,這個差別就很重要了:
from decimal import *
round(Decimal('0.70') * Decimal('1.05'), 2)
Decimal('0.74')
round(.70 * 1.05, 2)
0.73
Decimal 的結果總是保有結尾的 0|-|地蛇八部,自動從兩位精度延伸到4位_|-下堂妻七日离婚契约。Decimal 重現了手工的數學運算|哈尔滨群力新区楼盘,這就確保了二進製浮點數無法精確保有的數據精度_|_360手机游戏大厅。
高精度使 Decimal 可以執行二進製浮點數無法進行的模運算和等值測試:
Decimal('1.00') % Decimal('.10')
Decimal('0.00')
1.00 % 0.10
0.09999999999999995

sum([Decimal('0.1')]10) == Decimal('1.0')
True
sum([0.1]
10) == 1.0
False
decimal 提供了必須的高精度算法:
getcontext().prec = 36
Decimal(1) / Decimal(7)
Decimal('0.142857142857142857142857142857142857')

  1. 虛擬環境和包
    12.1. 簡介
    Python 應用程序經常會使用一些不屬於標準庫的包和模塊|cad2004下载。應用程序有時候需要某個特定版本的庫-_诺基亚n79软件下载,因為它需要一個特定的 bug 已得到修複的庫或者它是使用了一個過時版本的庫的接口編寫的_|autocad2004序列号。
    這就意味著可能無法安裝一個 Python 來滿足每個應用程序的要求|-锐捷aaa认证。如果應用程序 A 需要一個特定模塊的 1.0 版本但是應用程序 B 需要該模塊的 2.0 版本|-|12306智行火车电话,這兩個應用程序的要求是衝突的||深圳第一现场,安裝版本 1.0 或者版本 2.0 將會導致其中一個應用程序不能運行-_|暴力破解密码。
    這個問題的解決方案就是創建一個 虛擬環境 (通常簡稱為 “virtualenv”)_||热血无赖4个特别的数字,包含一個特定版本的 Python--_qq空间视频地址,以及一些附加的包的獨立的目錄樹-_-金地名京业主论坛。
    不同的應用程序可以使用不同的虛擬環境|_-南滨市。為了解決前麵例子中的衝突-|券老婆,應用程序 A 可以有自己的虛擬環境-易旺彩票主页百度,其中安裝了特定模塊的 1.0 版本|-_长沙友谊商店招聘。而應用程序 B 擁有另外一個安裝了特定模塊 2.0 版本的虛擬環境-_|勇士vs步行者。如果應用程序 B 需求一個庫升級到 3.0 的話_|云天国际彩票是真是假,這也不會影響到應用程序 A 的環境_众赢彩票网址。
    12.2. 創建虛擬環境
    用於創建和管理虛擬環境的腳本叫做 pyvenv||-淘宝 开店。pyvenv 通常會安裝你可用的 Python 中最新的版本||_南京日志。這個腳本也能指定安裝一個特定的版本的 Python-|_金义大都市,因此如果在你的係統中有多個版本的 Python 的話__-货车司机罢运最新动态,你可以運行 pyvenv-3.4 或者你想要的任何版本來選擇一個指定的 Python 版本--苏耀光。
    要創建一個 virtualenv--|106福彩苹果下载,首先決定一個你想要存放的目錄接著運行 pyvenv 後麵攜帶著目錄名:
    pyvenv tutorial-env
    如果目錄不存在的話-|105彩票骗局,這將會創建一個 tutorial-env 目錄||金南珠主演的电视剧,並且也在目錄裏麵創建一個包含 Python 解釋器__西咸新区最新消息,標準庫|_无氨显影液,以及各種配套文件的 Python “副本”|||丰田路霸汽车报价。
    一旦你已經創建了一個虛擬環境|-_中国最大的七星彩加急版交换论坛,你必須激活它__-4466k最近10天更新。
    在 Windows 上|_陈龙 羽毛球,運行:
    tutorial-env/Scripts/activate
    在 Unix 或者 MacOS 上_|-金陵御沁园,運行:
    source tutorial-env/bin/activate
    (這個腳本是用 bash shell 編寫的注册送18彩金的时时彩。如果你使用 csh 或者 fish shell--诸葛智彩软件怎么样,你應該使用 activate.csh 和 activate.fish 來替代__dsound.dll病毒。)
    激活了虛擬環境會改變你的 shell 提示符-铲运机型号,顯示你正在使用的虛擬環境|_滤菌器,並且修改了環境以致運行 python 將會讓你得到了特定的 Python 版本|3550幸运彩票网址。例如:
    -> source ~/envs/tutorial-env/bin/activate
    (tutorial-env) -> python
    Python 3.4.3+ (3.4:c7b9645a6f35+, May 22 2015, 09:31:25)
    ...

import sys
sys.path
['', '/usr/local/lib/python34.zip', ...,
'~/envs/tutorial-env/lib/python3.4/site-packages']

12.3. 使用 pip 管理包
一旦你激活了一個虛擬環境|_-qq猪猪领养,可以使用一個叫做 pip 程序來安裝|_掌上彩票pro有安卓版吗,升級以及刪除包-|哈刚少侠。默認情況下 pip 將會從 Python Package Index-|-身份证正反面图片,https://pypi.python.org/pypi_-媚行深宫 菏泽天下, 中安裝包|__乒乓球教学视频下载。你可以通過 web 瀏覽器瀏覽它們__无主之地2发型不好的日子,或者你也能使用 pip 有限的搜索功能:
(tutorial-env) -> pip search astronomy
skyfield - Elegant astronomy for Python
gary - Galactic astronomy and gravitational dynamics.
novas - The United States Naval Observatory NOVAS astronomy library
astroobs - Provides astronomy ephemeris to plan telescope observations
PyAstronomy - A collection of astronomy related tools for Python.
...
pip 有許多子命令-_海伦二中贴吧:“搜索”-_|重庆恒丰银行待遇,“安裝”_-盈彩彩票钱提不出来,“卸載”|_2019香港赛马比赛,“freeze”(譯者注_财经郎眼余额宝:這個詞語暫時沒有合適的詞語來翻譯)|广州堂会ktv价格表,等等|_台中市邮编。(請參考 installing-index 指南獲取 pip 更多完整的文檔-__台服vpn。)
你可以安裝一個包最新的版本__|易点彩票3D试机号,通過指定包的名稱:
-> pip install novas
Collecting novas
Downloading novas-3.1.1.3.tar.gz (136kB)
Installing collected packages: novas
Running setup.py install for novas
Successfully installed novas-3.1.1.3
你也能安裝一個指定版本的包-_-公车系列强x轮,通過給出包名後麵緊跟著 == 和版本號:
-> pip install requests==2.6.0
Collecting requests==2.6.0
Using cached requests-2.6.0-py2.py3-none-any.whl
Installing collected packages: requests
Successfully installed requests-2.6.0
如果你重新運行命令(pip install requests==2.6.0)__优化彩票,pip 會注意到要求的版本已經安裝|-云购彩票登录,不會去做任何事情_-地窖囚奴。你也可以提供一個不同的版本號來安裝_l乐蜂网,或者運行 pip install --upgrade 來升級包到最新版本:
-> pip install --upgrade requests
Collecting requests
Installing collected packages: requests
Found existing installation: requests 2.6.0
Uninstalling requests-2.6.0:
Successfully uninstalled requests-2.6.0
Successfully installed requests-2.7.0
pip uninstall 後跟一個或者多個包名將會從虛擬環境中移除這些包|__3分快3计划3期必中。
pip show 將會顯示一個指定的包的信息:
(tutorial-env) -> pip show requests


Metadata-Version: 2.0
Name: requests
Version: 2.7.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: me@kennethreitz.com
License: Apache 2.0
Location: /Users/akuchling/envs/tutorial-env/lib/python3.4/site-packages
Requires:
pip list 將會列出所有安裝在虛擬環境中的包:
(tutorial-env) -> pip list
novas (3.1.1.3)
numpy (1.9.2)
pip (7.0.3)
requests (2.7.0)
setuptools (16.0)
pip freeze 將會生成一個類似需要安裝的包的列表__|车模走秀乳罩脱落,但是輸出采用了 pip install 期望的格式_-掌上彩票无法登录。常見的做法就是把它們放在一個 requirements.txt 文件:
(tutorial-env) -> pip freeze > requirements.txt
(tutorial-env) -> cat requirements.txt
novas==3.1.1.3
numpy==1.9.2
requests==2.7.0
requirements.txt 能夠被提交到版本控製中並且作為一個應用程序的一部分|掌上永辉职工版。用戶們可以使用 install -r 安裝所有必須的包:
-> pip install -r requirements.txt
Collecting novas==3.1.1.3 (from -r requirements.txt (line 1))
...
Collecting numpy==1.9.2 (from -r requirements.txt (line 2))
...
Collecting requests==2.7.0 (from -r requirements.txt (line 3))
...
Installing collected packages: novas, numpy, requests
Running setup.py install for novas
Successfully installed novas-3.1.1.3 numpy-1.9.2 requests-2.7.0
pip 還有更多的選項||_038彩票手机在线。請參考 installing-index 指南獲取關於 pip 完整的文檔-_-盐城一中贴吧。當你編寫一個包並且在 Python Package Index 中也出現的話-_qcc空间,請參考 distributing-index 指南_|银环蛇价格。

日記本
Web note ad 1