programming python (chapter 2)
exp07
|
1#
exp07 发表于 2007-10-15 22:00
programming python (chapter 2)
TASK:
decide to write a Python program to manage your people -- keep records in a database -- to permanently store lists of people's attributes on your computer. Keyword: lists,Field labels practise过程: -----lists----- >>> bob = ['Bob Smith', 42, 30000, 'software'] >>> sue = ['Sue Jones', 45, 40000, 'music'] >>> bob[0], sue[2] ('Bob Smith', 40000) >>> bob[0].split()[-1] 'Smith' >>> sue[2] *= 1.25 >>> sue ['Sue Jones', 45, 50000.0, 'music'] >>> people = [bob, sue] >>> for person in people: ... print person ... ['Bob Smith', 42, 30000, 'software'] ['Sue Jones', 45, 50000.0, 'music'] >>> people[1][0] 'Sue Jones' >>> for person in people: ... print person[0].split()[-1] ... person[2] *=1.20 ... Smith Jones >>> for person in people: print person[2] ... 36000.0 60000.0 >>> pays = [person[2] for person in people] >>> pays [36000.0, 60000.0] >>> pays = map((lambda x: x[2]), people) #ditto 【map是Python的内置函数,用于对线形容器执行函数化操作,具体来说,是把对某个(或多个)序列中所有元素的操作结果映射到另一个序列中。 >>> help(map) Help on built-in function map in module __builtin__: map(...) map(function, sequence[, sequence, ...]) -> list Return a list of the results of applying the function to the items of the argument sequence(s). If more than one sequence is given, the function is called with an argument list consisting of the corresponding item of each sequence, substituting None for missing values when not all sequences have the same length. If the function is None, return a list of the items of the sequence (or a list of tuples if more than one sequence). == lambda == 和数学中的 λ 一样, python的函数编程体系中有一个 lambda 语句, 用来生成函数, 一般这样的函数称为匿名函数. 例如: {{{ #!python lambda x: x+1 }}} 就生成了一个函数 λ(x) = x+1. 具有可以在python的解释器中试试: {{{ #!python >>> lambda x: x+1 # 生成一个匿名函数 λ(x) = x+1 at 0x00C99770> >>> f = lambda x: x+1 # 将这个函数绑定名字 'f' >>> f(1) # 调用 'f' 2 }}} lambda的具体语法是: lambda [parameter_list]: expression parameter_list 是参数表, expression 是后面跟的表达式, lambda本身是个运算符, 作用在这两个元素上产生一个匿名函数, 类似于以下函数定义: {{{#!python def name(parameter_list): return expression }}} expression 是一个合法的python表达式, 显然 expression 中的变量量除了在 parameter_list 中的外必须是已知的. 注意experssion中是不能用print语句的, 要想产生输出的话可以用sys.stdout.write()等函数. 下面会不断给出 lambda 的例子 == 高阶函数 == 所谓的高阶函数其实是一组以函数为参量的函数. 下面介绍 Python 中的具体形式. === map === map是最基本的函数, 搞懂了map其他函数就很容易搞懂. map 的定义: map( function, list, ...) 将函数function作用到 list 的每个元素上, 将结果组成一个列表返回. 如果参数列表有多个, 函数应该是有多参数的, 每个分量取各列表上的对应值, 如果有列表比其他列表短, 不足部分当作 None . 这里list可以是任意序列(sequence), 例如列表(list) , 元组(tuple)等. 例如: {{{ #!python >>> a = range(5); >>> b = range(4); >>> map(lambda x, y: (x, y) , a, b) # lambda x,y 接受两个参数, 生成个包含这两个参数的tuple. [(0, 0), (1, 1), (2, 2), (3, 3), (4, None)] }}} 另一种多参数调用的方法是组合列表: map(lambda (arg1, ..., argn): expression, multiple_list), multiple_list 是一个列表, 他的元素还是一个列表, 即参数列表. 这种方法实质还是单参数调用(这个不一定要完全理解). 例如: {{{ #!python >>> ml = [[0, 1], [2, 3], [3, 4]] >>> map(lambda (x,y): x+y , ml) # lambda (x,y): x+y 接受一个有两元元组(tuple), 计算他们的和. [1, 5, 7] }}} 如果map 的第一个参数, 即function等于None, 则默认为恒等变换. 例: {{{ #!python >>> a = range(3) >>> map(None , a) [0, 1, 2] }}} == reduce == reduce( function, sequence[, initializer]) 将函数function从左到右作用在序列的每个元素上, 函数function为二元函数, 第一个变量为上次计算所得结果,第二个变量为列表元素. 具体得: {{{ #!python >>> reduce(lambda x,y: x+y , [1,2,3,4,5]) # 相当于 ((((1+2)+3)+4)+5) 15 }}} 整个计算过程就像列表在不断缩减一样. initializer为初值. 例如: {{{ >>> reduce(lambda x,y: x+y , [1,2,3,4,5], 10) # 相当于(((((10+1)+2)+3)+4)+5) 25 }}} == filter == filter( function, list) filter 过滤器. 从list的元素中构造一个列表, 这个列表的元素依次是list中使function为真的元素. list可以是任意序列, 如列表(List)和元组(Tuple)等, 或支出迭代子的容器, 或者迭代子 例子: {{{ #!python >>> filter(lambda x: x>5 , [10,1,5,6,7]) # 将列表中小于5的元素滤去. [10, 6, 7] }}} 和map一样, 若function是None , 则代为恒等函数, 这样将滤去所有取值为false的元素(包括0和None). 】 >>> pays [36000.0, 60000.0] >>> sum(person[2] for person in people) 96000.0 >>> people.append(['Tom', 50, 0, None]) >>> len(people) 3 >>> people[-1][0] 'Tom' -----Field labels----- >>> NAME, AGE, PAY = range(3) >>> bob = ['Bob Smith', 42, 10000] >>> bob[NAME] 'Bob Smith' >>> PAY, bob[PAY] (2, 10000) >>> bob = [['name', 'Bob Smith'], ['age', 42], ['pay', 10000]] >>> sue = [['name', 'Sue Jones'], ['age', 45], ['pay', 20000]] >>> people = [bob, sue] >>> for person in people: ... print person[0][1], person[2][1] ... Bob Smith 10000 Sue Jones 20000 >>> [person[0][1] for person in people] ['Bob Smith', 'Sue Jones'] >>> for person in people: ... print person[0][1].split()[-1] ... person[2][1] *= 1.10 ... Smith Jones |