8가지 멋진 Python 프로그래밍 언어 특징

2022. 11. 16. 19:17프로그래밍

728x90

 

 

8 Coolest Python Programming Language Features | The Renegade Coder

After writing nearly 20 articles just about Python, I've decided to take some time to reflect on what I've learned. For instance, I recently wrote…

therenegadecoder.com

Python에 대한 거의 20개의 기사를 작성한 후, 저는 시간을 내어 제가 배운 것을 반영해보기로 했습니다.예를 들어, 저는 최근에 70개 이상의 Python 코드 조각을 포함하는 컴파일 기사를 작성했습니다.

이제 가장 멋진 Python 프로그래밍 언어 특징 목록이란 제목으로 글을 작성해 보았습니다.

 

엄청 멋진 Python 특징 목록

그리고 더 이상 고민하지 말고 엄청 멋진 Python 기능을 살펴 봅시다. 

제가 뭔가를 놓쳤다고 생각되시면 댓글에 자유롭게 적어주세요.

 

List Comprehensions

여태까지 Python에서 내가 가장 좋아하는 특징은 list comprehension입니다. 솔직히 이 기능은 그다지 흥미롭지 않습니다. 그냥 목록을 생성하는 편리한 방법일 뿐입니다. 

그렇기는 하지만, 다른 인기 있는 언어(예: Java, C, C++ 등)에서는 볼 수 없는 기능입니다.

결과적으로 가능한 한 자주 이 기능을 이용하려고 합니다. 

여기 몇 가지 예를 만들어 보았습니다:

# Generates a list containing values from 0 to 9
[i for i in range(10)]
 
# Generates a list of all even values from 0 to 9
[i for i range(10) if i % 2 == 0]
 
# Generates a list containing values from 1 to 10
[i + 1 for i in range(10)]
 
# Generates a list containing values from  0 to -9
[-i for i in range(10)]
 
# Generates all possible pairs between 0 and 9
[(a, b) for a in range(10) for b in range(10)]
 
# Shallow copies another list
my_list = [1, 3, 5, 7, 9]
[item for item in my_list]
 

list comprehension는 목록을 생성하므로 다른 목록과 마찬가지로 출력으로 작업할 수 있습니다:

# Generates a list containing values from 0 to 9
nums = [i for i in range(10)]
nums[0]  # returns 0
nums[1]  # returns 1
 

직접 작성하는 방법을 배우는 데 관심이 있다면 여러분을 위한 기사를 보십시오.

여기에서 구문과 몇 가지 응용 프로그램 영역에 대해 자세히 알아볼 것입니다.

자신만의 예제가 있다면 댓글로 자유롭게 공유해 주십시오.

 

Generator Expressions

 

list comprehension 문법을 배울 때 좋은 점 중 하나는 generator expression도 작성할 수 있다는 것입니다.

결국엔, 이들은 공간을 절약해 준다는 의미에서 매우 유사합니다.

맞습니다! Generator expression은 실제로 목록을 생성하지 않습니다.

 

대신 목록을 구성하지 않고 목록의 한 번에 하나의 항목으로 생성하는 수단을 제공합니다. 

한번 볼까요:

# Generates values from 0 to 9
(i for i in range(10)])
 
# Generates values from 0 to 9
(i for i range(10) if i % 2 == 0)
 
# Generates values from 1 to 10
(i + 1 for i in range(10)])
 
# Generates values from  0 to -9
(-i for i in range(10))
 
# Generates all possible pairs between 0 and 9
((a, b) for a in range(10) for b in range(10))
 
# Generates a shallow copy of another list
my_list = [1, 3, 5, 7, 9]
(item for item in my_list)
 

구문이 list comprehension와 얼마나 유사한지 주목해 보십시오. 하지만 응용 프로그램은 약간 다릅니다. 

요소를 인덱싱하는 대신 특수 함수를 사용해야 합니다:

# Generates values from 0 to 9
nums = (i for i in range(10)])
next(num)  # returns 0
next(num)  # returns 1
 

생성기는 반복 가능하므로 for 루프 문법을 사용하여 대신 사용 할 수 있습니다:

# Generates values from 0 to 9
nums = (i for i in range(10)])
for num in nums:
    print(num)  # prints each item in the generator
 

Once we’ve exhausted every element, the generator expression becomes useless.

모든 요소를 ​​소진하면 제너레이터 표현식은 쓸수 없게 됩니다.

다르게 말하면, 우리는 모든 요소를 ​​한 번만 생성할 수 있습니다. 그런 다음 표현식을 다시 작성해야 합니다.

 

Slice Assignment

목록의 전체 섹션을 바꾸고 싶었던 적이 있었나요? 글쎄요, 파이썬에는 slice assignment 라고 하는 한 줄로 그렇게 할 수 있는 기능이 있습니다. 

슬라이싱과 마찬가지로 슬라이스 할당을 사용하면 목록의 영역을 지정할 수 있습니다.

물론 차이점은 슬라이스 할당을 사용하면 해당 영역을 원하는 것으로 바꿀 수 있다는 것입니다:

my_list = [1, 2, 3]
 
