Python一點一點學習中。。。
聲明:
本文部分內容Copy自大牛們的部落格下面會列出:
3 4 5 6 7 8 9 10==>http://harmony.relax.blogbus.com/logs/12303417.html
12 ====>http://my.chinaunix.net/space.php?uid=1721137&do=blog&id=274710
http://linuxtoy.org/archives/python-collection-tips.html
感謝作者們。
更多tips,http://www.siafoo.net/article/52
1. 條件選擇and or
用過C的想必都對(a>1)?1:2 這樣的運算式情有獨鐘,Python裡邊應該怎麼做呢?
In [15]: True and 1 or 2Out[15]: 1In [16]: False and 1 or 2Out[16]: 2
還有一種情況是,你經常需要寫這樣的代碼: if( a ) c = a else c = b;
如何用python表達呢: c = a or b
In [10]: a = 0In [11]: b = 1In [12]: c = a or bIn [13]: cOut[13]: 1
那麼and呢
In [1]: a= 1 and 2In [2]: aOut[2]: 2In [3]: a = 1 or 2In [4]: aOut[4]: 1In [5]: a = 1 and 0In [6]: aOut[6]: 0
2. zip + dict
In [17]: a = "ABCD"In [18]: b = "abcd"In [19]: zip(a,b)Out[19]: [('A', 'a'), ('B', 'b'), ('C', 'c'), ('D', 'd')]In [20]: dict(zip(a,b))Out[20]: {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}
3. * and **
問題 Python的函數定義中有兩種特殊的情況,即出現*,**的形式。 如:def myfun1(username, *keys)或def myfun2(username, **keys)等。 * 用來傳遞任意個無名字參數,這些參數會一個Tuple的形式訪問。 **用來處理傳遞任意個有名字的參數,這些參數用dict來訪問。* 應用:########################## “*” 的應用#########################>>> def fun1(*keys):... print "keys type=%s" % type(keys)... print "keys=%s" % str(keys)... for i in range(0, len(keys)):... print "keys[" + str(i) + "]=%s" % str(keys[i])... >>> fun1(2,3,4,5)輸出以下結果:keys type=<type 'tuple'>keys=(2, 3, 4, 5)keys[0]=2keys[1]=3keys[2]=4keys[3]=5########################## “**” 的應用#########################>>> def fun2(**keys):... print "keys type=%s" % type(keys)... print "keys=%s" % str(keys)... print "name=%s" % str(keys['name'])... >>> >>> fun2(name="vp", age=19)輸出以下結果:keys type=<type 'dict'>keys={'age': 19, 'name': 'vp'}name=vp
4、 Lambda 形式
出於適當的需要,有幾種通常在功能性語言和Lisp中出現的功能加入到了Python。通過lambda關鍵字,可以建立很小的匿名函數。這裡有一個函數返回它的兩個參數的和:“lambda a, b: a+b”。 Lambda 形式可以用於任何需要的函數對象。出於文法限制,它們只能有一個單獨的運算式。語義上講,它們只是普通函數定義中的一個文法技巧。類似於嵌套函數定義,lambda形式可以從包含範圍內引用變數:
文法: lambda argument1, argument2,... argumentN :
例子1: >>> def make_incrementor(n):... return lambda x: x + n...>>> f = make_incrementor(42)>>> f(0)42>>> f(1)43例子2: >>> f = lambda x, y, z: x + y + z>>> f(2, 3, 4)9
5、apply
Python 提供了一個內建函數 apply() 來簡化函數調用。>>> def Fun(a, b, c):
print a, b, c >>> a = ("l", "M", "n") >>> Fun(a[0], a[1], a[2]) l M n >>> apply(Fun, a) l M n >>>
6、 filter()函數
filter()函數包括兩個參數,分別是function和list。該函數根據function參數返回的結果是否為真來過濾list參數中的項,最後返回一個新列表,如下例所示:
>>>a=[1,2,3,4,5,6,7] >>>b=filter(lambda x:x>5, a) >>>print b >>>[6,7] 如果filter參數值為None,就使用identity()函數,list參數中所有為假的元素都將被刪除。如下所示: >>>a=[0,1,2,3,4,5,6,7] b=filter(None, a) >>>print b >>>[1,2,3,4,5,6,7]
7、 map()函數
map()的兩個參數一個是函數名,另一個是列表或元組。
>>>map(lambda x:x+3, a) #這裡的a同上 >>>[3,4,5,6,7,8,9,10]#另一個例子>>>a=[1,2,3]>>>b=[4,5,6]>>>map(lambda x,y:x+y, a,b)>>>[5,7,9]
8 、 reduce()函數
reduce 函數可以按照給定的方法把輸入參數中上序列縮減為單個的值,具體的做法如下:首先從序列中去除頭兩個元素並把它傳遞到那個二元函數中去,求出一個值,再把這個加到序列中迴圈求下一個值,直到最後一個值 。
>>>reduce(lambda x,y:x*y, [1,2,3,4,5]#((((1*2)*3)*4)*5 >>>120 >>>reduce(lambda x,y:x*y, [1,2,3], 10) >>>60 #((1*2)*3)*10
9. UserString
Python中字串是Inmutable的,也就是說是不可變的,所有不能寫a[0]='a' 這樣的C語句,但是UserString 這個模組提供了這個特性。
In [1]: import UserString In [2]: a = UserString.MutableString('c'*30) In [3]: a Out[3]: 'cccccccccccccccccccccccccccccc' In [4]: a[0] = 'A' In [5]: a Out[5]: 'Accccccccccccccccccccccccccccc'
10 , Python Tips : 判斷兩個檔案是否相同
python中提供了很便捷的方法來判斷兩個檔案的內容是否相同,只要兩行代碼:
import filecmp filecmp.cmp(r'e:\1.txt',r'e:\2.txt')
如果兩個檔案相同,會輸出True,否則會輸出false。
11 . 動態產生對象
也許你需要根據特定的參數動態產生某個class的執行個體,你需要寫一堆變態的if else嗎,不需要。
#!/usr/bin/env python#--*-- encoding:utf-8 --*--class MyDynamicClass: def say_hello(self, name): print "hello", name def create_dynamic_cls(cls): return globals()[cls]()a = create_dynamic_cls('MyDynamicClass')a.say_hello('Tom.')
12. @classmethod VS @staticmethod
class MyClass: ... @classmethod # classmethod的修飾符 def class_method(cls, arg1, arg2, ...): ... @staticmethod # staticmethod的修飾符 def static_method(arg1, arg2, ...): ...
13.
- exefile("filename.py")
- 直接在互動式命令列執行,所有的表量很狀態都會儲存,適合調試使用。
對於classmethod的參數,需要隱式地傳遞類名,而staticmethod參數中則不需要傳遞類名,其實這就是二者最大的區別。
二者都可以通過類名或者類執行個體對象來調用,因為強調的是classmethod和staticmethod,所以在寫代碼的時候最好使用類名,良好的編程習慣吧。
13.
判斷一個 list 是否為空白
傳統的方式:if len(mylist): # Do something with my listelse: # The list is empty由於一個空 list 本身等同於 False,所以可以直接:if mylist: # Do something with my listelse: # The list is empty
13.
遍曆 list 的同時擷取索引傳統的方式:i = 0for element in mylist: # Do something with i and element i += 1這樣更簡潔些:for i, element in enumerate(mylist): # Do something with i and element pass
14.
list 排序
在包含某元素的列表中依據某個屬性排序是一個很常見的操作。例如這裡我們先建立一個包含 person 的 list:
class Person(object): def __init__(self, age): self.age = agejj傳統的方式是:def get_sort_key(element): return element.agefor element in sorted(persons, key=get_sort_key): print "Age:", element.age更加簡潔、可讀性更好的方法是使用 Python 標準庫中的 operator 模組:from operator import attrgetterfor element in sorted(persons, key=attrgetter('age')): print "Age:", element.age
attrgetter
方法優先返回讀取的屬性值作為參數傳遞給 sorted
方法。operator
模組還包括 itemgetter
和 methodcaller
方法,作用如其字面含義。
15. 在 Dictionary 中元素分組
和上面類似,先建立 Persons:
class Person(object): def __init__(self, age): self.age = agepersons = [Person(age) for age in (78, 14, 78, 42, 14)]
如果現在我們要按照年齡分組的話,一種方法是使用 in 操作符:
persons_by_age = {}for person in persons: age = person.age if age in persons_by_age: persons_by_age[age].append(person) else: persons_by_age[age] = [person]assert len(persons_by_age[78]) == 2
相比較之下,使用 collections 模組中 defaultdict 方法的途徑可讀性更好:
from collections import defaultdictpersons_by_age = defaultdict(list)for person in persons: persons_by_age[person.age].append(person)
defaultdict 將會利用接受的參數為每個不存在的 key 建立對應的值,這裡我們傳遞的是 list,所以它將為每個 key 建立一個 list 類型的值。
16: list comprehethion
>>> [i for i in a if i % 2 == 0][2, 4, 6]>>> [i * i for i in a if i % 2 == 0][4, 16, 36]>>> {i * i: 1 for i in a if i % 2 == 0}{16: 1, 36: 1, 4: 1}
17 檢查字串是否是另一個的字串
string = 'Hi there' # True example2# string = 'Good bye' # False example3if 'Hi' in string:4 print 'Success!'
18 reload測試
import test
>>> test.answer_to_life_the_universe_and_everything54>>> # Whoops that's not right, I'd better edit the module.......>>> reload(test)>>> test.answer_to_life_the_universe_and_everything
19 pading
>>> n = '4'>>> print n.zfill(3)>>> '004'And for numbers:>>> n = 4>>> print '%03d' % n>>> '004'