Python简短的自学笔记

Python自学笔记

第一章:语法类型

list类型:['Michael', 'Bob', 'Tracy']

tuple(元组)类型:t = ('Adam', 'Lisa', 'Bart')

dict(字典)类型d = {

    'Adam': 95,

    'Lisa': 85,

    'Bart': 59

}

set类型s = set(['A', 'B', 'C'])

说明下这几者的区别:list是列表类型,里面的元素有顺序且可重复可修改的,tuple是元组类型,里面的元素有顺序且可重复但不可修改(注意,不可修改,但是如果是元组一个元素是list属性,是可以修改list里面的值的,这两者并不矛盾),dict是字典类型,键值对类型,无顺序,键必须唯一,一个键只对应一个值,同一个值可以有多个键。set类型可以看做就是dict的键,不能重复,没有顺序

第一章:函数式编程

1.1 python中map()函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

例如,对于list [1, 2, 3, 4, 5, 6, 7, 8, 9]

如果希望把list的每个元素都作平方,就可以用map()函数:

因此,我们只需要传入函数f(x)=x*x,就可以利用map()函数完成这个计算:

def f(x):

    return x*x

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

输出结果:

[1, 4, 9, 10, 25, 36, 49, 64, 81]

 

1.2 python中reduce()函数

reduce函数:

Python 3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里 用的话要 先引

入:

>>> from functools import reduce

>>> print(l1)

[0, 1, 2, 3, 4, 5, 6]

>>> reduce( f4, l1 )

21

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

 

例如,编写一个f函数,接收x和y,返回x和y的和:

def f(x, y):

return x + y

调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:

 

先计算头两个元素:f(1, 3),结果为4;

再把结果和第3个元素计算:f(4, 5),结果为9;

再把结果和第4个元素计算:f(9, 7),结果为16;

再把结果和第5个元素计算:f(16, 9),结果为25;

由于没有更多的元素了,计算结束,返回结果25。

 

上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。

 

reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:

 

reduce(f, [1, 3, 5, 7, 9], 100)

结果将变为125,因为第一轮计算是:

 

计算初始值和第一个元素:f(100, 1),结果为101。

 

1.3 python中filter()函数

filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。

 

例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:

 

def is_odd(x):

    return x % 2 == 1

然后,利用filter()过滤掉偶数:

 

filter(is_odd, [1, 4, 6, 7, 9, 12, 17])

结果:[1, 7, 9, 17]

 

利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:

 

def is_not_empty(s):

    return s and len(s.strip()) > 0

filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])

结果:['test', 'str', 'END']

 

注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。

 

rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:

 

a = '     123'

a.strip()

结果: '123'

 

a='\t\t123\r\n'

a.strip()

结果:'123'

1.4 python中编写无参数decorator

Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。

 

使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。

 

考察一个@log的定义:

 

def log(f):

    def fn(x):

        print 'call ' + f.__name__ + '()...'

        return f(x)

    return fn

对于阶乘函数,@log工作得很好:

 

@log

def factorial(n):

    return reduce(lambda x,y: x*y, range(1, n+1))

print factorial(10)

结果:

 

call factorial()...

3628800

但是,对于参数不是一个的函数,调用将报错:

 

@log

def add(x, y):

    return x + y

print add(1, 2)

结果:

 

Traceback (most recent call last):

  File "test.py", line 15, in

    print add(1,2)

TypeError: fn() takes exactly 1 argument (2 given)

因为 add() 函数需要传入两个参数,但是 @log 写死了只含一个参数的返回函数。

 

要让 @log 自适应任何参数定义的函数,可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:

 

def log(f):

    def fn(*args, **kw):

        print 'call ' + f.__name__ + '()...'

        return f(*args, **kw)

    return fn

现在,对于任意函数,@log 都能正常工作。

你可能感兴趣的:(LearningInWHU)