# Appending a list with slice assignment
my_list[len(my_list):] = [4]
 
# Prepending a list with slice assignment
my_list[:0] = [0]
 
# Replacing middle element
midpoint = len(my_list) // 2
my_list[midpoint: midpoint + 1] = [-2]
 
# Replacing arbitrary subsection
my_list[:2] = [3, 4, 5]
 

관련 기사에서 언급했듯이 슬라이스 할당은 여기서 그치지 않습니다. 오른쪽에 있는 모든 iterable을 사용할 수 있습니다.

예를 들어 문자열, 튜플, 목록 이해 또는 생성기 표현식을 사용할 수 있습니다.

즉, 이전의 두 가지 기능이 나타날 수 있습니다:

my_list = [1, 2, 3]
my_list[len(my_list):] = (item for item in range(5))
 

2019년 후반에 슬라이스 할당에 대해 배운 이후로 저는 이 기능에 집착하고 있습니다.

결과적으로 list comprehension 다음으로 내가 두 번째로 좋아하는 기능이라고 생각합니다.

지금은 이 기능에 대해 자세히 설명하는 기사가 없으므로 댓글에 당신이 좋아하는 몇 가지 예를 공유할 수 있습니다.

 

Iterable Unpacking (일명 Destructuring)

목록의 마지막 항목 가져오기에 대한 내 기사를 확인했다면 반복 가능한 unpacking이 솔루션 중 하나였다는 것을 기억할 것입니다.

목록을 마지막 항목과 나머지 항목의 두 부분으로 나눌 수 있다는 아이디어입니다:

my_list = [1, 2, 3]
*remainder, last_item = my_list
 

음,  iterable unpacking은 목록의 끝을 검색하는 것 이상의 것을 수행할 수 있습니다. 예를 들어 변수를 교환하는 데 사용할 수 있습니다:

a = 1
b = 2
b, a = a, b
 

일반적으로 스왑을 수행하려면 세 줄의 코드가 필요합니다:

하나는 임시 변수를 만들고, 다른 하나는 변수 중 하나를 덮어쓰고, 마지막으로 임시 변수를 다른 변수에 복사합니다.

#iterable_unpacking을 사용하면 한 줄의 코드가 됩니다.

 

iterable unpacking이 익숙하다면 다른 이름인 이 특징의 다른 이름인 Destructuring도 들어 봤을 것입니다. 이상하게도 나는 모든 프로그래밍 언어에서 내가 가장 좋아하는 기능 중 일부를 다루는 기사에서 #destructuring 를 다루었습니다.

 

그렇지만, iterable unpacking을 자주 사용하지 않습니다. 이 목록을 보완할 좋은 예가 있으면 자유롭게 공유해 주세요.

 

Negative Indexing

이 목록의 모든 기능 중에서 네거티브 인덱싱은 아마도 가장 미묘할 것입니다.

결국 많은 현대 프로그래밍 언어에는 일종의 목록 인덱싱이 존재 합니다. 

하지만, 목록의 마지막 요소를 이렇게 우아하게 가져오는 방법은 거의 없습니다:

my_list = [1, 2, 3]
last_item = my_list[-1]
 

역으로 목록 요소에 액세스할 수 있는 것 외에도 insert(), pop() 및 index()와 같은 목록 메서드와 함께 음수 인덱싱을 사용할 수도 있습니다:

my_list = ['h', 'e', 'l', 'l', 'o']
my_list.insert(-1, 'l')  # ['h', 'e', 'l', 'l', 'l', 'o']
my_list.pop(-2)  # ['h', 'e', 'l', 'l', 'o']
my_list.index('l', -2)  # 3
 

네거티브 인덱싱을 좋아한다면 이 기능이 목록에서만 사용 하는 것이 아니다라는 사실을 알게 된다면 기쁠 것입니다.

문자열, 튜플 및 기타 시퀀스와 함께 자유롭게 사용하십시오.

 

Dictionary Comprehensions

이전에 이 목록에서 list comprehensions를 언급했습니다. 

분명히 그 기능이 너무 좋아서 개발자들은 사전과 같은 다른 데이터 구조를 포함하도록 기능을 확장하기로 결정했습니다. 

 

결국, 한 줄의 코드로 사전을 생성할 수 있다는 것이 좋지 않을까요? PEP 274부터 다음을 수행할 수 있습니다:

# Generates a dictionary of numbers to letters
{num: chr(65 + num) for num in range(5)}
 
# Generates the same thing
nums = [1, 2, 3, 4, 5]
letters = ["A", "B", "C", "D", "E"]
{num: letter for num, letter in zip(nums, letters)}
 

일반적으로 dictionary comprehension를 사용하여 두 목록을 사전으로 병합합니다.

이 외에도, 다른 사용 사례가 있다고 확신합니다. 댓글에 마음에 드는 부분을 자유롭게 공유하세요.

 

Chaining Comparisons

많은 현대 프로그래밍 언어에서 값을 비교하는 것은 간단한 프로세스입니다. 

예를 들어 Java에서는 다음과 같이 두 숫자를 비교할 수 있습니다:

17 > 5
 

