python与javascript的比较学习
函数式编程
感觉基本和JavaScript的高阶函数一样,吓得我赶紧复习了一遍js
复习传送门
高阶函数
收回我刚刚的话,py和js的高阶函数只是看起来一样,其实区别贼大
map
- js中map的用法 - r=arr.map(function) 得到一个新的arr
- py中map的用法 - r=map(f,list) 得到一个Iterator
- list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) -因此在py中用list()函数让它把整个序列都计算出来并返回一个list
- js里方法较多,py里函数较多
- 如果在py里像js一样使用map结果是’list’ object has no attribute ‘map’即py中list没有map方法,当然其他数据结构也没有,亲测
reduce
- js中reduce的用法 -arr.reduce(function (x, y))
- py中reduce的用法 -reduce(fn, [1, 3, 5, 7, 9])
- 完整用法
1
2
3
4
5
6>>> from functools import reduce
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
filter
- filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
1 | def is_odd(n): |
sort
- Python内置的sorted()函数就可以对list进行排序
- sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
- sorted([36, 5, -12, 9, -21], key=abs) -按绝对值大小排序
- py貌似没有js的那种sort()方法默认把所有元素先转换为String再排序的问题
- 要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True
返回函数
- py中返回函数或等于js中的闭包
- 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量
- js中的闭包
匿名函数
- list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
- 匿名函数只能有一个表达式,只能返回该表达式的结果
- 可以把匿名函数赋值给一个变量
- 也可以把匿名函数作为返回值
装饰器
- 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)
- decorator接受一个函数并返回一个函数
- @functools.wraps(func) -将原始函数(func)的属性赋给新的函数
1 | f.__name__ //函数对象有一个__name__属性,可以拿到函数的名字("__"是两个"_") |
- Python time time() 返回当前时间的时间戳
1 | import functools //import functools是导入functools模块 |
偏函数
- functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单
int2 = functools.partial(int, base=2) -把int函数的base参数(做N进制的转换)固定为2(相当于加入kw = { ‘base’: 2 })
创建偏函数时,实际上可以接收函数对象、*args和**kw这3个参数
max2 = functools.partial(max, 10) -10会作为*args的一部分自动加到左边