In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pandas import DataFrame, Series
from numpy.random import randn
import re

In [2]:
def make_watcher():
    have_seen = {}
    
    def has_been_seen(x):
        if x in have_seen:
            return True
        else:
            have_seen[x] = True
            return False
    return has_been_seen

In [3]:
watcher = make_watcher()

vals = [5, 6, 1, 5, 1, 6, 3, 5]

[watcher(x) for x in vals]


Out[3]:
[False, False, False, True, True, True, False, True]

In [4]:
def make_counter():
    count = [0]
    def counter():
        # 增加并返回当前的count
        count[0] += 1
        return count[0]
    return counter

counter = make_counter()
counter()
counter()


Out[4]:
2

In [6]:
def format_and_pad(template, space):
    def formatter(x):
        return (template % x).rjust(space)
    
    return formatter

fmt = format_and_pad('%.4f', 15)
fmt(3.1415)


Out[6]:
'         3.1415'

In [7]:
def say_hello_then_call_f(f, *args, **kwargs):
    print 'args is', args
    print 'kwargs is', kwargs
    print("Hello! Now I'm going to call %s" % f)
    return f(*args, **kwargs)

def g(x, y, z=1):
    return (x + y) / z

In [8]:
say_hello_then_call_f(g, 1, 2, z=5.)


args is (1, 2)
kwargs is {'z': 5.0}
Hello! Now I'm going to call <function g at 0x0000000009A7D128>
Out[8]:
0.6

In [9]:
def add_numbers(x, y):
    return x + y

In [10]:
add_five = lambda y: add_numbers(5, y)
add_five(7)


Out[10]:
12

In [11]:
from functools import partial
add_five = partial(add_numbers, 5)
add_five(1000)


Out[11]:
1005

In [15]:
# 计算时间序列x的60日移动平均
ma60 = lambda x: pd.rolling_mean(x, 60)
data = DataFrame(range(600))
# 计算data中所有时间序列的60日移动平均
data.apply(ma60)


d:\Anaconda2\lib\site-packages\ipykernel\__main__.py:2: FutureWarning: pd.rolling_mean is deprecated for Series and will be removed in a future version, replace with 
	Series.rolling(window=60,center=False).mean()
  from ipykernel import kernelapp as app
Out[15]:
0
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
10 NaN
11 NaN
12 NaN
13 NaN
14 NaN
15 NaN
16 NaN
17 NaN
18 NaN
19 NaN
20 NaN
21 NaN
22 NaN
23 NaN
24 NaN
25 NaN
26 NaN
27 NaN
28 NaN
29 NaN
... ...
570 540.5
571 541.5
572 542.5
573 543.5
574 544.5
575 545.5
576 546.5
577 547.5
578 548.5
579 549.5
580 550.5
581 551.5
582 552.5
583 553.5
584 554.5
585 555.5
586 556.5
587 557.5
588 558.5
589 559.5
590 560.5
591 561.5
592 562.5
593 563.5
594 564.5
595 565.5
596 566.5
597 567.5
598 568.5
599 569.5

600 rows × 1 columns


In [16]:
some_dict = {'a': 1, 'b' : 2, 'c': 3}
for key in some_dict:
    print key,


a c b

In [17]:
dict_iterator = iter(some_dict)
dict_iterator


Out[17]:
<dictionary-keyiterator at 0x9a80b38>

In [18]:
list(dict_iterator)


Out[18]:
['a', 'c', 'b']

In [19]:
def squares(n=10):
    print 'Generating squares from 1 to %d' % (n ** 2)
    for i in xrange(1, n + 1):
        yield i ** 2
gen = squares()
gen


Out[19]:
<generator object squares at 0x00000000099059D8>

In [20]:
for x in gen:
    print x,


Generating squares from 1 to 100
1 4 9 16 25 36 49 64 81 100

In [21]:
def make_change(amount, coins=[1, 5, 10, 25], hand=None):
    hand = [] if hand is None else hand
    if amount == 0:
        yield hand
    for coin in coins:
        # 确保我们给出的硬币没有超过总额,且组合是唯一的
        if coin > amount or (len(hand) > 0 and hand[-1] < coin):
            continue
        
        for result in make_change(amount - coin, coins=coins,
                                 hand=hand + [coin]):
            yield result