이 예에서 결과는 부울(true)입니다. 결과적으로 다음 표현식은 Java에는 오류 입니다:

17 > 5 > 1
 

여기서 17 > 5는 참으로 평가됩니다. 그런 다음 true > 1 표현식이 평가됩니다. 이것은 무의미하기 때문에 컴파일러가 충돌합니다.

그러나 Python에서는 위험 없이 비교를 연결할 수 있습니다. 즉, 위의 동일한 표현식이 완벽하게 유효하며 True를 반환합니다.

내부적으로 각 비교는 Java처럼 계산됩니다.

하지만 각 중간 결과는 다른 비교 결과와 AND됩니다. 

 

예를 들어, 17 > 5는 True를 반환합니다. 그런 다음 5 > 1은 True를 반환합니다. 마지막으로 결과는 및 에 의해 결합되어 True를 반환합니다.

 

개인적으로 이 기능을 많이 사용하지는 않았지만 개발 쪽에서 많은 관심을 받았습니다.

예를 들어, PEP 535는 연결 프로토콜에 대한 몇 가지 업데이트를 언급합니다. 이 기능에 대한 멋진 사용 사례를 알고 있다면 댓글로 알려주세요.

 

f-Strings

마침내, 내가 가장 좋아하는 "새로운"(PEP 498) Python 기능 중 하나인 f-Strings에 도달했습니다.

일반적으로 디버깅을 위해 문자열을 만들 때 연결을 사용하여 느리게 인쇄합니다. 

우리가 영리하다면 문자열 형식화 기술 중 일부를 사용할 수 있습니다. 이제 f-String을 사용하여 두 세계의 장점을 모두 얻을 수 있습니다:

age = 25
name = 'Jeremy'
print(f'My name is {name}, and I am {age}')
 
 

이 예에서는 name과 age라는 두 변수에서 문자열을 만들었습니다. 우리가 해야 할 일은 문자열 앞에 f를 붙이기만 하면 됩니다. 그런 다음 중괄호 안에 원하는 표현식을 넣으면 해석됩니다.

예를 들어 age는 문자열 표현으로 자동 변환되는 숫자입니다.

저는 이 f-String 구문을 정말 좋아합니다. 많은 일반적인 문자열 형식 문제를 해결하기 때문입니다.

 

예를 들어, 문자열 형식을 매우 읽기 쉽게 만듭니다(concatenation과 달리).

마찬가지로 출력 문자열이 어떻게 보일지(다시 연결과 달리) 명확해집니다.

마지막으로 (문자열 보간과 달리) 변수의 위치 지정에 문제가 없습니다. 당신이 보는 것은 당신이 얻는 것입니다.

While f-Strings are really helpful, I don’t find myself using them beyond debugging. Do you have any examples you’d like to share?

f-String은 정말 도움이 되지만 저의 경우에는 디버깅 외에는 사용하지 않습니다. 공유하고 싶은 사례가 있을까요?

 

그 이외 특징들

Python 작업을 정말 좋아하는 사람으로서 위 목록을 짧게 만들려니 많을 어려움이 있었습니다.  

결과적으로 다음은 컷에 포함되지 않은 몇 가지 추가 기능입니다.

 

  • For/Else loops
  • Imaginary numbers
  • Any() and All()
  • Returning multiple values (tuples)
  • Arbitrarily large integers
  • Keyword arguments
  • Sets
  • Joining strings
  • Multiplying strings
  • Walrus operator
  • String interpolation
  • Slicing

 

물론, 파이썬에서 표준 라이브러리가 얼마나 큰지, 나는 훨씬 더 영리한 구문이 있다고 확신합니다.

또한 Python 개발이 매우 활발하기 때문에 앞으로 더 많은 기능을 볼 수 있다고 해도 놀라지 않을 것입니다.

새로운 기능이 나타날 때마다 이 목록을 업데이트할 것입니다.

 

권장 사항

이 모든 것을 말하면서도 이 목록을 확인해 주셔서 감사합니다.

앞으로 몇 달 동안 저는 Python과 Git 콘텐츠에 더 집중할 것이므로 앞으로 이와 같은 기사를 더 많이 볼 수 있을 것으로 기대합니다.

보고 싶은 것이 있으면 댓글에 메모를 남겨주시거나 저에게 직접 연락해 주세요.

그 동안 메일링 리스트에 오르거나, 후원자가 되거나, 상점을 탐색하여 이 웹사이트를 지원하십시오.

그렇지 않으면 다음 관련 문서를 계속 탐색하십시오.

 

  • 가장 멋진 프로그래밍 언어 기능
  • Python에서 두 개의 목록을 사전으로 변환하는 방법
  • 파이썬에서 문자열을 포맷하는 방법

 

마지막으로 Amazon(광고)에서 다음 Python 리소스에서 일부 가치를 얻을 수 있습니다.

  • Python: 4권의 책: Ultimate Beginner's Guide, 7 Days Crash Course, Advanced Guide, and Data Science, 단계별 연습으로 컴퓨터 프로그래밍 및 기계 학습 배우기
  • Python Pocket 참조: 주머니 속의 Python

 

이상.