1. 程式人生 > >Python學習筆記二(高階特性)

Python學習筆記二(高階特性)

     1. 切片

#取一個list或tuple的部分元素是非常常見的操作,即輸出第0,1,2三個元素
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

# 方法一:
print([L[0], L[1], L[2]])

# 方法二:
r = []
n = 3
for i in range(n):
    r.append(L[i])

print(r)

# 方法三:
print(L[0:3])
#如果第一個索引是0,還可以省略:
print(L[:3])

print(L[2:3])

    輸出結果:      
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Michael', 'Sarah', 'Tracy']
['Tracy']

2.迭代

  類似於java的for...each方法,任何可迭代物件都可以作用於for迴圈,包括我們自定義的資料型別,只要符合迭代條件(即Iterable型別的物件),就可以使用for迴圈。  
print("#dict遍歷")
d = {'a': 1, 'b': 2, 'c': 3}
for key in d:
    print(key)

print("#字串遍歷")
for ch in 'ABC':
    print(ch)

print("#輸出下標值")
for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)

print("同時遍歷兩個元素")
for x, y in [(1, 1), (2, 4), (3, 9)]:
    print(x, y)

    輸出結果:    
#dict遍歷
a
b
c
#字串遍歷
A
B
C
#輸出下標值
0 A
1 B
2 C
同時遍歷兩個元素
1 1
2 4
3 9

  3.列表生成式

print("#列表生成式")
print([x * x for x in range(1, 11)])
   輸出結果: 
#列表生成式
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

  4.生成器

    通過列表生成式,我們可以直接建立一個列表。但是,受到記憶體限制,列表容量肯定是有限的。而且,建立一個包含100萬個元素的列表,不僅佔用很大的儲存空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
print("#生成器")
g = (x * x for x in range(10))

print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))

print("for迴圈遍歷")
g = (x * x for x in range(10))
for n in g:
    print(n)

輸出結果:  
#生成器
0
1
4
9
16
for迴圈遍歷
0
1
4
9
16
25
36
49
64
81


5.迭代總結 

凡是可作用於for迴圈的物件都是Iterable型別;

凡是可作用於next()函式的物件都是Iterator型別,它們表示一個惰性計算的序列;

集合資料型別如listdictstr等是Iterable但不是Iterator,不過可以通過iter()函式獲得一個Iterator物件;

Python的for迴圈本質上就是通過不斷呼叫next()函式實現的。

6. 函數語言程式設計

    函數語言程式設計就是一種抽象程度很高的程式設計正規化,純粹的函數語言程式設計語言編寫的函式沒有變數,因此,任意一個函式,只要輸入是確定的,輸出就是確定的,這種純函式我們稱之為沒有副作用。而允許使用變數的程式設計語言,由於函式內部的變數狀態不確定,同樣的輸入,可能得到不同的輸出,因此,這種函式是有副作用的。允許把函式本身作為引數傳入另一個函式,還允許返回一個函式,即函式本身也可以賦值給變數,即:變數可以指向函式。  
print("#函式為變數")
f = abs
print(f(-10))

print("#函式作為引數傳入")
def add(x, y, f):
    return f(x) + f(y)

print(add(-5, 6, abs))

  輸出結果:
#函式為變數
10
#函式作為引數傳入
11

7.map/reduce

print("#map/reduce")
def f(x):
  return x * x

r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

#r是一個Iterator,Iterator是惰性序列,因此通過list()函式讓它把整個序列都計算出來並返回一個list
print(list(r))

   輸出結果: 
#map/reduce
[1, 4, 9, 16, 25, 36, 49, 64, 81]

 8.filter

   filter()的作用是從一個序列中篩出符合條件的元素。由於filter()使用了惰性計算,所以只有在取filter()結果的時候,才會真正篩選並每次返回下一個篩出的元素。
print("#去除空字串")
def not_empty(s):
    return s and s.strip()

r = filter(not_empty, ['A', '', 'B', None, 'C', '  '])

print(list(r))

   輸出結果:   
#去除空字串
['A', 'B', 'C']

  9.排序

print("#python排序")

r = sorted([36, 5, -12, 9, -21])
print(r)

print("#根據abs結果排序")
r = sorted([36, 5, -12, 9, -21], key=abs)
print(r)

print("#字串排序")
#預設情況下,對字串排序,是按照ASCII的大小比較的,由於'Z' < 'a',結果,大寫字母Z會排在小寫字母a的前面
r= sorted(['bob', 'about', 'Zoo', 'Credit'])
print(r)

print("#不區分大小寫字串排序")
r= sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
print(r)

  輸出結果: 
#python排序
[-21, -12, 5, 9, 36]
#根據abs結果排序
[5, 9, -12, -21, 36]
#字串排序
['Credit', 'Zoo', 'about', 'bob']
#不區分大小寫字串排序
['about', 'bob', 'Credit', 'Zoo']

   10.匿名函式

  
print("#匿名函式")
print(list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
 輸出結果:  
#匿名函式
[1, 4, 9, 16, 25, 36, 49, 64, 81]

   11.裝飾器

         python裝飾器自己的理解非常類似於java的aop攔截器     
import time
def now():
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))


f = now
print("列印當前時間")
f()
print("輸出函式名稱")
print(now.__name__)


# wrapper()函式的引數定義是(*args, **kw),因此,wrapper()函式可以接受任意引數的呼叫

def log(func):
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

# 在wrapper()函式內,首先列印日誌,再緊接著呼叫原始函式。
@log
def now():
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))

print("python裝飾功能測試驗證,相當於now=log(now)")
now()

# 傳入引數的log
def log(text):
    def decorator(func):
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

@log("列印當前時間方法")
def now():
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))


print("python裝飾功能測試驗證,相當於now = log('execute')(now)")
now()

   輸出結果:
列印當前時間
2017-03-28 16:11:25
輸出函式名稱
now
python裝飾功能測試驗證,相當於now=log(now)
call now():
2017-03-28 16:11:25
python裝飾功能測試驗證,相當於now = log('execute')(now)
列印當前時間方法 now():
2017-03-28 16:11:25