>  기사  >  백엔드 개발  >  Python의 for 루프 예제에 대한 자세한 설명

Python의 for 루프 예제에 대한 자세한 설명

零下一度
零下一度원래의
2017-07-02 11:07:482205검색

이 글은 주로 파이썬에서 for 루프 사용에 대한 몇 가지 생각을 소개합니다. 필요한 친구들이 참고하면 됩니다.

왜 코드에 for 루프를 쓰지 말라고 도전해야 할까요? 왜냐하면 이로 인해 더욱 발전되고 확실한 구문이나 라이브러리를 사용해야 하기 때문입니다. 이 기사에서는 Python을 예로 들어 모든 사람이 다른 사람의 코드에서 본 적이 있지만 스스로는 거의 사용하지 않는 많은 구문에 대해 이야기합니다.

이것은 도전입니다. 어떤 상황에서도 for 루프를 작성하지 않기를 바랍니다. 마찬가지로, for 루프를 사용하는 것 외에는 다른 방법으로 작성하기가 너무 어려운 시나리오도 찾아보시기 바랍니다. 여러분이 발견한 내용을 공유해 주세요. 듣고 싶습니다.

제가 멋진 Python 언어 기능을 탐색하기 시작한 지 꽤 시간이 흘렀습니다. 처음에는 다른 프로그래밍 언어에서 배운 것 대신 더 많은 언어 기능을 사용하여 연습하는 것이 나 자신에게 주어진 도전이었습니다. 하지만 상황은 점점 더 흥미로워지고 있습니다! 코드가 더 짧아지고 깔끔해질 뿐만 아니라 더 체계적이고 규칙적으로 보입니다. 이 기사에서는 이러한 이점에 대해 더 자세히 설명하겠습니다.

먼저 한 걸음 물러서서 for 루프 작성 뒤에 있는 직관이 무엇인지 살펴보겠습니다.

1. 일부 정보를 추출하기 위해 시퀀스를 탐색합니다.

2. 현재 시퀀스에서 다른 시퀀스를 생성합니다.

3. 저는 프로그래머이기 때문에 루프는 제2의 천성입니다

다행히도 Python에는 이러한 목표를 달성하는 데 도움이 되는 훌륭한 도구가 이미 있습니다! 당신이 해야 할 일은 마음을 바꾸고 사물을 다른 관점에서 보는 것뿐입니다.

모든 곳에 for 루프를 작성하지 않으면 무엇을 얻을 수 있나요?

1. 코드 줄이 적습니다.

2. 코드 가독성이 향상됩니다.

3. 코드 텍스트를 관리하려면 들여쓰기만 사용하세요.

아래 코드 뼈대를 살펴보세요. 아래 코드 구조는 다음과 같습니다.

# 1
with ...:
  for ...:
    if ...:
      try:
      except:
    else:

이 예제에서는 여러 수준의 중첩 코드를 사용하므로 읽기가 매우 어렵습니다. 이 코드에서 내가 발견한 것은 관리 논리(with, try-Exception)와 비즈니스 논리(for, if)를 혼합하기 위해 들여쓰기를 무분별하게 사용했다는 것입니다. 관리 논리에 들여쓰기만 사용하는 규칙을 준수한다면 핵심 비즈니스 논리는 즉시 제거해야 합니다.

"플랫 구조가 중첩 구조보다 낫습니다" - "Zen of Python"

for 루프를 방지하려면 다음 도구를 사용할 수 있습니다.

1. List comprehensions/

Generators

Expressions간단한 예 보기 , 이 예는 주로 기존 시퀀스를 기반으로 새 시퀀스를 컴파일합니다.

result = []
for item in item_list:
  new_item = do_something_with(item)
  result.append(item)

MapReduce를 좋아한다면 map 또는 Python의 목록 분석을 사용할 수 있습니다.

result = [do_something_with(item) for item in item_list]

마찬가지로 단지 반복자를 얻으려는 경우 거의 동일한 구문을 사용하는 생성기 표현식을 사용할 수 있습니다. (어떻게 Python의 일관성에 빠지지 않을 수 있나요?) result = [do_something_with(item) for item in item_list]

