通過上班閑暇時間開始學(xué)習(xí)一門腳本語言--python,很早前就有老同學(xué)建議學(xué)習(xí)一門腳本語言對未開開發(fā)會很有幫助,最初考慮選擇哪門語言的時候在python和ruby中糾結(jié)了一下,最后選擇python主要是感覺它的使用用戶更廣。
?
- 開發(fā)環(huán)境
我是在windows平臺下開發(fā)的,python版本官方推薦的是2.7和3.3,我選擇了后者,附上 下載地址 。
事實上,對于新手來說,2.x和3.x確實有一些改變,如果你用2.x的幫助文檔在3.x下開發(fā)可能會遇到一些麻煩(比如print由命令變成了函數(shù))。
在windows下安裝完成后可以在開始菜單看到python目錄,打開python(command line)輸入:print("hello world")回車,如果沒有報錯說明安裝成功了。
?
- 編輯器
python官方自帶了IDLE(Python GUI)編輯器(見上圖),當(dāng)然很多老手都推薦使用這款編輯器,希望新手從0開始,使用這種編輯器沒有太多智能提示,很多代碼都必須自己編寫,這樣能提升新手的熟練度。但我覺得這個太麻煩了,所以用了一段時候就放棄了。
隨后選擇的是python-eclipse插件,在eclipse下開發(fā),這個插件比IDLE更好了一步,但是還是不算完美,要安裝pydev可以在eclipse下 下載這個插件
最后在ITEye無意看到一個python編輯器的宣傳--jetbrains pycharm,下載了社區(qū)版試用了一下感覺非常不錯,提示健全,反應(yīng)迅速,一直用到現(xiàn)在。
當(dāng)然我從老王python也看到一些推薦,因為沒試用過就不發(fā)表評論了。
?
- 學(xué)習(xí)文檔
對于新手,有一本好的入門書籍無疑會讓你學(xué)習(xí)效率事半功倍,我看的是《python基礎(chǔ)教程(第二版)》,里面內(nèi)容非常豐富,跟著文檔邊看邊練,很快就會了。而ITEye的python群組共享了另外兩本python入門電子書《python先入為主》和《簡明Python教程》,前者是老王python給新手的,但是內(nèi)容相當(dāng)淺顯,對我?guī)椭淮螅笳邔ython的數(shù)據(jù)結(jié)構(gòu)、語法等都做了一些總結(jié),建議新手在看了《python基礎(chǔ)教程》之后再去看《簡明python教程》的基礎(chǔ)知識復(fù)習(xí)一下,但是簡明教程中的例子大多跑不起來。
?
- 代碼筆記
好記性不如爛筆頭,下面就是在學(xué)習(xí)python中做的筆記,內(nèi)容也不多,每隔幾天花半個小時溫習(xí)一下,很快就熟悉了。
#coding=gbk #input()用戶獲取用戶輸入 name=input('what is your name?') #print()用于輸出數(shù)據(jù)給用戶 print ('My name is '+name+'!') #repr()和str()都可以轉(zhuǎn)換為字符串 #repr()輸出對Python比較友好,而str()的輸出對用戶比較友好 inta = 111 print('repr='+repr(inta)+' str='+str(inta)) #通過三個雙引號或者單引號可創(chuàng)建換行的長字符串 print("""kaka xi laoshi a""") #通過\n也可以達(dá)到換行的效果 print("hello\nworld") #原始字符串r 作用是讓后面的字符串內(nèi)容不轉(zhuǎn)義,類似于XML中的CDATA print(r"C:\nnd"); #注意:原始字符串不能以\結(jié)尾,即print(r"C:\nnd\")是錯誤的 #常規(guī)序列,java中成為數(shù)組 array1 = ['kakaxi',30] array2 = ['nanuto',15] array12 = array1 + array2 print(array12) #索引,通過索引可以獲取指定數(shù)據(jù) index = "這是一個索引" print("第一個字:"+index[0]) #從左到右,從0、1、2... print("最后一個字:"+index[-1]) #從右到左,從-1、-2、-3... #17*['th']表示連續(xù)17個'th',\在最后可以讓代碼換行 arraya = ['st','nd','rd'] + 17*['th']\ +['st','nd','rd'] + 7*['th']\ +['st'] print(arraya) #分片,可以截取指定的數(shù)組片段 numbers = [1,2,3,4,5,6,7,8,9,10] #1,2默認(rèn)為數(shù)字,則必須轉(zhuǎn)為字符串才能輸出repr() print("取3~6個:"+repr(numbers[3:6])); print("取最后3個:"+repr(numbers[-3:])); #[start:end:step]格式前兩個是分片,最后一個是步長 #步長為1表示取全部值 print("步長為1:"+repr(numbers[0::1])) #步長為2表示每隔1個字取值,依次類推 print("步長為2:"+repr(numbers[0::2])) #步長不能為0但可以為負(fù)數(shù)可以倒著取值 print("步長為-1:"+repr(numbers[::-1])) #這種方式可以復(fù)制一個新數(shù)組 numbersCopy = numbers[:] numbersCopy = numbersCopy[:3] #numbersCopy改變了,不影響numbers的值 print(repr(numbersCopy)); print(repr(numbers)) #序列相加 這樣會將兩個序列合并到一起 array_add = ['a','b','c'] + ['d','e','f'] #序列相乘 用數(shù)字x乘以一個序列會生成新的序列,而新序列中原來的序列被重復(fù)x次 array_multiply = 5*['demo','test'] #下面是生成一個具有10個空間的空序列,None是內(nèi)置值,類似于java的null array_none = [None]*10 array_none[0] = '1' array_none[1] = 2 #分片賦值,可以理解為在索引1前面添加一個序列 array_none[1:1] = [2,3,4] #del刪除指定序列 del還可以刪除其他類型 del array_none[6:] print('array_none:'+repr(array_none)) #in判斷是否有指定數(shù)據(jù),返回true,false inboolean = 'a' in array_add print(inboolean) #len()返回序列總共多少個值 print(len(array_add)) #min()返回序列第一個值 print(min(array_add)) #max()返回序列最后一個值 print(max(array_add)) #list()可以將字符串轉(zhuǎn)換為list print("list()方法:"+repr(list('hello'))) lst = [1,2,3] #在list后面追加對象 lst.append(4) print("lst.append():"+repr(lst)) lsta = [1,2,3] lstb = [4,5,6] lsta.extend(lstb); #extend()將序列合并到一起,比+性能要高 print("lst.extend():"+repr(lsta)); #返回第一個匹配的序列索引 print("lst.index():"+repr(lsta.index(2))) #insert()在指定索引位置新增一個數(shù)據(jù) lsta.insert(2,'aaa'); #pop()彈出序列最后一位并且返回原值 print("lst.pop()"+repr(lsta.pop())) #remove()移出列表中第一個匹配項 lsta.remove(1) #reverse列表反轉(zhuǎn) lsta.reverse() #sort列表重新排序 #lsta.sort() #前面的列表是可變可修改的,下面介紹的元組是不能修改的 tuple1 = (1,2,3) #一個元組一定要有逗號結(jié)束 tuple2 = (1,) #創(chuàng)建一個具有3個1的元組 tuple3 = 3*(1,) #tuple()能將指定數(shù)據(jù)轉(zhuǎn)換成元組 tuple([1,2,3]) tuple('abc') #元組的索引訪問也很簡單 print("元組[1]:"+str(tuple1[1])) #元組可以用于map映射中的key,而序列是不行的 #字符串格式化,類似于java的占位符,可以將元組中的數(shù)據(jù)依次填入字符串中補充 str1 = '你%s中%s' #好像只能是元組才能格式 lstStr1 = ('好','國') print(str1%lstStr1); #更多格式化參考:http://www.cnblogs.com/JerySpace/archive/2010/12/17/1909621.html string = 'This is a string!' #find返回字符串第一個匹配的索引,沒有匹配返回-1 print("string.find():"+ repr(string.find('is')) ) #join()是split的逆方法,用于將數(shù)組轉(zhuǎn)換為字符串 seq = ['1','2','3','4','5'] sep = '+' print("join():"+sep.join(seq)) #lower()字符串全部小寫 注:lower會返回一個小寫的字符串,string值不變 print('replace:'+string.lower()) #replace()全部替換匹配的字符串 注:replace會返回一個被替換的字符串,string值不變 print('replace:'+string.replace('is','kaka')) #split()分割字符串并轉(zhuǎn)換成list print('split:'+repr( string.split(' ') )) #strip()去字符串兩頭的空格,類似于java的trim print(string.strip()) #數(shù)據(jù)結(jié)構(gòu)“字典”,類似于java的map,有key和value之分,每一組值由逗號分隔 map1 = {'kaka':'30','nanuto':'15','sasiki':'15'} #len()返回字典的總個數(shù) print("len(d):"+str(len(map1))) #d[key]直接返回指定key的值 print("d[key]:"+map1['kaka']) #d[key] = value給指定key賦值 map1['kaka'] = 31 #根據(jù)key刪除指定map del map1['sasiki'] #判斷是否包含指定key print("str in map:"+str('nanuto' in map1)) #從map中提取指定key到占位符中 print("map格式化:"+"kaka's age is %(kaka)s" %map1) map2 = {'A1':'123','A2':'456','A3':'789'} #copy一份全新的map對象 deepcopy深度復(fù)制 map3 = map2.copy() #clear清空map map2.clear(); #get()也是根據(jù)key獲取指定值,比map[index]好的地方是key不存在不會報錯 map2.get('A6') #items將map分解成一個個對象 map2.items() #items將map轉(zhuǎn)換成迭代器,依次迭代,比items性能高 #map2.iteritems() #keys和iterkeys與前面類似,只是迭代map中的key #values和itervalues迭代獲取map的值 #pop(key)根據(jù)key刪除指定數(shù)據(jù) map3.pop('A1'); #update利用一個字典更新另一個字段 map3.update(map2); #import的幾種方式 #import math 調(diào)用math.sqrt(4) #import math as foobar 調(diào)用foobar.sqrt(4) #from somemodule import math 調(diào)用somemodule.sqrt(4) 前提:somemodule不能有sqrt方法 stringif = 'abcdefg' #常規(guī)的if...else... if stringif.startswith("abc"): print("stringif.startswith abc") else: print("stringif.startswith !abc") #if...elif...else... if 1==1: print("1==1") elif 2==2: #pass關(guān)鍵字不執(zhí)行任何邏輯,開發(fā)人員可能未完成該片段代碼,可以用pass代替防止編譯報錯 pass else: print("else") #while循環(huán)只有滿足表達(dá)式才會退出 printstr = input("print 'a'") whileCount = 0 while printstr != "a": #輸入錯誤超過3次則跳出循環(huán) if whileCount == 3: #break跳出while循環(huán) continue跳出本次邏輯,執(zhí)行下一次邏輯 break whileCount += 1 printstr = input("print 'a'") print("input right!") forList = ["a","b","c","d","e"] #for循環(huán) for for_ in forList: print("forList:"+for_) forMap = {"a":"1","b":"2","c":"3"} #for循環(huán)Map 獲得的是key for for_ in forMap: print("forMap key:"+for_+" value:"+forMap[for_]) #del只能刪除變量名,而變量值是不能(也不需要)被開發(fā)刪除的 delStr = ["刪","除"] copyDelStr = delStr del delStr print("del delStr:"+str(copyDelStr)) #exec方法用于運行字符串類型的python語句 exec("print('exec()')")
?
# coding=gbk #使用def定義一個新方法 def method1(str): return "Your parm is:"+str print(method1("china")) #help中傳入方法名就能夠獲得該方法的注釋信息 help(method1) def combine(parameter): #使用globals()['全局變量']的形式可以獲得全局變量名 print(parameter + globals()['parameter']) parameter = ' time' combine('begin') def combine_(): #使用global可以在方法內(nèi)修改全局變量y的值 global y y = y + 1 y = 1 combine_() print("y's value:"+str(y)) #python支持方法中嵌套方法,這種行為可以稱作“閉包” def multiplier(factory): def multiplyByFactory(number): return factory*number return multiplyByFactory double = multiplier(2) #此時獲得的是multiplyByFactory方法 print(repr(double(5))) #此時獲得的是multiplyByFactory執(zhí)行的返回值 #另一種調(diào)用嵌套方法 print(repr(multiplier(2)(5)))
?
# coding=gbk #使用def定義一個新方法 def method1(str): return "Your parm is:"+str print(method1("china")) #help中傳入方法名就能夠獲得該方法的注釋信息 help(method1) def combine(parameter): #使用globals()['全局變量']的形式可以獲得全局變量名 print(parameter + globals()['parameter']) parameter = ' time' combine('begin') def combine_(): #使用global可以在方法內(nèi)修改全局變量y的值 global y y = y + 1 y = 1 combine_() print("y's value:"+str(y)) #python支持方法中嵌套方法,這種行為可以稱作“閉包” def multiplier(factory): def multiplyByFactory(number): return factory*number return multiplyByFactory double = multiplier(2) #此時獲得的是multiplyByFactory方法 print(repr(double(5))) #此時獲得的是multiplyByFactory執(zhí)行的返回值 #另一種調(diào)用嵌套方法 print(repr(multiplier(2)(5))) #創(chuàng)建類 class Person: def setName(self,name): self.name = name def getName(self): return self.name def printName(self): print("Your name is:"+self.name) kaka = Person() lami = Person() kaka.setName("kaka") lami.name = "lami" kaka.printName() lami.printName() class SecurityClass: def publicMethod(self): print("This is publicMethod") self.__privateMethod() def __privateMethod(self):#雙下劃線表示對外隱藏的方法 print("This is privateMethod") security = SecurityClass() security.publicMethod() #繼承父類,通過Class(父類)的形式即可繼承父類 class ChlildClass(SecurityClass): def publicMethod(self): print("This is childClass's publicMethod") chlildClass = ChlildClass() chlildClass.publicMethod() #可繼承多個父類 class ChildsClass(SecurityClass,Person): pass #issubclass(子類,父類)用于判斷子類是否繼承父類 print("是否繼承父類:"+repr(issubclass(ChlildClass,SecurityClass))) print("是否繼承父類:"+repr(issubclass(SecurityClass,ChlildClass))) #通過Class.__bases__可獲得該類繼承的所有子類 print("基類集合:"+repr(ChlildClass.__bases__)) print("判斷對象是否有該方法:"+repr(hasattr(ChlildClass,'publicMethod'))) #自定義異常 class BusinessException(Exception): pass #try...except...捕獲異常 try: print(repr(3/0)) except ZeroDivisionError: if 1==1: print("3/0異常!") else: raise #拋出異常 try: print(repr(3/0)) except (ZeroDivisionError,Exception):#可以通過園組的形式監(jiān)聽多種異常 print("3/0異常!") try: print(repr(3/0)) except (ZeroDivisionError,Exception) as e:#通過Exception as e獲取異常信息 print("異常e:"+repr(e)) #except...else...finally...三者可以混用 try: print(repr(3/0)) except (ZeroDivisionError,Exception) as e:#通過Exception as e獲取異常信息 print("異常e:"+repr(e)) else: print("無異常") finally: print("finally代碼塊!") class Demo(SecurityClass): #__init__構(gòu)造方法用于對象創(chuàng)建時使用,__del__析構(gòu)方法用于對象銷毀時調(diào)用 def __init__(self,name='demo'): SecurityClass.__init__(self) #可以調(diào)用父類的構(gòu)造方法 self.name = name demo = Demo() print(demo.name) demo2 = Demo('demo...') print(demo2.name) #靜態(tài)方法 class StaticClass: @staticmethod def sMethod(): print("This is static method!") @classmethod def cMethod(cls): print("This is class method!",cls) StaticClass.sMethod() StaticClass.cMethod() nested = [[1,2],[3,4],[5]] def demoMethod(nested): for lst1 in nested: for lst2 in lst1: yield lst2 #簡單生成器,可當(dāng)做迭代器使用 for number in demoMethod(nested): print(number) #遞歸生成器,可處理無限層數(shù)的列表 def yieldMethod(nested): for lst1 in nested: for lst2 in yieldMethod(lst1): yield lst2
?
__author__ = 'Administrator' #coding=gbk #讀寫文件 source = "C:\\copy\\alibaba.txt" newWord = ''' 大家好 才是真的 好! ''' #第一種寫文件 f = open(source,'w') #w寫 f.write(newWord) f.close() #第一種讀全部內(nèi)容 f = open(source) #默認(rèn)只讀 try: print(f.read()) finally: f.close() #第二種在文件末尾追加 f = open(source,'a') f.write("你好python!") f.close() #第二種一行一行讀 print("====第二種====") f = open(source,'r') #r為只讀 while True: line = f.readline() if not line: break print(line)#奇怪的是每一行都會換行 f.close() #注:在大文件下使用readlines(sizehint)比使用read性能要好,原因是前者可以定義緩沖區(qū)最大閥值,而后者會占用全部緩沖區(qū).writelines同理! #更多文件讀寫,參考http://www.cnblogs.com/allenblogs/archive/2010/09/13/1824842.html
?
__author__ = 'Administrator' #coding=gbk import sqlite3 import time #使用sqlLite進(jìn)行數(shù)據(jù)庫操作 #sqlLite在高版本python已經(jīng)成為內(nèi)置包,所以可以不用引入任何第三方插件使用 #connect傳入?yún)?shù)是數(shù)據(jù)庫文件,可以是絕對路徑,也可以是相對路徑,如果已存在則直接使用,不存在則創(chuàng)建一個新庫 conn = sqlite3.connect("testDB.db") curs = conn.cursor() conn.commit() conn.close() def executeSQL(): createStr = ''' CREATE TABLE food( id TEXT PRIMARY KEY, name TEXT, price FLOAT ) ''' conn = sqlite3.connect("testDB.db") curs = conn.cursor() #①執(zhí)行表添加操作 try: curs.execute(createStr) except sqlite3.OperationalError as e: conn.rollback() print(repr(e)) #②執(zhí)行數(shù)據(jù)添加操作 insert = "INSERT INTO food VALUES(?,?,?)" values = [time.strftime("%Y%m%d%H%M%S"),'面包',5] try: curs.execute(insert,values) conn.commit() print("insert success!") except sqlite3.ProgrammingError: conn.rollback() raise #③執(zhí)行數(shù)據(jù)查詢操作 query = "SELECT * FROM food" curs.execute(query) for row in curs.fetchall(): valueStr = "" for value in row: #因為price字段是float,所以要str(),如果用repr又是另一種景象,自己嘗試 valueStr = valueStr + str(value) + " " print(valueStr) conn.close() executeSQL()
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
