?

          Python學(xué)習(xí)筆記(一)

          ?????
          # ?_*_?coding:gb2312?_*_?:這樣制定程序的編碼;
          建議如果使用中文,最好用utf - 8 ?(用utf - 8的時(shí)候,),或者gb2312。
          ?????復(fù)數(shù)?
          可以直接表示復(fù)數(shù)a?
          = ? 1.5 ? + ? 0.5j ;?
          a.real?:取得實(shí)部
          a.imag?:取得虛部
          abs(a):取得模
          ?????數(shù)據(jù)類型轉(zhuǎn)換
          ?????float(),int(),long()
          ?????我們用a
          ** b?表示?a的b次方
          ?????開方依然是函數(shù)?sqrt(a)
          ?????最近一次表達(dá)式輸出,保存在?_??變量中
          ?????字符串可以通過幾種方式分行。可以在行加反斜杠做為繼續(xù)符,這表示下一行是當(dāng)前行的邏輯沿續(xù)。
          eg:
          hello?
          = ? " This?is?a?rather?long?string?containing\n\
          several?lines?of?text?just?as?you?would?do? in ?C.\n\
          ????Note?that?whitespace?at?the?beginning?of?the?line?
          is \
          ?significant.
          "
          print ?hello
          然而,如果我們創(chuàng)建一個(gè)“行”(
          " raw " )字符串,\?n序列就不會(huì)轉(zhuǎn)為換行,源碼中的反斜杠和換行符n都會(huì)做為字符串中的數(shù)據(jù)處理。如下所示:?
          hello?
          = ?r " This?is?a?rather?long?string?containing\n\
          several?lines?of?text?much?as?you?would?do? in ?C. "
          print ?hello
          would?
          print :?
          會(huì)打印為:?
          This?
          is ?a?rather?long?string?containing\n\
          several?lines?of?text?much?as?you?would?do?
          in ?C.
          另外,字符串可以用一對三重引號(hào)”””或
          ''' 來標(biāo)識(shí)。三重引號(hào)中的字符串在行尾不需要換行標(biāo)記,所有的格式都會(huì)包括在字符串中。?
          print?"""
          Usage:?thingy?[OPTIONS]
          ?????-h????????????????????????Display?this?usage?message
          ?????-H?hostname???????????????Hostname?to?connect?to
          """
          produces?the?following?output:?
          生成以下輸出:?Usage:?thingy?[OPTIONS]
          ?????-h????????????????????????Display?this?usage?message
          ?????-H?hostname???????????????Hostname?to?connect?to
          聯(lián)想到HTML?中的pre標(biāo)簽。
          ?????Python?已經(jīng)有了幾個(gè)復(fù)合數(shù)據(jù)類型,用于組織其它的值。最通用的是鏈表,它寫為中括之間用逗號(hào)分隔的一列值(子項(xiàng)),鏈表的子項(xiàng)不一定是同一類型的值。?
          >>>?a?=?['spam',?'eggs',?100,?1234]
          ?????內(nèi)置函數(shù)len()也同樣可以用于鏈表:?
          >>>?len(a)
          ?????if?語句
          if?x?==?1:
          ?…
          elif?x?==?0:

          else:
          ??…

          可能會(huì)有零到多個(gè)?elif?部分,else?是可選的。關(guān)鍵字“elif”?是“?else?if?”的縮寫,這個(gè)可以有效避免過深的縮進(jìn)。if??elif??elif??序列用于替代其它語言中的?switch?或?case?語句。
          注意是elif?不是elseif。容易混淆吧。還有其中的冒號(hào)別忘了。
          ?????for語句
          for?x?in?a:
          ?????print?x,?len(x)
          類似java或者js中遍歷對象的形式。記得加上冒號(hào)。
          當(dāng)然這和傳統(tǒng)意義上的for語句差別還是很大。
          ?????range()?函數(shù)
          如果你需要一個(gè)數(shù)值序列,內(nèi)置函數(shù)range()可能會(huì)很有用,它生成一個(gè)等差級(jí)數(shù)鏈表。?
          >>>?range(10)
          [0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
          range(10)?生成了一個(gè)包含10個(gè)值的鏈表,它準(zhǔn)確的用鏈表的索引值填充了這個(gè)長度為10的列表,所生成的鏈表中不包括范圍中的結(jié)束值。也可以讓range操作從另一個(gè)數(shù)值開始,或者可以指定一個(gè)不同的步進(jìn)值(甚至是負(fù)數(shù),有時(shí)這也被稱為“步長”):?
          >>>?range(5,?10)
          [5,?6,?7,?8,?9]
          >>>?range(0,?10,?3)
          [0,?3,?6,?9]
          >>>?range(-10,?-100,?-30)
          [-10,?-40,?-70]
          需要迭代鏈表索引的話,如下所示結(jié)合使?用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
          在序列中循環(huán)時(shí),索引位置和對應(yīng)值可以使用enumerate()函數(shù)同時(shí)得到。?
          for?i,?v?in?enumerate(['tic',?'tac',?'toe']):
          ?????print?i,?v

          同時(shí)循環(huán)兩個(gè)或更多的序列,可以使用?zip()?整體解讀。?
          >>>?questions?=?['name',?'quest',?'favorite?color']
          >>>?answers?=?['lancelot',?'the?holy?grail',?'blue']
          >>>?for?q,?a?in?zip(questions,?answers):
          ?????print?'What?is?your?%s???It?is?%s.'?%?(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.

          ?????pass?語句
          pass?語句什么也不做。它用于那些語法上必須要有什么語句,但程序什么也不做的場合,例如:?
          >>>?while?True:
          ???????pass?
          ?????def?
          def?fib(n):????#?write?Fibonacci?series?up?to?n
          ?????"""Print?a?Fibonacci?series?up?to?n."""
          ?????a,?b?=?0,?1
          ?????while?b?<?n:
          ?????????print?b,
          ?????????a,?b?=?b,?a+b

          >>>?#?Now?call?the?function?we?just?defined:
          ?fib(2000)
          1?1?2?3?5?8?13?21?34?55?89?144?233?377?610?987?1597
          關(guān)鍵字?def?引入了一個(gè)函數(shù)定義。在其后必須跟有函數(shù)名和包括形式參數(shù)的圓括號(hào)。函數(shù)體語句從下一行開始,必須是縮進(jìn)的。函數(shù)體的第一行可以是一個(gè)字符串值,這個(gè)字符串是該函數(shù)的?(文檔字符串(documentation?string)),也可稱作?docstring?。
          ?????深入鏈表
          append(?x)?
          把一個(gè)元素添加到鏈表的結(jié)尾,相當(dāng)于?a[len(a):]?=?[x]?
          extend(?L)?
          通過添加指定鏈表的所有元素來擴(kuò)充鏈表,相當(dāng)于?a[len(a):]?=?L。?
          insert(?i,?x)?
          在指定位置插入一個(gè)元素。第一個(gè)參數(shù)是準(zhǔn)備插入到其前面的那個(gè)元素的索引,例如a.insert(0,?x)?會(huì)插入到整個(gè)鏈表之前,而a.insert(len(a),?x)?相當(dāng)于?a.append(x)。?
          remove(?x)?
          刪除鏈表中值為x的第一個(gè)元素。如果沒有這樣的元素,就會(huì)返回一個(gè)錯(cuò)誤。?
          pop(?[i])?
          從鏈表的指定位置刪除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個(gè)元素。元素隨即從鏈表中被刪除。(方法中i兩邊的方括號(hào)表示這個(gè)參數(shù)是可選的,而不是要求你輸入一對方括號(hào),你會(huì)經(jīng)常在Python?庫參考手冊中遇到這樣的標(biāo)記。)?
          index(?x)?
          返回鏈表中第一個(gè)值為x的元素的索引。如果沒有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。?
          count(?x)?
          返回x在鏈表中出現(xiàn)的次數(shù)。?
          sort(?)?
          對鏈表中的元素進(jìn)行適當(dāng)?shù)呐判颉?
          reverse(?)?
          倒排鏈表中的元素。?
          ?????函數(shù)化編程工具
          對于鏈表來講,有三個(gè)內(nèi)置函數(shù)非常有用:filter(),?map(),?和?reduce()。?
          "filter(function,?sequence)"返回一個(gè)序列(sequence),包括了給定序列中所有調(diào)用function(item)后返回值為true的元素。(如果可能的話,會(huì)返回相同的類型)。例如,以下程序可以計(jì)算部分素?cái)?shù):?
          >>>?def?f(x):?return?x?%?2?!=?0?and?x?%?3?!=?0

          >>>?filter(f,?range(2,?25))
          [5,?7,?11,?13,?17,?19,?23]
          "map(function,?sequence)"?為每一個(gè)元素依次調(diào)用function(item)并將返回值組成一個(gè)鏈表返回。例如,以下程序計(jì)算立方:?
          >>>?def?cube(x):?return?x*x*x

          >>>?map(cube,?range(1,?11))
          [1,?8,?27,?64,?125,?216,?343,?512,?729,?1000]

          兩者區(qū)別:?map返回的是?函數(shù)結(jié)果序列。filter返回的是函數(shù)返回結(jié)果為true的參數(shù)。(相當(dāng)于過濾)
          可以傳入多個(gè)序列,函數(shù)也必須要有對應(yīng)數(shù)量的參數(shù),執(zhí)行時(shí)會(huì)依次用各序列上對應(yīng)的元素來調(diào)用函數(shù)(如果某些序列比其它的短,就用None來代替)。如果把None做為一個(gè)函數(shù)傳入,則直接返回參數(shù)做為替代。例如:?
          >>>?seq?=?range(8)
          >>>?def?add(x,?y):?return?x+y

          >>>?map(add,?seq,?seq)
          [0,?2,?4,?6,?8,?10,?12,?14]
          "reduce(func,?sequence)"?返回一個(gè)單值,它是這樣構(gòu)造的:首先以序列的前兩個(gè)元素調(diào)用函數(shù),再以返回值和第三個(gè)參數(shù)調(diào)用,依次執(zhí)行下去。例如,以下程序計(jì)算1到10的整數(shù)之和:?
          >>>?def?add(x,y):?return?x+y

          >>>?reduce(add,?range(1,?11))
          55

          實(shí)際上這里就是從1加到10。
          可以傳入第三個(gè)參數(shù)做為初始值。如果序列是空的,就返回初始值,否則函數(shù)會(huì)先接收初始值和序列的第一個(gè)元素,然后是返回值和下一個(gè)元素,依此類推。例如:?
          >>>?def?sum(seq):
          ?????def?add(x,y):?return?x+y
          ?????return?reduce(add,?seq,?0)

          >>>?sum(range(1,?11))
          55
          >>>?sum([])
          0
          注意:?sum([])中的[]是不可以省略的。表示的是一個(gè)鏈表。
          ?????鏈表推導(dǎo)式?以后再看
          ?????del?
          有一個(gè)方法可從鏈表中刪除指定索引的元素:del?語句。這個(gè)方法也可以從鏈表中刪除切片(之前我們是把一個(gè)空鏈表賦給切片)。例如:?
          >>>?a?=?[-1,?1,?66.6,?333,?333,?1234.5]
          >>>?del?a[0]
          >>>?a
          [1,?66.6,?333,?333,?1234.5]
          >>>?del?a[2:4]
          >>>?a
          [1,?66.6,?1234.5]
          del?can?also?be?used?to?delete?entire?variables:?
          del?也可以用于刪除整個(gè)變量:?
          >>>?del?a
          ?????Dictionaries?字典
          一看這名字嚇了跳,結(jié)果和C++中的pair?或者java中的hashmap一個(gè)德性的事物。當(dāng)然javascript用數(shù)組就行了。下面來看看python中字典的特點(diǎn)與具體應(yīng)用。
          字典的主要操作是依據(jù)關(guān)鍵字來存儲(chǔ)和析取值。也可以用?del來刪除關(guān)鍵字:值對。如果你用一個(gè)已經(jīng)存在的關(guān)鍵字存儲(chǔ)值,以前為該關(guān)鍵字分配的值就會(huì)被遺忘。試圖析取從一個(gè)不存在的關(guān)鍵字中讀取值會(huì)導(dǎo)致錯(cuò)誤。

          字典的?keys()方法返回由所有關(guān)鍵字組成的鏈表,該鏈表的順序不定(如果你需要它有序,只能調(diào)用關(guān)鍵字鏈表的sort()?方法)。使用字典的?has_key()方法可以檢查字典中是否存在某一關(guān)鍵字。
          eg:
          tel?=?{'jack':?4098,?'sape':?4139}
          tel['guido']?=?4127
          print?tel
          print?tel['jack']
          del?tel['sape']
          tel['irv']?=?4127
          print?tel
          print?tel.keys()
          print?tel.has_key('guido')

          在字典中循環(huán)時(shí),關(guān)鍵字和對應(yīng)的值可以使用?iteritems()方法同時(shí)解讀出來。?
          knights?=?{'gallahad':?'the?pure',?'robin':?'the?brave'}
          for?k,?v?in?knights.iteritems():
          print?k,?v
          ?????模塊
          不用多說,C++中有?include?,java中?import?
          ?????dir()
          內(nèi)置函數(shù)?dir()?用于按模塊名搜索模塊定義,它返回一個(gè)字符串類型的存儲(chǔ)列表
          import?sys

          print?dir(sys)
          ?['__displayhook__',?'__doc__',?'__excepthook__',?'__name__',?'__stderr__',?'__stdin__',?'__stdout__',?'_current_frames',?'_getframe',?'api_version',?'argv',?'builtin_module_names',?'byteorder',?'call_tracing',?'callstats',?'copyright',?'displayhook',?'dllhandle',?'exc_clear',?'exc_info',?'exc_type',?'excepthook',?'exec_prefix',?'executable',?'exit',?'exitfunc',?'getcheckinterval',?'getdefaultencoding',?'getfilesystemencoding',?'getrecursionlimit',?'getrefcount',?'getwindowsversion',?'hexversion',?'maxint',?'maxunicode',?'meta_path',?'modules',?'path',?'path_hooks',?'path_importer_cache',?'platform',?'prefix',?'setcheckinterval',?'setprofile',?'setrecursionlimit',?'settrace',?'stderr',?'stdin',?'stdout',?'subversion',?'version',?'version_info',?'warnoptions',?'winver']
          dir()?不會(huì)列出內(nèi)置函數(shù)和變量名。如果你想列出這些內(nèi)容,它們在標(biāo)準(zhǔn)模塊?__builtin__中定義:?
          >>>?import?__builtin__
          >>>?dir(__builtin__)

          ?????Packages

          包通常是使用用“圓點(diǎn)模塊名”的結(jié)構(gòu)化模塊命名空間。例如,名為?A.B?的模塊表示了名為?"B"?的包中名為?"A"?的子模塊。正如同用模塊來保存不同的模塊架構(gòu)可以避免全局變量之間的相互沖突,使用圓點(diǎn)模塊名保存像?NumPy?或?Python?Imaging?Library?之類的不同類庫架構(gòu)可以避免模塊之間的命名沖突。
          需要注意的是使用?from?package?import?item?方式導(dǎo)入包時(shí),這個(gè)子項(xiàng)(item)既可以是包中的一個(gè)子模塊(或一個(gè)子包),也可以是包中定義的其它命名,像函數(shù)、類或變量。import?語句首先核對是否包中有這個(gè)子項(xiàng),如果沒有,它假定這是一個(gè)模塊,并嘗試加載它。如果沒有找到它,會(huì)引發(fā)一個(gè)?ImportError?異常。?
          相反,使用類似import?item.subitem.subsubitem?這樣的語法時(shí),這些子項(xiàng)必須是包,最后的子項(xiàng)可以是包或模塊,但不能是前面子項(xiàng)中定義的類、函數(shù)或變量。
          posted on 2008-04-10 09:34 -274°C 閱讀(1033) 評(píng)論(0)  編輯  收藏 所屬分類: python

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 914107
          • 排名 - 40

          最新評(píng)論

          主站蜘蛛池模板: 黄梅县| 耿马| 满城县| 鄱阳县| 肃南| 讷河市| 珠海市| 靖州| 通州市| 云阳县| 宁河县| 香港 | 昭觉县| 盐津县| 萝北县| 商丘市| 荆门市| 瑞昌市| 新郑市| 桦川县| 板桥市| 白朗县| 沈丘县| 鹰潭市| 灵寿县| 桃源县| 襄汾县| 峨边| 沈丘县| 平罗县| 江安县| 清河县| 三亚市| 文安县| 西畴县| 手机| 普陀区| 衢州市| 濮阳市| 武胜县| 丰原市|