任何修补Python足够长的人都被以下问题咬伤(或撕成碎片):
def foo(a=[]):
a.append(5)
return a
Run Code Online (Sandbox Code Playgroud)
Python新手希望这个函数总能返回一个只包含一个元素的列表:[5].结果却非常不同,而且非常惊人(对于新手来说):
>>> foo()
[5]
>>> foo()
[5, 5]
>>> foo()
[5, 5, 5]
>>> foo()
[5, 5, 5, 5]
>>> foo()
Run Code Online (Sandbox Code Playgroud)
我的一位经理曾经第一次遇到这个功能,并称其为该语言的"戏剧性设计缺陷".我回答说这个行为有一个潜在的解释,如果你不理解内部,那确实非常令人费解和意想不到.但是,我无法回答(对自己)以下问题:在函数定义中绑定默认参数的原因是什么,而不是在函数执行时?我怀疑经验丰富的行为有实际用途(谁真的在C中使用静态变量,没有繁殖错误?)
编辑:
巴泽克提出了一个有趣的例子.再加上你的大部分评论和特别是Utaal,我进一步阐述了:
>>> def a():
... print("a executed")
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print(x)
...
a executed
>>> b()
[5]
>>> b()
[5, 5]
Run Code Online (Sandbox Code Playgroud)
对我而言,似乎设计决策是相对于放置参数范围的位置:在函数内部还是"与它一起"?
在函数内部进行绑定意味着在调用函数时x有效地绑定到指定的默认值,而不是定义,这会产生一个深层次的缺陷:def在某种意义上,该行将是"混合"的(部分绑定)函数对象)将在定义时发生,并在函数调用时发生部分(默认参数的赋值).
实际行为更加一致:执行该行时,该行的所有内容都会得到评估,这意味着在函数定义中.
python language-design least-astonishment default-parameters
我正在阅读Python食谱,目前我正在研究发电机.我发现很难理解我的头脑.
因为我来自Java背景,是否有Java等价物?这本书讲的是"制片人/消费者",但是当我听到我想到线程时.
什么是发电机,为什么要使用它?显然没有引用任何书籍(除非你能直接从书中找到一个体面的,简单的答案).也许有例子,如果你感觉很慷慨!
是否有任何算法来计算子线性时间内的第n个斐波纳契数?
我对Fibonacci数的迭代算法很感兴趣,所以我在wiki上找到了公式...它看起来很直接,所以我在Python中尝试了...它没有问题编译和公式看起来正确...不是确定为什么它给出了错误的输出......我没有实现它吗?
def fib (n):
if( n == 0):
return 0
else:
x = 0
y = 1
for i in range(1,n):
z = (x + y)
x = y
y = z
return y
for i in range(10):
print (fib(i))
Run Code Online (Sandbox Code Playgroud)
产量
0
无
1
1
1
1
1
1
作为Python的学习经历,我试图编写自己的Pascal三角形版本.它花了我几个小时(因为我刚刚开始),但我出来了这段代码:
pascals_triangle = []
def blank_list_gen(x):
while len(pascals_triangle) < x:
pascals_triangle.append([0])
def pascals_tri_gen(rows):
blank_list_gen(rows)
for element in range(rows):
count = 1
while count < rows - element:
pascals_triangle[count + element].append(0)
count += 1
for row in pascals_triangle:
row.insert(0, 1)
row.append(1)
pascals_triangle.insert(0, [1, 1])
pascals_triangle.insert(0, [1])
pascals_tri_gen(6)
for row in pascals_triangle:
print(row)
Run Code Online (Sandbox Code Playgroud)
返回
[1]
[1, 1]
[1, 0, 1]
[1, 0, 0, 1]
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 0, 1]
[1, 0, 0, 0, 0, 0, 1] …Run Code Online (Sandbox Code Playgroud) 还有另一个线程来讨论Python中的Fibo系列.这是为了将代码调整为更加pythonic.如何在Python中编写Fibonacci序列
我爱上了我为解决Project Euler Q2而编写的这个程序.我在Python中进行新编码,每次使用Pythonic方式都会感到高兴!你能建议一个更好的Pythonic方法吗?
项目欧拉Q2.求斐波那契序列中所有偶数项的总和不超过四百万.
fib=[]
def fibo(a=-1,b=1,upto=4000000):
if a+b>=upto:
return
else:
a,b=b,a+b
fib.append(b)
fibo(a,b)
fibo()
even=[i for i in fib if not i%2]
print sum(even)
Run Code Online (Sandbox Code Playgroud) 我想问一下如何检索出fibo列表列表,然后检查用户的输入值是否在fibo列表中.
a , b = 1, 1
while num <= sys.maxint:
fibo == a , b = b, a+b
if num == (b +a+b):
print "It is a Fibonacci number"
break
else:
print "It is not a Fibonacci number"
break
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有概率密度函数(pdf) f(x,y).要在点(x,y)获得其累积分布函数(cdfF(x,y)),您需要集成f(x,y),如下所示:

