你這樣用python嗎

來源:互聯網
上載者:User

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

  1. class MyClass:    ...    @classmethod  # classmethod的修飾符    def class_method(cls, arg1, arg2, ...):        ...    @staticmethod  # staticmethod的修飾符    def static_method(arg1, arg2, ...):        ...

    13. 

  2. exefile("filename.py")
  3. 直接在互動式命令列執行,所有的表量很狀態都會儲存,適合調試使用。
對於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'

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.