In [22]:
for way in make_change(100, coins=[10, 25, 50]):
    print way


[10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
[25, 25, 10, 10, 10, 10, 10]
[25, 25, 25, 25]
[50, 10, 10, 10, 10, 10]
[50, 25, 25]
[50, 50]

In [23]:
len(list(make_change(100)))


Out[23]:
242

In [24]:
gen = (x ** 2 for x in xrange(100))
gen


Out[24]:
<generator object <genexpr> at 0x0000000009905C18>

In [25]:
sumx = 0
for x in gen:
    sumx += x
print sumx


328350

In [36]:
%reset
sum(x*1.0 for x in xrange(100))


Once deleted, variables cannot be recovered. Proceed (y/[n])? y
Out[36]:
4950.0

In [31]:
dict((i, i **2) for i in xrange(5))


Out[31]:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

In [37]:
import itertools

first_letter = lambda x: x[0]
names = ['Alan', 'Adam', 'Wes', 'Will', 'Albert', 'Steven']
for letter, namesgen in itertools.groupby(names, first_letter):
    print letter, list(namesgen) # namesgen是一个生成器


A ['Alan', 'Adam']
W ['Wes', 'Will']
A ['Albert']
S ['Steven']

In [38]:
for name in itertools.combinations(names, 3):
    print name


('Alan', 'Adam', 'Wes')
('Alan', 'Adam', 'Will')
('Alan', 'Adam', 'Albert')
('Alan', 'Adam', 'Steven')
('Alan', 'Wes', 'Will')
('Alan', 'Wes', 'Albert')
('Alan', 'Wes', 'Steven')
('Alan', 'Will', 'Albert')
('Alan', 'Will', 'Steven')
('Alan', 'Albert', 'Steven')
('Adam', 'Wes', 'Will')
('Adam', 'Wes', 'Albert')
('Adam', 'Wes', 'Steven')
('Adam', 'Will', 'Albert')
('Adam', 'Will', 'Steven')
('Adam', 'Albert', 'Steven')
('Wes', 'Will', 'Albert')
('Wes', 'Will', 'Steven')
('Wes', 'Albert', 'Steven')
('Will', 'Albert', 'Steven')

In [41]:
Wes = itertools.ifilter(lambda x: x[0] == 'Wes', itertools.permutations(names,5))
for x in Wes:
    print x


('Wes', 'Alan', 'Adam', 'Will', 'Albert')
('Wes', 'Alan', 'Adam', 'Will', 'Steven')
('Wes', 'Alan', 'Adam', 'Albert', 'Will')
('Wes', 'Alan', 'Adam', 'Albert', 'Steven')
('Wes', 'Alan', 'Adam', 'Steven', 'Will')
('Wes', 'Alan', 'Adam', 'Steven', 'Albert')
('Wes', 'Alan', 'Will', 'Adam', 'Albert')
('Wes', 'Alan', 'Will', 'Adam', 'Steven')
('Wes', 'Alan', 'Will', 'Albert', 'Adam')
('Wes', 'Alan', 'Will', 'Albert', 'Steven')
('Wes', 'Alan', 'Will', 'Steven', 'Adam')
('Wes', 'Alan', 'Will', 'Steven', 'Albert')
('Wes', 'Alan', 'Albert', 'Adam', 'Will')
('Wes', 'Alan', 'Albert', 'Adam', 'Steven')
('Wes', 'Alan', 'Albert', 'Will', 'Adam')
('Wes', 'Alan', 'Albert', 'Will', 'Steven')
('Wes', 'Alan', 'Albert', 'Steven', 'Adam')
('Wes', 'Alan', 'Albert', 'Steven', 'Will')
('Wes', 'Alan', 'Steven', 'Adam', 'Will')
('Wes', 'Alan', 'Steven', 'Adam', 'Albert')
('Wes', 'Alan', 'Steven', 'Will', 'Adam')
('Wes', 'Alan', 'Steven', 'Will', 'Albert')
('Wes', 'Alan', 'Steven', 'Albert', 'Adam')
('Wes', 'Alan', 'Steven', 'Albert', 'Will')
('Wes', 'Adam', 'Alan', 'Will', 'Albert')
('Wes', 'Adam', 'Alan', 'Will', 'Steven')
('Wes', 'Adam', 'Alan', 'Albert', 'Will')
('Wes', 'Adam', 'Alan', 'Albert', 'Steven')
('Wes', 'Adam', 'Alan', 'Steven', 'Will')
('Wes', 'Adam', 'Alan', 'Steven', 'Albert')
('Wes', 'Adam', 'Will', 'Alan', 'Albert')
('Wes', 'Adam', 'Will', 'Alan', 'Steven')
('Wes', 'Adam', 'Will', 'Albert', 'Alan')
('Wes', 'Adam', 'Will', 'Albert', 'Steven')
('Wes', 'Adam', 'Will', 'Steven', 'Alan')
('Wes', 'Adam', 'Will', 'Steven', 'Albert')
('Wes', 'Adam', 'Albert', 'Alan', 'Will')
('Wes', 'Adam', 'Albert', 'Alan', 'Steven')
('Wes', 'Adam', 'Albert', 'Will', 'Alan')
('Wes', 'Adam', 'Albert', 'Will', 'Steven')
('Wes', 'Adam', 'Albert', 'Steven', 'Alan')
('Wes', 'Adam', 'Albert', 'Steven', 'Will')
('Wes', 'Adam', 'Steven', 'Alan', 'Will')
('Wes', 'Adam', 'Steven', 'Alan', 'Albert')
('Wes', 'Adam', 'Steven', 'Will', 'Alan')
('Wes', 'Adam', 'Steven', 'Will', 'Albert')
('Wes', 'Adam', 'Steven', 'Albert', 'Alan')
('Wes', 'Adam', 'Steven', 'Albert', 'Will')
('Wes', 'Will', 'Alan', 'Adam', 'Albert')
('Wes', 'Will', 'Alan', 'Adam', 'Steven')
('Wes', 'Will', 'Alan', 'Albert', 'Adam')
('Wes', 'Will', 'Alan', 'Albert', 'Steven')
('Wes', 'Will', 'Alan', 'Steven', 'Adam')
('Wes', 'Will', 'Alan', 'Steven', 'Albert')
('Wes', 'Will', 'Adam', 'Alan', 'Albert')
('Wes', 'Will', 'Adam', 'Alan', 'Steven')
('Wes', 'Will', 'Adam', 'Albert', 'Alan')
('Wes', 'Will', 'Adam', 'Albert', 'Steven')
('Wes', 'Will', 'Adam', 'Steven', 'Alan')
('Wes', 'Will', 'Adam', 'Steven', 'Albert')
('Wes', 'Will', 'Albert', 'Alan', 'Adam')
('Wes', 'Will', 'Albert', 'Alan', 'Steven')
('Wes', 'Will', 'Albert', 'Adam', 'Alan')
('Wes', 'Will', 'Albert', 'Adam', 'Steven')
('Wes', 'Will', 'Albert', 'Steven', 'Alan')
('Wes', 'Will', 'Albert', 'Steven', 'Adam')
('Wes', 'Will', 'Steven', 'Alan', 'Adam')
('Wes', 'Will', 'Steven', 'Alan', 'Albert')
('Wes', 'Will', 'Steven', 'Adam', 'Alan')
('Wes', 'Will', 'Steven', 'Adam', 'Albert')
('Wes', 'Will', 'Steven', 'Albert', 'Alan')
('Wes', 'Will', 'Steven', 'Albert', 'Adam')
('Wes', 'Albert', 'Alan', 'Adam', 'Will')
('Wes', 'Albert', 'Alan', 'Adam', 'Steven')
('Wes', 'Albert', 'Alan', 'Will', 'Adam')
('Wes', 'Albert', 'Alan', 'Will', 'Steven')
('Wes', 'Albert', 'Alan', 'Steven', 'Adam')
('Wes', 'Albert', 'Alan', 'Steven', 'Will')
('Wes', 'Albert', 'Adam', 'Alan', 'Will')
('Wes', 'Albert', 'Adam', 'Alan', 'Steven')
('Wes', 'Albert', 'Adam', 'Will', 'Alan')
('Wes', 'Albert', 'Adam', 'Will', 'Steven')
('Wes', 'Albert', 'Adam', 'Steven', 'Alan')
('Wes', 'Albert', 'Adam', 'Steven', 'Will')
('Wes', 'Albert', 'Will', 'Alan', 'Adam')
('Wes', 'Albert', 'Will', 'Alan', 'Steven')
('Wes', 'Albert', 'Will', 'Adam', 'Alan')
('Wes', 'Albert', 'Will', 'Adam', 'Steven')
('Wes', 'Albert', 'Will', 'Steven', 'Alan')
('Wes', 'Albert', 'Will', 'Steven', 'Adam')
('Wes', 'Albert', 'Steven', 'Alan', 'Adam')
('Wes', 'Albert', 'Steven', 'Alan', 'Will')
('Wes', 'Albert', 'Steven', 'Adam', 'Alan')
('Wes', 'Albert', 'Steven', 'Adam', 'Will')
('Wes', 'Albert', 'Steven', 'Will', 'Alan')
('Wes', 'Albert', 'Steven', 'Will', 'Adam')
('Wes', 'Steven', 'Alan', 'Adam', 'Will')
('Wes', 'Steven', 'Alan', 'Adam', 'Albert')
('Wes', 'Steven', 'Alan', 'Will', 'Adam')
('Wes', 'Steven', 'Alan', 'Will', 'Albert')
('Wes', 'Steven', 'Alan', 'Albert', 'Adam')
('Wes', 'Steven', 'Alan', 'Albert', 'Will')
('Wes', 'Steven', 'Adam', 'Alan', 'Will')
('Wes', 'Steven', 'Adam', 'Alan', 'Albert')
('Wes', 'Steven', 'Adam', 'Will', 'Alan')
('Wes', 'Steven', 'Adam', 'Will', 'Albert')
('Wes', 'Steven', 'Adam', 'Albert', 'Alan')
('Wes', 'Steven', 'Adam', 'Albert', 'Will')
('Wes', 'Steven', 'Will', 'Alan', 'Adam')
('Wes', 'Steven', 'Will', 'Alan', 'Albert')
('Wes', 'Steven', 'Will', 'Adam', 'Alan')
('Wes', 'Steven', 'Will', 'Adam', 'Albert')
('Wes', 'Steven', 'Will', 'Albert', 'Alan')
('Wes', 'Steven', 'Will', 'Albert', 'Adam')
('Wes', 'Steven', 'Albert', 'Alan', 'Adam')
('Wes', 'Steven', 'Albert', 'Alan', 'Will')
('Wes', 'Steven', 'Albert', 'Adam', 'Alan')
('Wes', 'Steven', 'Albert', 'Adam', 'Will')
('Wes', 'Steven', 'Albert', 'Will', 'Alan')
('Wes', 'Steven', 'Albert', 'Will', 'Adam')

In [42]:
path = 'ch13/segismundo.txt'
f = open(path)
for line in f:
    pass

In [43]:
lines = [x.rstrip() for x in open(path)]
lines


Out[43]:
['Sue\xc3\xb1a el rico en su riqueza,',
 'que m\xc3\xa1s cuidados le ofrece;',
 '',
 'sue\xc3\xb1a el pobre que padece',
 'su miseria y su pobreza;',
 '',
 'sue\xc3\xb1a el que a medrar empieza,',
 'sue\xc3\xb1a el que afana y pretende,',
 'sue\xc3\xb1a el que agravia y ofende,',
 '',
 'y en el mundo, en conclusi\xc3\xb3n,',
 'todos sue\xc3\xb1an lo que son,',
 'aunque ninguno lo entiende.',
 '']

In [44]:
with open('tmp.txt', 'w') as handle:
    handle.writelines(x for x in open(path) if len(x) > 1)

In [45]:
open('tmp.txt').readlines()


Out[45]:
['Sue\xc3\xb1a el rico en su riqueza,\n',
 'que m\xc3\xa1s cuidados le ofrece;\n',
 'sue\xc3\xb1a el pobre que padece\n',
 'su miseria y su pobreza;\n',
 'sue\xc3\xb1a el que a medrar empieza,\n',
 'sue\xc3\xb1a el que afana y pretende,\n',
 'sue\xc3\xb1a el que agravia y ofende,\n',
 'y en el mundo, en conclusi\xc3\xb3n,\n',
 'todos sue\xc3\xb1an lo que son,\n',
 'aunque ninguno lo entiende.\n']

In [ ]: