notes for lxf(三)

纯函数式编程是没有变量的,只要输入确定输出就确定 指高度抽象的编程范式

特点 函数本身可以作为参数传入 或者允许返回一个函数

Higher-order function 一个函数可以接收另一个函数作为参数

函数名其实就是指向函数的变量

map(func_name, Iterable) 序列的每一个元素一次传参给func 并将结果作为新的Iterator返回

reduce(func_name,  序列)func接收两个参数 并把结果继续和序列的下一个元素做累积计算

map的一个参数的函数只有一个参数 reduce的第一个参数函数有两个参数

filter(func, sequence)sequence元素一次作用func根据返回的True False 保留 最后返回一个Iterator

is 判断指向是否同一个 ==判断值是否相等

sorted(iterable, /, *, key=None, reverse=False)按照key函数返回结果进行排序 reverse反转 key作用的是序列的每一个元素

闭包 返回一个函数 返回的这个函数引用了外部函数的变量

返回闭包时 返回函数不要引用任何循环变量 或者后续会发生变化的变量

lambda匿名函数只能有一个表达式不用写return 返回值是表达式的结果

dir()查看对象有哪些属性 id()查看内存地址 函数名相当于一个内存地址 加了括号就相当于调用 .__name__看函数名字 .__iter__看是否可迭代

装饰器 代码运行期间动态增加功能的方式 本身是一种闭包但decorator的形参必须是函数

嵌套函数 函数要被调用才会执行 即出现func()才会执行

闭包 当调用外部函数时 返回的结果是内部函数的内存地址 调用内部函数才会返回运算结果

闭包 外部函数()()返回的内部函数的运算结果 相当于第一次调用外部函数 第二次调用内部函数

其实装饰器就相当于 装饰器的外部函数()() 就内部函数执行结果  装饰器函数如果是三层嵌套就相当于最外部函数()()() 两层嵌套就相当于外部函数()() 第几个括号有参数就第几次调用传参

装饰之后 相当于被装饰的函数指向了装饰器的内部函数(返回函数) 所以其函数名.__name__实际就是内部函数

import functools 

@functools.wraps(func)是把原始函数的__name__等属性还回去  定义在内部函数的前面 即传参是被装饰函数的那个函数里面

如果打印函数 会把函数的None打印出来 eg:print(func())

print 和return区别 函数的返回值return语句只有在打印的时候才把值打出来

x = func() 指x接收函数的返回值 并执行一遍函数 return func() 指返回func()函数的返回值 并执行一遍func()

如果装饰器本身需要传参 就多一层嵌套函数 该参数和被装饰函数 算是两个位置参数一起传给装饰器函数

def str2float(s):
DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}

def char2num(string):
return DIGITS[string]

index = [i for i, x in enumerate(s) if x == '.']
if len(index) > 1:
raise TypeError("类型错误,非有效数字")
if len(index) == 1:
index = index[0]
front = s[:index]
end = s[index + 1:]
return reduce(lambda x, y: x * 10 + y, map(char2num, front)) + (reduce(lambda x, y: x / 10 + y, map(char2num, end[::-1]))) / 10
else:
return reduce(lambda x, y: x * 10 + y, map(char2num, s))

猜你喜欢

转载自www.cnblogs.com/marshuai/p/10706681.html
今日推荐