注意:對於我這個以前用c/c++的同學來說,可能一開始學習pyhon時有點不適應的,為什么呢?因為吧,python中,沒有這玩意:{},也不用每句話才用分號分開的。python中通過縮進來分塊的,一行占個句話就可以啦。下面的學習基於python2.7
from __future__import division
開始啦,邊學習邊作筆記
參考http://www.liaoxuefeng.com/,另外,還有其它的一些資料。
基本輸入輸出語句print和raw_input():
#輸入語句: >>> print'100+100=%d' %(100+100) 100+100=200 #輸出語句 >>> name = raw_input('input your name:') input your name:yinheyi >>> print('hello,%s' %name) hello,yinheyi注意:raw_input()語句接收以后,默認保存為str格式哦,如果要比較大小的話,記得轉為int類型。
>>> number = raw_input('input a number:') input a number:12 >>> type(number) <type 'str'> >>> number = int(raw_input('input a number:')) input a number:12 >>> type(number) <type 'int'>
判斷與循環語句:
判斷語句:if…elif…else
>>> if a>= 50: ... print 'the number is big' ... elif a < 50: ... print'the number is small' ... else: ... print "i don't know" ... the number is big循環語句: for…in
>>> sum = 0 >>> for number in range(101): ... sum = sum + number ... >>> print sum 5050循環語句: while
>>> sum = 0 >>> n = 1 >>> while n < 101: ... sum = sum + n ... n = n + 1 ... >>> print sum 5050
數據類型:列表、元組、字典、set
list: Python內置的一種數據類型是列表。lists是一個有序的集合,可以添加與刪除元素。
生成它是用 [] 就可以啦;
調用它時,用下標調用就可以啦(從0開始);如第一個元素,list[0];倒數第一個,list[-1];
可以用len()函數獲得list元素的個數;
在尾部添加用append(), 中間插入用insert();尾部刪除用pop();指定位置刪除為pop(i);
#定義一個friends的列表 >>> friends = ['xiaoming','ergou','sanmao'] >>> friends ['xiaoming', 'ergou', 'sanmao'] >>> friends[0] 'xiaoming' >>> friends[-1] 'sanmao' #添加與刪除 >>> friends.append('dapeng') >>> friends ['xiaoming', 'ergou', 'sanmao', 'dapeng'] >>> friends.insert(0,'diyi') >>> friends ['diyi', 'xiaoming', 'ergou', 'sanmao', 'dapeng'] >>> friends.pop() 'dapeng' >>> friends ['diyi', 'xiaoming', 'ergou', 'sanmao'] >>> friends.pop(2) 'ergou' >>> friends ['diyi', 'xiaoming', 'sanmao'] #替換 >>> friends[0] = 'wangbadan' >>> friends ['wangbadan', 'xiaoming', 'sanmao']元組(tuple):tuple和list非常類似,但是tuple一旦初始化就不能修改。只要記住它不能修改就可以啦。很安全。
用 () 定義啊。
用下標調用,即tuple[1];
注意:它定義一個元素的tuple時,一定要這樣寫,如:name = (‘yin’,), 千萬別寫成 name = (‘yin’);
name = ('zhai','yin') >>> name ('zhai', 'yin') >>> name[0] 'zhai' >>> name[-1] 'yin'
字典(dictionary):它就是鍵-值對。如在C++語言中為map的容器。它的特點就是可以快速查找,需要占用大量的內存,內存浪費多。通過key計算位置的算法稱為哈希算法(Hash)。
用 {} 定義dictionary哦;
隨着dictionary的增加,查找時間不會增加的。
多次對一個key放入value,后面的值會把前面的值沖掉:
可以用 ‘key’in dic 或 dic.get(‘key’)的方法來查看key是否存在。注意:dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value,返回None的時候Python的交互式命令行不顯示結果。
刪除用: pop(key)。添加時,直接用key值的索引添加就可以的。
注意:ict內部存放的順序和key放入的順序是沒有關系的。
#定義一個dictionary; score = {'xiaoming':85,'xiaohong':62} >>> score {'xiaoming': 85, 'xiaohong': 62} #添加一個元素; >>> score['wangdan'] = 85 >>> score {'xiaoming': 85, 'xiaohong': 62, 'wangdan': 85} #刪除一個元素; >>> score.pop('xiaohong') 62 >>> score {'xiaoming': 85, 'wangdan': 85} #查看key是否存在; >>> 'xiaoming' in score True #查看一個key對應的值; >>> score.get('wangdan') 不存在時,返回一個自定義的值; 85>>> score.get('hehehe',-1) -1
set:set和dict類似,也是一組key的集合,但不存儲value。由於key不能重復,所以,在set中,沒有重復的key。set和dict的唯一區別僅在於沒有存儲對應的value,但是,set的原理和dict一樣,所以,同樣不可以放入可變對象。
要創建一個set,需要提供一個list作為輸入集合:
通過add(key)與remove(key)添加與刪除元素;
>>> s = set([1, 2, 3]) >>> s set([1, 2, 3])注意,傳入的參數
[1, 2, 3]
是一個list,而顯示的set([1, 2, 3])
只是告訴你這個set內部有1,2,3這3個元素,顯示的[]不表示這是一個list。重復元素在set中自動被過濾:
>>> s = set([1, 1, 2, 2, 3, 3]) >>> s set([1, 2, 3])添加與刪除
>>> s = set([1,2,3]) >>> s set([1, 2, 3]) >>> s.add('xiaoming') >>> s set([1, 2, 3, 'xiaoming']) >>> s.add(0) >>> s set([0, 1, 2, 3, 'xiaoming']) >>> s.remove(2) >>> s set([0, 1, 3, 'xiaoming'])
一些高級操作:
對於list與tuple的切片操作:
如list[:5]或list[0:5]表示第0,1,2,3,4個索引值;當然也可以為負的如,list[-2:0]等於list[-2:]即倒數第2、倒數第1個數;也可以跳着來哦:list[1:10:2],表示步長為2的。
list=range(100) #正着切片 >>> list[:10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] #負索引切片 list[-10:] [90, 91, 92, 93, 94, 95, 96, 97, 98, 99] #倒着切片 >>> list[10:0:-1] [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> list[-1:-10:-1] [99, 98, 97, 96, 95, 94, 93, 92, 91] #跳着切片 >>> list[::10] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
#tuple的切片 >>> (0, 1, 2, 3, 4, 5)[:3] (0, 1, 2) #字符串的切片 >>> 'ABCDEFG'[:3] 'ABC' >>> 'ABCDEFG'[::2] 'ACEG'
它的迭代:
對於list、tuple還有字符串都可以用 for…in 進行迭代哦;
而對於dictionary的話,也可以哦,只不過默認情況下,dict迭代的是key。如果要迭代value,可以用
for value in d.itervalues()
,如果要同時迭代key和value,可以用for k, v in d.iteritems()
。那么,如何判斷一個對象是可迭代對象呢?方法是通過collections模塊的Iterable類型判斷:
另外:Python內置的
enumerate
函數可以把一個list、tuple、字符串本身變成索引-元素對,這樣就可以在for
循環中同時迭代索引和元素本身:>>> from collections import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>> isinstance([1,2,3], Iterable) # list是否可迭代 True >>> isinstance(123, Iterable) # 整數是否可迭代 False
列表生成式:很牛逼很方便的;它是用來創建list的生成式;我們舉例子看看哈:
生成1-10的list:
>>> range(1,11) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
生成 12、22、……102的list:
>>> list = [x*x for x in range(1,11)] >>> list [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]還可以再選擇一下哦:
>>> [x * x for x in range(1, 11)if x % 2 == 0] [4, 16, 36, 64, 100]還可以兩層循環的:
>>> [m + n for m in 'ABC' for n in 'XYZ'] ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器:
通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數元素占用的空間都白白浪費了。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator)。
創建方法1:第一種方法很簡單,只要把一個列表生成式的
[]
改成()
,就創建了一個generator:>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x104feab40>可以通過generator的.next()方法打印出來數據,另外也可以通過迭代哦,基本上我們都選擇for…in迭代方法。
創建方法2:通過特殊函數創建:如果一個函數定義中包含
yield
關鍵字,那么這個函數就不再是一個普通函數,而是一個generator。#這是函數,輸出斐波那契數列 def fib(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1 #這是generator,也是生成斐波那契數列; def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1
注意:這里,最難理解的就是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用
next()
的時候執行,遇到yield
語句返回,再次執行時從上次返回的yield
語句處繼續執行。>>> def odd(): ... print 'step 1' ... yield 1 ... print 'step 2' ... yield 3 ... print 'step 3' ... yield 5 ... >>> o = odd() >>> o.next() step 1 1 >>> o.next() step 2 3 >>> o.next() step 3 5 >>> o.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
最后,如果你覺得以上內容對你有幫助,作為回報,那就可以打賞一下我這個窮學生吧,以資助我買幾本書。
錢也不用太多,您可以選擇:2毛,5毛、1元。
如果對你沒有幫助,那就算了。