同样的,如果你只是想要获取一个迭代器,你可以使用语法几乎相通的生成器表达式。(你怎么能不爱上Python的一致性?)

result = (do_something_with(item) for item in item_list)

2. 函数

站在更高阶、更函数化的变成方式考虑一下,如果你想映射一个序列到另一个序列,直接调用map函数。(也可用列表解析来替代。)

doubled_list = map(lambda x: x * 2, old_list)

result = (do_something_with(item) for item in item_list)

2. 함수


더 높은 수준에 있고 더 기능적입니다. 이렇게 생각해 보세요. 한 시퀀스를 다른 시퀀스에 매핑하려면 map 함수를 직접 호출하세요. (대신 List comprehension을 사용할 수도 있습니다.)

doubled_list = map(lambda x: x * 2, old_list)

순열을 하나의 요소로 줄이려면 Reduce

를 사용하세요.

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

게다가 Python에 내장된 수많은 함수는 할 수/있습니다(이것이 좋은 것인지 나쁜 것인지는 모르겠지만 하나를 선택하면 이것을 추가하지 않으면 이해하기가 조금 어렵습니다. 문장) 반복자를 소비합니다:


>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> dict(zip(a,a))
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> str(a)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> sum(a)
45

3. 추출 함수 또는 표현식

위의 두 가지 방법은 간단한 논리를 잘 처리하지만 더 복잡한 논리는 어떻습니까? 프로그래머로서 우리는 어려운 것들을 함수로 추상화하는데, 이 접근 방식은 여기서도 사용될 수 있습니다. 이런 종류의 코드를 작성하는 경우:

results = []
for item in item_list:
  # setups
  # condition
  # processing
  # calculation
  results.append(result)

분명히 코드에 너무 많은 책임을 부여하고 있는 것입니다. 개선하려면 다음을 수행하는 것이 좋습니다.

def process_item(item):
  # setups
  # condition
  # processing
  # calculation
  return result

results = [process_item(item) for item in item_list]

중첩 for 루프는 어떻습니까?

results = []
for i in range(10):
  for j in range(i):
    results.append((i, j))

List comprehension이 도움이 될 수 있습니다.

results = [(i, j)
      for i in range(10)
      for j in range(i)]

내부 상태를 많이 저장하고 싶다면 어떻게 해야 할까요?

# finding the max prior to the current item
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = []
current_max = 0
for i in a:
  current_max = max(i, current_max)
  results.append(current_max)

# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

다음을 구현하기 위한 표현식을 추출해 보겠습니다.

def max_generator(numbers):
  current_max = 0
  for i in numbers:
    current_max = max(i, current_max)
    yield current_max

a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = list(max_generator(a))

"잠깐, 방금 해당 함수 표현식에 for 루프를 사용했습니다. 그건 부정행위입니다!


좋아요, 똑똑하신 분들, 시도해 보세요." 이것.

4. for 루프를 직접 작성하지 마세요. itertools가 대신해 드립니다.

이 모듈은 정말 훌륭합니다. 나는 이 모듈이 for 루프를 작성하려는 경우의 80%를 다룰 수 있다고 믿습니다. 예를 들어 이전 예제는 다음과 같이 다시 작성할 수 있습니다.

from itertools import accumulate
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
resutls = list(accumulate(a, max))

또한 일련의 조합을 반복하는 경우 product(), permutations() 및 조합()을 사용할 수 있습니다. 🎜🎜🎜결론🎜🎜🎜1. 대부분의 경우 for 루프를 작성할 필요가 없습니다. 🎜

2. for 루프를 사용하면 코드를 더 쉽게 읽을 수 있습니다.

Action

1. 코드를 다시 보고 이전에 for 루프를 직관적으로 작성했던 곳을 찾아보세요. for 루프 없이 다시 작성하는 것이 타당한지 다시 생각해 보세요.

2. for 루프를 사용하지 않는 것이 어려웠던 예를 공유해 보세요.

위 내용은 Python의 for 루프 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.