
create_multipliers函数的返回值时一个列表,列表的每一个元素都是一个函数 -- 将输入参数x乘以一个倍数i的函数。预期的结不雅时0,2,4,6,8. 但结不雅是5个8,不测不料外。
我小我对陷阱的定义是如许的:代码看起来可以工作,但不是以你“想当然“”的方法。如不雅一段代码直接掉足,抛出了异常,我不认为这是陷阱。比如,Python法度榜样员应当都碰到过的“UnboundLocalError”, 示例:
- >>> a=1
- >>> def func():
- ... a+=1
- ... print a
- ...
- >>> func()
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- File "<stdin>", line 2, in func
- UnboundLocalError: local variable 'a' referenced before assignment
对于“UnboundLocalError”,还有更高等的版本:
- import random
- def func(ok):
- if ok:
- a = random.random()
- else:
- import random
- a = random.randint(1, 10)
- return a
- func(True)# UnboundLocalError: local variable 'random' referenced before assignment
如不雅逻辑比较简单,应用list comprehension是不错的留意
可能对于很多python新手来说,这个Error让人摸不着脑筋。但我认为这不算陷阱,因为这段代码必定会报错,而不是默默的以缺点的方法运行。不怕真小人,就怕伪正人。我认为缺点就比如伪正人。
那么Python中哪些真正算得上陷阱呢?
第一:以mutable对象作为默认参数
这个估计是最广为人知的了,Python和其他很多说话一样,供给了默认参数,默认参数确切是个好器械,可以让函数调用者忽视一些细节(比如GUI编程,Tkinter,QT),对于lambda表达式也异常有效。然则如不雅应用了可变对象作为默认参数,那么工作就不那么竽暌逛快了。
- >>> def f(lst = []):
- ... lst.append(1)
- ... return lst
- ...
- >>> f()
- [1]
- >>> f()
- [1, 1]
惊喜不惊喜?!究其原因,python一一切都是对象,函数也不列外,默认参数只是函数的一个属性。而默认参数在函数定义的时刻已经求值了。
- Default parameter values are evaluated when the function definition is executed.
stackoverflow上有一个更恰当的例子来解释默认参数是在定义的时刻求值,而不是调用的时刻。

网友点评
精彩导读
科技快报
品牌展示