>  기사  >  백엔드 개발  >  Python 코드를 더욱 Pythonic하게 만드는 방법은 무엇입니까?

Python 코드를 더욱 Pythonic하게 만드는 방법은 무엇입니까?

高洛峰
高洛峰원래의
2016-10-17 17:22:331606검색

Pythonic을 중국어로 번역하면 매우 Python적입니다. 중국에서는 "very girly", "very national football team", "very CCTV" 등과 같이 명사 구조 "very +"를 많이 사용합니다. ·

아래에서는 단순화를 위해 파이썬 쓰기 방식을 P로, 비파이썬 쓰기 방식을 NP로 사용합니다. 물론 이 P-NP가 그 P-는 아닙니다. NP.

파이썬을 추구하는 이유는 무엇입니까?

NP에 비해 P의 작성 방법은 간결하고 명확하며 우아합니다. 대부분의 경우 실행 효율성이 높고 코드가 적을수록 오류도 줄어듭니다. - 경향이 있습니다. 좋은 프로그래머는 코드를 작성할 때 코드의 정확성, 단순성, 가독성을 추구해야 한다고 생각합니다. 이것이 바로 Pythonic의 정신입니다.

다른 프로그래밍 언어에 대한 경험이 있고 Python을 처음 접하는 프로그래머(예:)의 경우 Python 작성 방법을 인식하면 Python 코드를 작성할 때 더 편리하고 효율적일 수 있습니다. 이 프로그래머 그룹도 될 것입니다.

독자의 참고를 위해 아래에 P와 NP의 N개 예가 나와 있습니다.


P 대 NP의 예

체인 비교

P:

a = 3
b = 1
1 <= b <= a < 10  #True

NP:

a = 3
b = 1
b >= 1 and b <= a and a < 10 #True

P는 초등학생도 이해할 수 있는 구문으로 간단하고 직접적이며 코드를 절약합니다. ~


진실 테스트

P:

name = &#39;Tim&#39;
langs = [&#39;AS3&#39;, &#39;Lua&#39;, &#39;C&#39;]
info = {&#39;name&#39;: &#39;Tim&#39;, &#39;sex&#39;: &#39;Male&#39;, &#39;age&#39;:23 }    
  
if name and langs and info:
    print(&#39;All True!&#39;)  #All True!

NP:

if name != &#39;&#39; and len(langs) > 0 and info != {}:
    print(&#39;All True!&#39;) #All True!

간단히 말하면 P를 쓰는 방식은 판단 조건을 쓰지 않고 어떤 물건의 진위 여부를 직접 판단하는 것입니다. 이는 정확성을 보장할 수 있을 뿐만 아니라 양을 줄일 수도 있습니다. 암호.


True 및 False 값 표 (false를 기억하면 코드가 많이 절약됩니다!)

True False

True False

비어 있지 않은 문자열, 빈 문자열''

0이 아닌 숫자, 숫자 0

비어 있지 않은 컨테이너, 빈 컨테이너[] () {} set()

False가 아닌 기타 없음


문자열 역방향

P:

def reverse_str( s ):
    return s[::-1]

NP:

def reverse_str( s ):
    t = &#39;&#39;
    for x in xrange(len(s)-1,-1,-1):
        t += s[x]
    return t

P는 작성이 간단하고, 테스트한 후에는 더 효율적입니다.

회문을 감지하는 데 사용하면 input == input[::-1]이라는 문장이 되는데, 얼마나 우아한가!


문자열 목록 연결

P:

strList = ["Python", "is", "good"]  
  
res =  &#39; &#39;.join(strList) #Python is good

NP :

res = &#39;&#39;
for s in strList:
    res += s + &#39; &#39;
#Python is good
#最后还有个多余空格

string.join()은 목록에서 문자열을 결합하는 데 자주 사용됩니다. NP와 비교할 때 P 방법은 매우 효율적이고 오류가 없습니다. .


목록 합계, 최대, 최소, 곱

P:

numList = [1,2,3,4,5]   
sum = sum(numList)  #sum = 15
maxNum = max(numList) #maxNum = 5
minNum = min(numList) #minNum = 1
from operator import mul
prod = reduce(mul, numList, 1) #prod = 120 默认值传1以防空列表报错


NP:

sum = 0
maxNum = -float(&#39;inf&#39;)
minNum = float(&#39;inf&#39;)
prod = 1
for num in numList:
    if num > maxNum:
        maxNum = num
    if num < minNum:
        minNum = num
    sum += num
    prod *= num
# sum = 15 maxNum = 5 minNum = 1 prod = 120

간단한 테스트 후 numList의 길이가 10000000일 때, 목록을 합산하려면 내 컴퓨터에서 P는 0.6초가 걸리고 NP는 1.3초가 걸리며 이는 거의 두 배의 차이입니다. 그러므로 자신의 바퀴를 재발명하지 마십시오.


목록 이해

P:

l = [x*x for x in range(10) if x % 3 == 0]
#l = [0, 9, 36, 81]

NP:

l = []
for x in range(10):
    if x % 3 == 0:
        l.append(x*x)
#l = [0, 9, 36, 81]

보세요, P의 목록 이해력을 사용하면 새 목록을 작성하는 것이 얼마나 간단하고 직관적인지 알 수 있습니다!


사전 기본값

P:

dic = {&#39;name&#39;:&#39;Tim&#39;, &#39;age&#39;:23}  
  
dic[&#39;workage&#39;] = dic.get(&#39;workage&#39;,0) + 1
#dic = {&#39;age&#39;: 23, &#39;workage&#39;: 1, &#39;name&#39;: &#39;Tim&#39;}

NP:

if &#39;workage&#39; in dic:
    dic[&#39;workage&#39;] += 1
else:
    dic[&#39;workage&#39;] = 1
#dic = {&#39;age&#39;: 23, &#39;workage&#39;: 1, &#39;name&#39;: &#39;Tim&#39;}

dict의 get(key,default) 메소드는 키가 존재하지 않는 경우 사전에서 키 값을 가져오는 데 사용됩니다. , 키에 기본값이 할당됩니다. 값은 기본값입니다.

NP에 비해 P가 if...else...라고 적게 적혀 있는데, 정말 if...else...를 싫어하는 분들의 첫 번째 선택입니다...!


for…else… 문

P:

for x in xrange(1,5):
    if x == 5:
        print &#39;find 5&#39;
        break
else:
    print &#39;can not find 5!&#39;
#can not find 5!

NP :

find = False
for x in xrange(1,5):
    if x == 5:
        find = True
        print &#39;find 5&#39;
        break
if not find:
    print &#39;can not find 5!&#39;
#can not find 5!

for...else...의 else 부분은 for 루프가 중단되지 않는 상황을 처리하는 데 사용됩니다. 이를 사용하면 for 루프가 중단되는지 확인하기 위해 상태 변수를 설정할 필요가 없으므로 간단하고 편리합니다.


삼항 기호 교체

P:

a = 3  
  
b = 2 if a > 2 else 1
#b = 2

NP :

if a > 2:
    b = 2
else:
    b = 1
#b = 2

C 프로그래밍 경험이 있다면 A ? B ? A와 B 또는 C는 괜찮아 보이지만 실제 의도는 False를 반환해야 하는데 b = a > 1이고 False 또는 True가 True를 반환하는 것을 볼 수 있습니다.

a > 1인 경우 b = False를 사용하면 else True는 False를 올바르게 반환하므로 진정한 삼항 기호 대체입니다.


열거

P:

array = [1, 2, 3, 4, 5]
  
for i, e in enumerate(array,0):
    print i, e
#0 1
#1 2
#2 3
#3 4
#4 5

NP:

for i in xrange(len(array)):
    print i, array[i]
#0 1
#1 2
#2 3
#3 4
#4 5

enumerate를 사용하면 인덱스를 사용하여 값을 가져올 필요 없이 인덱스와 값을 한 번에 꺼낼 수 있으며, enumerate의 두 번째 매개변수는 인덱스 첨자의 시작 위치를 조정할 수 있습니다. 기본값은 0입니다.


zip을 사용하여 키-값 쌍 생성

P:

keys = [&#39;Name&#39;, &#39;Sex&#39;, &#39;Age&#39;]
values = [&#39;Tim&#39;, &#39;Male&#39;, 23]
  
dic = dict(zip(keys, values))
#{&#39;Age&#39;: 23, &#39;Name&#39;: &#39;Tim&#39;, &#39;Sex&#39;: &#39;Male&#39;}

NP:

dic = {}
for i,e in enumerate(keys):
    dic[e] = values[i]
#{&#39;Age&#39;: 23, &#39;Name&#39;: &#39;Tim&#39;, &#39;Sex&#39;: &#39;Male&#39;}

zip 메소드는 간단하고 명확한 키-값 쌍을 만드는 데 사용되는 튜플을 반환합니다.


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