相关疑难解决方法(0)

"最小的惊讶"和可变的默认论证

任何修补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

2458
推荐指数
31
解决办法
14万
查看次数

了解Python中的生成器

我正在阅读Python食谱,目前我正在研究发电机.我发现很难理解我的头脑.

因为我来自Java背景,是否有Java等价物?这本书讲的是"制片人/消费者",但是当我听到我想到线程时.

什么是发电机,为什么要使用它?显然没有引用任何书籍(除非你能直接从书中找到一个体面的,简单的答案).也许有例子,如果你感觉很慷慨!

python generator

194
推荐指数
12
解决办法
12万
查看次数

次线性时间的第n个斐波纳契数

是否有任何算法来计算子线性时间内的第n个斐波纳契数?

algorithm math performance fibonacci time-complexity

74
推荐指数
6
解决办法
4万
查看次数

Fibonacci数的迭代算法

我对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 algorithm fibonacci

16
推荐指数
2
解决办法
7万
查看次数

Pascal的Python三角形

作为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 pascals-triangle

13
推荐指数
3
解决办法
7万
查看次数

Python程序找到斐波纳契系列.更多Pythonic方式

还有另一个线程来讨论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)

python

6
推荐指数
2
解决办法
7501
查看次数

检查Python中属于Fibonacci数字的输入

我想问一下如何检索出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)

谢谢!

python

5
推荐指数
2
解决办法
5351
查看次数

Scipy:在整个表面上进行加速整合?

我有概率密度函数(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在任何时候从头开始,因此可以更快地完成流程.


可能有用的链接:

使用scipy的Python中的多变量普通CDF

http://cn.mathworks.com/help/stats/mvncdf.html

我正在考虑借用Fibonacci Sequence中的东西

如何在Python中编写Fibonacci序列

python recursion numpy scipy

5
推荐指数
1
解决办法
428
查看次数

使用 O(1) 空间在 python 中自下而上斐波那契数列

我想使用 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 recursion fibonacci

3
推荐指数
2
解决办法
2872
查看次数

Python:创建前n个Fibonacci数的列表

我是Python和这些论坛的新手.

我的问题是:如何n在Python中创建Fibonacci数列表?

到目前为止,我有一个给出nthFibonacci数的函数,但我希望得到第一个nFib 的列表.未来工作的数字.

例如:

fib(8) -> [0,1,1,2,3,5,8,13]
Run Code Online (Sandbox Code Playgroud)

python fibonacci

2
推荐指数
1
解决办法
8217
查看次数

时间复杂度为 O(n) 的 Python Fibonacci 递归(而不是迭代)?

我知道我的 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)

python recursion fibonacci

2
推荐指数
1
解决办法
102
查看次数

如何创建递归函数来计算斐波纳契数

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)

如何进行递归?当我运行程序并输入一个数字时,会返回相同的数字

python recursion

1
推荐指数
1
解决办法
392
查看次数

python中指数增长的数字序列

给定一个数字和一个比率,如何创建一个指数增长的数字列表,其总和等于起始数字?

>>> 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)

python

0
推荐指数
1
解决办法
1803
查看次数