在Scipy,我可以通过以下方式完成integrate.nquad:
x, y=5, 4
F_at_x_y = integrate.nquad(f, [[-inf, x],[-inf, y]])
Run Code Online (Sandbox Code Playgroud)
现在,我需要整个F(x,y)的x-y面板,事情是这样的:
我怎样才能做到这一点?
主要的问题是,对于每一个点,从(-30,-30)到(30,30),我需要做一个integrate.nquad从头拿到F(x,y).这太慢了.
我想知道,因为结果是连续的(例如,你得到F(5,6)的价值F(4,4),以及这2点之间的区域整合),如果有可能加快这一进程?因此,我们不需要integrate在任何时候从头开始,因此可以更快地完成流程.
可能有用的链接:
http://cn.mathworks.com/help/stats/mvncdf.html
我正在考虑借用Fibonacci Sequence中的东西
我想使用 O(1) 空间编写自下而上的斐波那契数列。我的问题是 python 的递归堆栈限制了我测试大量数字。有人可以为我所拥有的提供替代或优化吗?这是我的代码:
def fib_in_place(n):
def fibo(f2, f1, i):
if i < 1:
return f2
else:
return fibo(f1, f2+f1, i -1)
return fibo(0, 1, n)
Run Code Online (Sandbox Code Playgroud) 我是Python和这些论坛的新手.
我的问题是:如何n在Python中创建Fibonacci数列表?
到目前为止,我有一个给出nthFibonacci数的函数,但我希望得到第一个nFib 的列表.未来工作的数字.
例如:
fib(8) -> [0,1,1,2,3,5,8,13]
Run Code Online (Sandbox Code Playgroud) 我知道我的 Python Fibonacci 算法的简单版本的时间复杂度为 O(2^n)^2:
def fibonacci_naive(n):
if n < 0:
return None
if n == 0 or n == 1:
return 0
if n == 2:
return 1
return fibonacci_naive(n - 1) + fibonacci_naive(n - 2)
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写另一个斐波那契递归,但复杂度为 O(n)。到目前为止,我可以想到如何用一个简单的for循环来做到这一点,但我无法将我的头围绕在如何将它变成一个递归函数上。任何帮助表示赞赏!
def fibonacci_fast(n):
if n < 0:
return None
if n == 0 or n == 1:
return 0
if n == 2:
return 1
fn_minus_2 = 0
fn_minus_1 = 1
for _ in range(2, n+1):
temp = fn_minus_2 + …Run Code Online (Sandbox Code Playgroud) def fib(n):
if n == 0:
return 0
elif n ==1:
return 1
else:
return fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)
如何进行递归?当我运行程序并输入一个数字时,会返回相同的数字
给定一个数字和一个比率,如何创建一个指数增长的数字列表,其总和等于起始数字?
>>> r = (1 + 5 ** 0.5) / 2
>>> l = makeSeq(42, r)
>>> l
[2.5725461188664465, 4.162467057952537, 6.735013176818984,
10.897480234771521, 17.63249341159051]
>>> sum(l)
42.0
>>> l[-1]/l[-2]
1.6180339887498953
>>> r
1.618033988749895
Run Code Online (Sandbox Code Playgroud)