多语言展示
当前在线:1997今日阅读:19今日分享:20

python进阶篇函数式方程之疑难点

Python作为一门新型的编程语言(一般常用作脚本语言)很受欢迎,毕竟相对其他的编程语言(Java ,C#等)来说比较容易入手。那么,在学习玩入门Python之后,进阶时有哪些疑难点需要掌握呢?先看下函数式方程:
方法/步骤
1

高阶函数:把函数作为参数:例如:def add(x,y,f):       return f(x)+f(y)f是函数,可以作为参数传入定义的函数中。

2

1,map()函数:map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。例如: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]2,reduce()函数:reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:reduce(f, [1, 3, 5, 7, 9], 100)3,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'

3

自定义排序函数:python的内置高阶函数sorted()可对list进行排序.它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。如果我们要实现倒序排序,只需要编写一个reversed_cmp函数:def reversed_cmp(x, y):          if x > y:                    return -1          if x < y:                    return 1          return 0这样,调用 sorted() 并传入 reversed_cmp 就可以实现倒序排序:>>> sorted([36, 5, 12, 9, 21], reversed_cmp) 结果是:[36, 21, 12, 9, 5]sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较:>>> sorted(['bob', 'about', 'Zoo', 'Credit']) 结果是:['Credit', 'Zoo', 'about', 'bob']'Zoo'排在'about'之前是因为'Z'的ASCII码比'a'小。

4

闭包:内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数的情况,称为闭包。闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变。例如:def calc_sum(lst):          def lazy_sum():                    return sum(lst)           return lazy_sum注意: 发现没法把 lazy_sum 移到 calc_sum 的外部,因为它引用了 calc_sum 的参数 lst。

5

匿名函数:匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码:>>> sorted([1, 3, 9, 5, 0], lambda x,y: -cmp(x,y)) (注释:关键字lambda 表示匿名函数,冒号前面的 x,y 表示函数参数。)结果是:[9, 5, 3, 1, 0]

6

装饰器:Python的 decorator 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。编写无参数decorator:def log(f):          def fn(x):                    print 'call ' + f.__name__ + '()...'                    return f(x)           return fn如果先前你已经编写定义了上面的函数,后面需要用到,为避免不必要的重复,可以直接使用装饰器的@语法就可简化。@log两者之间是等价的。但是如果@log需要传入两个或者多个参数,那么可以利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用:例如:def log(f):          def fn(*args, **kw):                     print 'call ' + f.__name__ + '()...'                     return f(*args, **kw)           return fn编写带参数decorator:例如:带参数的log函数首先返回一个decorator函数,再让这个decorator函数接收my_func并返回新函数:def log(prefix):          def log_decorator(f):                    def wrapper(*args, **kw):                               print '[%s] %s()...' % (prefix, f.__name__)                               return f(*args, **kw)                     return wrapper            return log_decorator @log('DEBUG') def test():          pass print test()执行结果:[DEBUG] test()... None(注意:因为函数没有return,因此是空即None)完善decorator:@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,由decorator返回的新函数函数名已经不是原函数名,而是@log内部定义的返回的函数的名字。然而,如果想返回的是原函数的名字,那么可以使用Python内置的functools来实现。import functools def log(f):          @functools.wraps(f)          def wrapper(*args, **kw):                    print 'call...'                    return f(*args, **kw)           return wrapper偏函数:(多多理解)functools.partial就是帮助我们创建一个偏函数的,不需要我们自己定义int2(),可以直接使用下面的代码创建一个新的函数int2:>>> import functools>>> int2 = functools.partial(int, base=2)>>> int2('1000000') 64 >>> int2('1010101') 85所以,functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。

注意事项

如果认为本经验对您有所帮助,请点击下面【投票】支持小编!如果您想以后随时浏览请点击下面的【收藏】,如果认为本经验能够帮助到您的朋友,请点击页面右边双箭头分享。

推荐信息