2017-02-21 1 views
2

필자는 파이썬을 처음 접했고 파이썬의 목록 이해 기능을 사용하여 파이썬 패치 시리즈를 생성 할 수 있는지 궁금합니다. 목록 이해력이 어떻게 구현되는지 모르겠습니다. 나는 다음 (의도는 처음 다섯 피보나치 숫자를 생성하는 것이었다) 시도 :파이썬의 목록 이해를 사용하여 fibonacci 시리즈를 만들려면 어떻게해야합니까?

series=[] 
series.append(1) 
series.append(1) 
series += [series[k-1]+series[k-2] for k in range(2,5)] 

이 코드 조각은 오류가 발생합니다 : IndexError: list index out of range.

리스트 통합을 사용하여 이러한 시리즈를 생성 할 수 있는지 알려주세요.

+0

당신은 그것을 할 수 없다 ~ list comprehension *이'series'에 추가되기 전에 주먹으로 평가되기 때문에 ... –

+0

'reduce'는 반복 반복의 입력에 따라 fibonacci 계열에 더 좋은 선택입니다. X -1 –

답변

4

당신은 그렇게 할 수 없어 다음 지능형리스트를처음을 평가하고 그 목록이 series에 추가됩니다. 그래서 기본적으로 당신이 쓴 것 같은 것 :

series=[] 
series.append(1) 
series.append(1) 
temp =[series[k-1]+series[k-2] for k in range(2,5)] 
series+= temp
당신은 그러나 예를 들어 같은 힘 부작용하는 방법으로 지능형리스트를 사용하여이 문제를 해결할 수

:

series=[] 
series.append(1) 
series.append(1) 
[series.append(series[k-1]+series[k-2]) for k in range(2,5)]

을 여기에 시리즈에 결과를 추가하지 않습니다. 목록 이해는 에서 .append이 호출 될 때만 사용됩니다. 그러나 일부는 부작용이있는 목록 내장을 다소 오류가 발생하기 쉬운 것으로 간주합니다. 이는 매우 선언적이지 않고 신중하게 수행하지 않으면 버그가 발생하는 경향이 있습니다.

+0

알았어. 고마워요! – PythonNewBie

1

구축하려면 무엇에 빌렘 반 Onsem는 말했다 :

피보나치 시퀀스의 n 번째 기간을 계산하는 기존의 방법은 당신이 알고 같이 n-1n-2 조건을 요약하는 것입니다. 목록 이해력은 이해하는 동안 부작용이없는 목록을 작성하도록 설계되었습니다 (단일 목록 작성 제외). 시퀀스를 계산하는 동안 시퀀스의 마지막 2 항을 저장하는 것은 부작용이므로 목록 이해는 자체적으로 작업에 적합하지 않습니다.

안전한 방법은 목록 이해기가 전달되는 내용의 세부 사항에 대해 걱정할 필요가 없도록 목록 이해에 전달할 수있는 클로저 생성기 (기본적으로 일부 개인 상태가 연결된 생성자)를 만드는 것입니다. 저장된 :

def fib_generator(n): 

    def fib_n_generator(): 
     last = 1 
     curr = 1 

     if n == 0: 
      return 

     yield last 
     if n == 1: 
      return 

     yield curr 
     if n == 2: 
      return 

     ii = 2 
     while ii < n: 
      next = curr + last 
      yield next 
      last = curr 
      curr = next 
      ii += 1 

    return fib_n_generator() 

fib = [xx for xx in fib_generator(10)] 
print(fib) 
2

시리즈의 몇 가지 용어가 필요한지 알고 싶다면 다음과 같은 목록 이해없이 코드를 간단히 작성할 수 있습니다.

def Fibonacci(n): 
    f0, f1 = 1, 1 
    for _ in range(n): 
     yield f0 
     f0, f1 = f1, f0+f1 

fibs = list(Fibonacci(10)) 
print (fibs) 

몇 가지 한정된 수의 용어를 원한다면 매우 유사 할 수 있습니다.

def Fibonacci(): 
    f0, f1 = 1, 1 
    while True: 
     yield f0 
     f0, f1 = f1, f0+f1 

fibs = [] 
for f in Fibonacci(): 
    fibs.append(f) 
    if f>100: 
     break 
print (fibs) 

당신이 항목의 가능성이 무한 집합을 필요로 할 때 당신은 아마도 고려해야 중 하나 이상의 yield 문 또는 발전기 식 function. 저는 발전기 표현식으로 피보나치 수를 만들 수는 없지만 분명히 할 수는 없습니다.

2

우리는 황금 비율의 관계의 사용 깨끗한 파이썬 목록 이해력 (또는 발전기)로 쓸 수있다 : 더 멋지게로

>>> series = [int((((1 + 5**0.5)/2)**n - ((1 - 5**0.5)/2)**n)/5**0.5) for n in range(1, 21)] 
>>> series 
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] 
>>> 

또는 작은 :

>>> square_root_of_five = 5**0.5 
>>> Phi = (1 + square_root_of_five)/2 
>>> phi = (1 - square_root_of_five)/2 
>>> 
>>> series = [int((Phi**n - phi**n)/square_root_of_five) for n in range(1, 21)] 
>>> series 
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] 
관련 문제