python3-cookbook笔记:第七章 函数
python3-cookbook中每个小节以问题、解决方案和讨论三个部分探讨了Python3在某类问题中的最优解决方式,或者说是探讨Python3本身的数据结构、函数、类等特性在某类问题上如何更好地使用。这本书对于加深Python3的理解和提升Python编程能力的都有显著帮助,特别是对怎么提高Python程序的性能会有很好的帮助,如果有时间的话强烈建议看一下。 ? 7.2 只接受关键字参数的函数 有时候为了代码可读性或者其他原因,我们需要在使用函数的时候强制要求调用者使用关键字参数,这时候只需要在某个*参数或单个*后面定义关键字参数即可。 def print_ax(a,x): print(a,x) def print_x(a,*,x) print_ax(111,222) # 如果这样写就会报错:print_x(111,222) print_x(111,x=222) ? ? 7.7 匿名函数捕获变量值 lambda表达式的参数值是在运行时绑定的,而不是定义时绑定的,这跟def定义参数默认值是不同的,如果需要lambda表达式在定义时就绑定值,可以使用参数默认值的写法。 >>> x = 10 >>> a = lambda y: x + y >>> x = 20 >>> b = y >>> 下面两个执行结果是一样的 >>> a(10) 30 >>> b(10) 30 >>> x = 30 >>> a(10) 40 >>> b(10) 40 >>> 使用参数默认值的方式 >>> a = lambda y,x=x: x + y >>> b = y >>> a(10) 40 >>> ? ? 7.8 减少可调用对象的参数个数 当调用某个函数的时候可能你并不需要传入全部参数值,或者只能传入部分参数值,就可以使用functools.partial()。 用法示例: >>> from functools import partial >>> spam(a,b,c,d): a = 1 >>> s1(2,3,4) 1 2 3 4 >>> s2 = partial(spam,d=42) d = 42 >>> s2(1,2,3) 1 2 3 42 >>> s3 = partial(spam,1,1)"> a = 1,b = 2,d = 42 >>> s3(3) 1 2 3 42 >>> 排序使用示例: """将列表中的点根据距离基点的距离进行排序""" math partial 基点 pt = (4,1)">) points = [(1,2),(3,4),(5,6),(7,8)] distance(p1,p2): 返回两个点之间的距离""" x1,y1 = p1 x2,y2 = p2 return math.hypot(x2 - x1,y2 - y1) points.sort(key=partial(distance,pt)) print(points) [(3,(1,8)] 回调函数使用示例: logging from multiprocessing Pool partial def output_result(result,log=None): if log is not None: log.debug('Got: %r' add(x,y): return x + y if __name__ == __main__: logging模块用于打印日志 logging.basicConfig(level=logging.DEBUG) log = logging.getLogger(test) 异步调用另一个函数,并将log对象传入进去 p = Pool() p.apply_async(add,(3,callback=partial(output_result,1)">log)) p.close() p.join() ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |