제어 흐름과 반복문
if 문
if 문은 세 부분으로 구성됩니다: 키워드 자체, 참/거짓을 판단하는 조건식, 그리고 식이 참이거나 0이 아닐 때 실행되는 코드 블록
else와 elif를 지원하며, 조건식을 괄호로 묶을 필요는 없습니다
- 표준 if 조건문의 구문은 다음과 같습니다:
if expression: expr_true_suite
식의 값이 0이 아니거나 불린 값이 True이면 코드 블록 expr_true_suite가 실행됩니다; 그렇지 않으면 다음 문장으로 진행합니다.
if 문의 expr_true_suite 코드 블록은 조건식의 결과가 불린 값으로 참일 때만 실행되며, 그렇지 않으면 해당 코드 블록 뒤에 오는 문장을 계속 실행합니다 단일 if 문은 불린 연산자 and, or, not을 사용하여 다중 조건 판단 또는 부정 조건 판단을 구현할 수 있습니다
else 문
-
다른 언어와 마찬가지로 Python은 if 문과 함께 사용되는 else 문을 제공합니다.
-
if 문의 조건식 결과가 거짓이면, 프로그램은 else 문 뒤의 코드를 실행합니다.
구문은 다음과 같습니다:
if expression: expr_true_suiteelse: expr_false_suite
3. 단일 if 문은 불린 연산자 and, or, not을 사용하여 다중 조건 판단 또는 부정 조건 판단을 구현할 수 있습니다
4. 가독성 향상을 위해 ()를 사용하여 그룹화할 수 있지만, 파이썬은 이를 강제하지 않습니다
예제 1: login.py 스크립트 작성, 다음 목표 구현
-
사용자에게 사용자 이름과 비밀번호 입력 요청
-
사용자 이름과 비밀번호를 각각 변수에 저장
-
사용자 이름이 bob이고 비밀번호가 123456이면 "Login successful" 출력, 그렇지 않으면 "Login incorrect" 출력
#!/usr/bin/env pythonusername = input('username: ')password = input('password: ')if username == 'bob' and password == '123456': print('Login successful')else: print('Login incorrect')
실행 결과:
username: bobpassword: 123456Login successful예제 2: 비밀번호 입력 시 보이지 않게 하려면 getpass 모듈의 getpass 메소드를 활용해야 합니다
#!/usr/bin/env python#coding:utf-8import getpassusername = input('username: ')password = getpass.getpass("password: ") #getpass 모듈로 입력 숨김if username == 'bob' and password == '123456': print('Login successful')else: print('Login incorrect')
결과는 아래 이미지와 같으며, 이름 출력 후 실행이 중단되어 비밀번호 입력이 불가능합니다
이것은 파이참 컴파일러의 문제입니다. 프로그램이 계속 실행되고 비밀번호 입력 시 내용이 표시되지 않도록 하려면 현재 파이썬 파일을 명령줄에서 실행해야 합니다. 리눅스 방식과 유사합니다. 두 가지 방법이 있습니다
-
python xx.py 입력 아래 이미지: Terminal 사용
-
현재 py 파일에서 마우스 오른쪽 버튼 클릭 -> show in explorer -> 폴더 주소 표시줄에 cmd 입력하여 Windows 명령 인터페이스 열기 -> python xx.py 입력
elif (else-if) 문
1.elif는 파이썬의 else-if 문이며, 여러 식이 참인지 확인하고 참일 경우 특정 코드 블록의 코드를 실행합니다
- else와 마찬가지로, elif 선언은 선택 사항입니다. 그러나 다른 점은 if 문 뒤에는 최대 하나의 else 문만 있을 수 있지만, elif 문은 무제한으로 사용할 수 있다는 점입니다
구문은 다음과 같습니다:
if expression1: expr1_true_suite<br></br>elif expression2: expr2_true_suite<br></br>elif expressionN: exprN_true_suite<br></br>else: none_of_the_above_suite
예제 1: score.py 스크립트 작성, 사용자 입력 점수에 따라 등급 분류, 요구 사항:
- 점수가 60점 이상이면 "합격" 출력
- 점수가 70점 이상이면 "양호" 출력
- 점수가 80점 이상이면 "우수" 출력
- 점수가 90점 이상이면 "최우수" 출력
- 그렇지 않으면 "불합격" 출력
- 범위를 벗어나면 "올바른 범위는 0-100입니다" 출력
#!/usr/bin/env python#coding:utf-8점수 = int(input("점수:"))if 점수 >100 or 점수 <0: print("올바른 범위는 0-100입니다")else: if 점수 >=90: print("최우수") elif 점수>=80: print("우수") elif 점수 >=70: print("양호") elif 점수 >=60: print("합격") else: print("불합격")
조건식 또는 삼항 연산자
- 파이썬은 오랫동안 조건식(C ? X :Y) 또는 삼항 연산자를 지원하지 않았습니다. 여기서 C는 표현식입니다
- 파이썬 2.5에서 통합된 구문으로 확정되었습니다: X if C else Y
- 조건이 성립하면 X를 반환, 그렇지 않으면 Y를 반환
>>> x, y = 3, 4>>> 작은값 = x if x < y else y>>> print(작은값)3while 반복문
- 문장을 반복적으로 실행해야 할 때 while 반복문을 사용할 수 있습니다
구문은 다음과 같습니다:
while expression: while_suite문장 while_suite는 표현식의 값이 0 또는 False가 될 때까지 계속해서 반복 실행됩니다.
일반적으로 반복 횟수가 정해지지 않은 경우 while 반복문을 사용합니다
이러한 유형의 반복 메커니즘은 주로 카운팅 반복문에 사용됩니다
예제 1: 1부터 100까지 더하여 결과 계산
흐름도는 다음과 같습니다:
코드는 다음과 같습니다:
#!/usr/bin/env python#coding:utf-8합계100 = 0카운터 = 1while 카운터 <= 100: 합계100 += 카운터 카운터 += 1print("결과는 %d입니다" % 합계100)
실행 결과:
결과는 5050입니다2. while 문도 else 문을 사용할 수 있으며, 반복이 끝나면 else 문이 실행됩니다
while else 반복문과 while 반복문의 차이점은, 정상적으로 종료된 반복문( break가 없는 경우)은 마지막 반복이 완료된 후 else 문의 문장을 실행한다는 점입니다;
반복문 내부에 if 와 break를 추가하면, if 조건을 만족하면 즉시 반복문이 종료되고 다른 문장은 실행되지 않습니다;
#!/usr/bin/env python#coding:utf-8합계100 = 0카운터 = 1while 카운터 <= 100: 합계100 += 카운터 카운터 += 1else: print("결과는 %d입니다" % 합계100)
실행 결과
결과는 5050입니다
break 문
1.break 문은 현재 반복문을 종료하고 다음 문장으로 점프합니다 2. 외부 조건이 트리거될 때(일반적으로 if 문으로 확인) 즉시 반복문에서 빠져나와야 할 때 주로 사용됩니다.3. break 문은 while 및 for 반복문에서 사용할 수 있습니다. 4. 프로그래밍 시 중복 코드를 피해야 하므로, 이러한 경우 while-break 구조를 사용할 수 있습니다
while True: 이름 = input('사용자 이름: ') if 이름 == 'tom': break
print('당신의 이름은 %s입니다' % 이름)
continue 문
-
continue 문을 만나면 프로그램은 현재 반복을 종료하고 나머지 문장을 무시한 후 반복의 상단으로 돌아갑니다
-
다음 반복을 시작하기 전에, 조건 반복문의 경우 조건식을 확인합니다.
-
반복 반복문의 경우 다음 반복할 요소가 있는지 확인합니다. 확인이 성공한 경우에만 다음 반복을 시작합니다
예제 1: 1-100까지의 짝수 합계 계산
#!/usr/bin/env python#-*- coding:utf-8 -*-합계100 = 0카운터 = 0while 카운터 <= 100: 카운터 += 1 if 카운터 % 2: continue 합계100 += 카운터 print(합계100)
실행 결과:
2550예제 2: 1-100까지의 모든 홀수 합계 계산:
#!/usr/bin/env python#-*- coding:utf-8 -*-합계100 = 0카운터 = 0while 카운터 < 100: 카운터 += 1 if not 카운터 % 2: continue 합계100 += 카운터print(합계100)
실행 결과:
2500예제 3: 1-100까지의 모든 홀수 합계 계산
#!/usr/bin/env python#-*- coding:utf-8 -*-합계100 = 0카운터 = 0while True: 카운터 += 1 if 카운터 % 2 == 0: continue if 카운터 >100: break 합계100 += 카운터print("결과는 %d입니다" % 합계100)
실행 결과:
결과는 2500입니다예제 4: 1-100까지의 모든 홀수 합계 계산
#!/usr/bin/env python#-*- coding:utf-8 -*-합계100 = 0카운터 = 0while 카운터 < 100: 카운터 += 1 if not 카운터 % 2: continue 합계100 += 카운터else: print(합계100)
실행 결과:
2500 3. 상위 레벨로 돌아가야 하는 요구가 있다면, 플래그를 사용하세요! 다음 예제 참조:
#!/usr/bin/env python<br></br>#-*- coding:utf-8 -*-<br></br><br></br>카운트 = 0<br></br>while True:<br></br> print("첫 번째 레이어입니다")<br></br> 점프_1_플래그 = False<br></br> while True:<br></br> print("두 번째 레이어입니다")<br></br> 점프_2_플래그 = False<br></br> while True:<br></br> 카운트 += 1<br></br> print("세 번째 레이어입니다") <br></br> if 카운트 > 3:<br></br> 점프_2_플래그 = True<br></br> break<br></br> if 점프_2_플래그:<br></br> print("세 번째 레이어가 여기로 점프했습니다, 저도 첫 번째 레이어로 점프해야 합니다")<br></br> 점프_1_플래그 = True<br></br> break<br></br> <br></br> if 점프_1_플래그:<br></br> print("두 번째와 세 번째 레이어가 첫 번째 레이어로 점프했습니다, 저도 점프해야 합니다")<br></br> break
실행 결과:
첫 번째 레이어입니다두 번째 레이어입니다세 번째 레이어입니다세 번째 레이어입니다세 번째 레이어입니다세 번째 레이어입니다세 번째 레이어가 여기로 점프했습니다, 저도 첫 번째 레이어로 점프해야 합니다두 번째와 세 번째 레이어가 첫 번째 레이어로 점프했습니다, 저도 점프해야 합니다주의: 파이썬에서 continue와 break는 현재 레벨의 반복문에만 영향을 줍니다. 내부 반복문에서 continue와 break를 사용하더라도 외부 반복문에는 영향을 주지 않습니다
pass 문
- 파이썬은 pass 문을 제공하며, 이는 아무 작업도 하지 않습니다 - 즉 NOP (No Operation, 무작업)입니다
for 반복문
-
for 반복문: 반복 가능한 객체(예: 시퀀스 또는 이터레이터)를 매개변수로 받아 각 반복마다 그 중 하나의 요소를 처리합니다
-
파이썬에서 for 반복문은 일반적인 시퀀스 이터레이터입니다;
-
어떤 정렬된 시퀀스 객체 내의 요소를 순회할 수 있습니다
-
시퀀스 멤버를 순회할 수 있으며, 리스트 컴프리헨션과 제너레이터 표현식에 사용할 수 있습니다. 자동으로 이터레이터의 next() 메소드를 호출하고 StopIteration 예외를 포착하여 반복을 종료합니다(모든 것은 내부에서 발생합니다)
참고: 시퀀스에는 문자열, 튜플, 리스트가 포함되지만 이에 국한되지는 않습니다
일반 구문
- for 반복문은 반복 가능한 객체(예: 시퀀스 또는 이터레이터)의 모든 요소에 접근하고 모든 항목이 처리된 후 반복문을 종료합니다
for iter_var in iterable: suite_to_repeat2. 각 반복마다 iter_var 이터레이션 변수는 반복 가능한 객체(시퀀스, 이터레이터, 또는 다른 반복을 지원하는 다른 객체)의 현재 요소로 설정되어 suite_to_repeat 문 블록에 사용됩니다
-
while 반복문과 마찬가지로, break, continue, else 문을 지원합니다
-
일반적으로 반복 횟수가 알려져 있지 않을 때 while 반복문을 사용하고, 반복 횟수가 알려져 있을 때 for 반복문을 사용합니다
반복 조건이 만족되면 반복은 계속 실행되고, 만족되지 않으면 종료됩니다;
시퀀스 유형에 사용하기
시퀀스를 순회하는 세 가지 기본 방법
- 시퀀스 항목을 통한 순회
>> 이름목록 = ['a', "Nicole", 'Steven', 'Henry']>> for 각이름 in 이름목록:... print(각이름, "Lim")...Walter LimNicole LimSteven LimHenry Lim
- 인덱스를 통한 시퀀스 순회
>> 이름목록 = ['Cathy', "Terry", 'Joe', 'Heather', 'Lucy']>> for 이름인덱스 in range(len(이름목록)):... print("Liu,", 이름목록[이름인덱스])...Liu, CathyLiu, TerryLiu, JoeLiu, HeatherLiu, Lucy직접 시퀀스를 순회하는 것이 인덱스를 통한 순회보다 빠릅니다
- 항목과 인덱스를 통한 순회 두 가지 장점을 모두 취하는 방법은 내장 enumerate() 함수를 사용하는 것입니다
>>> 이름목록 = ['Donn', 'Shirley', 'Ben', 'Janice','David', 'Yen', 'Wendy']>>> for i, 각Lee in enumerate(이름목록):... print("%d %s Lee" % (i+1, 각Lee))...1 Donn Lee2 Shirley Lee3 Ben Lee4 Janice Lee5 David Lee6 Yen Lee7 Wendy Lee
이터레이터 유형에 사용하기
-
for 반복문을 사용하여 이터레이터에 접근하는 방법은 시퀀스에 접근하는 방법과 거의 비슷합니다. 유일한 차이점은 for 문이 추가적인 작업을 수행해준다는 점입니다
-
이터레이터는 반복 항목의 컬렉션을 나타내지 않습니다
-
이터레이터 객체에는 next() 메소드가 있으며, 호출 시 다음 항목을 반환합니다.
-
모든 항목을 순회한 후, 이터레이터는 반복 종료를 알리기 위해 StopIteration 예외를 발생시킵니다. for 문은 내부적으로 next()를 호출하고 예외를 포찥합니다.
range 함수
-
파이썬은 range()를 호출하는 두 가지 다른 방법을 제공합니다.
-
완전한 구문은 두 개 또는 세 개의 정수 매개변수를 요구합니다: range(시작, 끝, 단계=1)
-
range()는 시작 <= k < end를 만족하는 모든 k를 포함하는 리스트를 반환하며, 시작부터 끝까지 단계마다 k가 증가합니다. 단계는 0이 될 수 없으며, 그렇지 않으면 오류가 발생합니다
-
두 개의 매개변수만 주고 단계를 생략하면, 단계는 기본값 1을 사용합니다.
-
range()에는 두 가지 간랜한 구문 형식도 있습니다: range(끝)와 range(시작, 끝)
6.for 반복문은 range() 함수와 함께 자주 사용됩니다 7.range() 함수는 반복 조건을 제공합니다
`>>> range(5) # 0-4 숫자 나열[0, 1, 2, 3, 4]>>> range(1, 5)[1, 2, 3, 4]>>> range(1, 5, 2)[1, 3]```` timer.py 내용:
`#!/usr/bin/env python#coding:utf8import time for i in range(1,11): print(i, end=' ') time.sleep(1) `
### xrange 함수
1.xrange()는 range()와 유사하지만, 매우 큰 범위의 리스트가 있을 때 xrange()가 더 적합할 수 있습니다. 왜냐하면 메모리에 전체 리스트의 복사본을 생성하지 않기 때문입니다
2. 이것은 for 반복문 내에서만 사용되며, for 반복문 외부에서 사용하는 것은 의미가 없습니다
3\. 성능은 range()보다 훨씬 뛰어나며, 왜냐하면 전체 리스트를 생성하지 않기 때문입니다
`#!/usr/bin/env python# coding:utf8for x in range(3): print(x)`
### 시퀀스와 관련된 내장 함수
1. sorted()와 zip()은 시퀀스(리스트)를 반환합니다
2. reversed()와 enumerate()는 이터레이터(시퀀스와 유사)를 반환합니다
셸에서 175.40.2.0 IP가 ping이 되는지 확인하려면 다음과 같이 할 수 있습니다:
ping.sh 내용:
`#!/bin/bashfor ip in 172.40.2.{1..254}:do ping -c2 $ip &>/dev/null && echo "$ip: up" || echo "$ip:down"done`
그리고 파이썬으로도 구현할 수 있습니다:
리눅스:
`#!/usr/bin/env python#coding:utf8import os for i in range(1,255): ip = "172.40.2.%s" % i 결과 = os.system("ping -c2 %s &>/dev/null" %ip) if 결과: print("%s:down " % ip) else: print("%s:up" % ip)`
Windows에서:
`#!/usr/bin/env python#coding:utf8import osfor i in range(1,255): ip = "192.168.9.%s" % i 결과 = os.system("ping -n 1 %s > nul " %ip) if 결과: print("%s:down " % ip) else: print("%s:up" % ip)`
참고: 리눅스/유닉스에는 /dev/null이 있어 출력을 안전하게 버릴 수 있고, Windows에는 nul이 있어 cmd ... >nul 형식으로 표준 출력 내용이 버려집니다.
9. 피보나치 수열 계산
피보나치 수열은 어떤 수가 항상 앞의 두 수의 합인 수열입니다. 예를 들어 0, 1, 1, 2, 3, 5, 8과 같습니다. 출력은 일련의 숫자이므로 리스트 구조로 저장할 수 있습니다. 시작 시 리스트에는 두 값, 즉 0과 1이 있습니다.
그런 다음 반복문을 사용하여 리스트에 요소를 추가하며, 추가되는 요소는 항상 리스트의 마지막 두 요소 값의 합입니다.
스크립트를 대화형으로 실행할 때 주의할 점은, 사용자가 입력한 숫자를 파이썬은 여전히 문자가 아닌 정수 숫자로 간주하지 않는다는 것입니다. int()를 사용하여 사용자 입력을 형식 변환해야 합니다.
방법 1: 고정 출력 피보나치 수열 작성
`#!/usr/bin/env python#-*- coding:utf-8 -*-피보나치 = [0, 1] # 리스트 정의for i in range(8): # 8번 반복 피보나치.append(피보나치[-1] + 피보나치[-2]) # 마지막과 마지막에서 두 번째 숫자를 더하여 리스트에 추가; 이는 피보나치 = 피보나치[-1] + 피보나치[-2]와 유사하다고 생각할 수 있습니다.print(피보나치)`
실행 결과:
`[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]`방법 2:
`#!/usr/bin/env python<br></br>#-*- coding:utf-8 -*-<br></br><br></br>피보나치 = [0, 1]<br></br><br></br>개수 = int(input('숫자를 입력하세요: ')) <br></br><br></br># 이미 정의된 개수만큼이므로 반복 시 개수 -2가 필요합니다<br></br>for i in range(개수 - 2): <br></br> 피보나치.append(피보나치[-1] + 피보나치[-2])<br></br>print(피보나치)`
실행 결과:
`숫자를 입력하세요: 10[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]`방법 3: 인덱스와 요소 값을 출력하기
`#!/usr/bin/env python<br></br>#-*- coding:utf-8 -*-<br></br><br></br>피보나치 = [0, 1]<br></br><br></br>for i in range(8):<br></br> 피보나치.append(피보나치[-1] + 피보나치[-2])<br></br><br></br># range가 8번 추가되므로 8개의 숫자가 생성되며, 초기 2개와 총 10개의 숫자가 됩니다<br></br># 따라서 길이는 10이며, len(피보나치)는 10입니다<br></br>for i in range(len(피보나치)): # 피보나치의 길이로 리스트를 생성하여 인덱스 세트를 생성합니다<br></br> print("인덱스 %d는 %d입니다" % (i, 피보나치[i])) # 인덱스와 값을 출력합니다<br></br><br></br>``` ``` 실행 결과:<div>인덱스 0는 0입니다인덱스 1는 1입니다인덱스 2는 1입니다인덱스 3는 2입니다인덱스 4는 3입니다인덱스 5는 5입니다인덱스 6는 8입니다인덱스 7는 13입니다인덱스 8는 21입니다인덱스 9는 34입니다</div>`방법 4: enumerate를 사용하여 인덱스와 요소 값 출력하기
`#!/usr/bin/env python#-*- coding:utf-8 -*-피보나치 = [0, 1]for i in range(8): 피보나치.append(피보나치[-1] + 피보나치[-2])for i, 요소 in enumerate(피보나치): # enumerate가 리스트에 적용될 때 두 값을 생성합니다: 하나는 인덱스 값, 다른 하나는 인덱스에 해당하는 요소 값입니다 print("인덱스 %d는 %d입니다" % (i, 요소))`
실행 결과:
`인덱스 0는 0입니다인덱스 1는 1입니다인덱스 2는 1입니다인덱스 3는 2입니다인덱스 4는 3입니다인덱스 5는 5입니다인덱스 6는 8입니다인덱스 7는 13입니다인덱스 8는 21입니다인덱스 9는 34입니다`기타 문장
----
1. else 문
1\. 다른 언어와 달리 파이썬의 while 및 for 문은 else 문도 지원합니다
2. 반복 본체가 정상적으로 종료될 때만 else 코드 블록이 실행됩니다
3. 반복 본체 내의 코드가 중단되면 else 코드 블록도 중단되어 실행되지 않습니다 2. break 문
1. break 문은 현재 반복문을 종료하고 다음 문장으로 점프합니다 2. while 및 for 반복문에서 사용할 수 있습니다
3. 일반적으로 if 문으로 확인하여 외부 조건이 트리거될 때 즉시 반복문에서 빠져나갈 때 사용합니다
3. continue 문
1. continue 문을 만나면 프로그램은 현재 반복을 종료하고 나머지 문장을 무시한 후 반복의 상단으로 돌아갑니다 2. 다음 반복을 시작하기 전에, 조건 반복문의 경우 조건식을 확인합니다; 반복 반복문의 경우 다음 반복할 요소가 있는지 확인합니다 3. 확인이 성공한 경우에만 다음 반복이 시작됩니다
4. pass 문
1. 파이썬은 전통적인 중괄호를 사용하여 코드 블록을 표시하지 않으며, 때로는 구문상 코드가 필요한 경우가 있습니다 2. 파이썬은 pass 문을 제공하며, 이는 아무 작업도 하지 않습니다 8자 무작위 비밀번호 생성
방법 1:
`#!/usr/bin/env python#coding:utf8import randomimport string모든문자 = string.ascii_letters + string.digits # string.ascii_letters는 대소문자, string.digits는 숫자를 의미비밀번호 = ''for i in range(8): 문자 = random.choice(모든문자) # choice() 메소드는 비어있지 않은 시퀀스에서 무작위 항목을 반환합니다. 비밀번호 += 문자 print(비밀번호)`
참고:
string 모듈 일부 내용:
` digits = '0123456789' hexdigits = '0123456789abcdefABCDEF' ascii_letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' lowercase = 'abcdefghijklmnopqrstuvwxyz' octdigits = '01234567' printable = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU... punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~' uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' whitespace = '\t\n\x0b\x0c\r '`
이 내용은 string.__file__ 또는 help(string)을 통해 볼 수 있습니다
`>>> import string>>> string.__file__'C:\\Python27\\lib\\string.pyc'>>> <br></br><br></br>````
<br></br><br></br>
random 일부 내용
random.choice: 비어있지 않은 시퀀스에서 무작위 요소를 선택합니다.
방법 2:
#!/usr/bin/env python#coding:utf8import randomimport string모든문자 = string.ascii_letters + string.digits비밀번호 = ''개수 = int(input("개수: "))for i in range(개수): 문자 = random.choice(모든문자) 비밀번호 += 문자 print(비밀번호)
이터레이션
이터레이터와 iter() 함수
-
시퀀스 유사 객체에 시퀀스 유사 인터페이스를 제공합니다
-
근본적으로 이터레이터는 next() 메소드를 가진 객체입니다
-
파이썬의 이터레이션은 시퀀스 객체를 원활하게 지원하며, 프로그래머가 비시퀀스 유형을 반복할 수도 있습니다
-
뒤로 이동하거나 시작으로 돌아가거나, 이터레이터를 복제할 수 없습니다
-
객체에 대해 iter()를 호출하면 해당 이터레이터를 얻을 수 있습니다
-
이터레이터 항목이 모두 추출된 후, StopIteration 예외가 발생하지만 이는 오류 발생을 의미하지 않으며, 외부 호출자에게 반복 완료를 알리는 것뿐입니다
>>> i = iter('py')>>> next(i)'p'>>> next(i)'y'>>> next(i)Traceback (most recent call last):File "<stdin>", line 1, in <module>StopIteration</module></stdin>
파일 이터레이터
-
파일에는 next 메소드가 있으며, 호출할 때마다 파일의 다음 줄을 반환합니다. 파일 끝에 도달하면 __next__는 내장 StopIteration 예외를 발생시킵니다
-
"반복 가능한"은 iter를 지원하는 객체를 의미하며, 이터레이터는 iter가 반환하는 next를 지원하는 객체를 의미합니다
수동 이터레이션:
- 수동 이터레이션 코드를 지원하기 위해 파이썬 3.0은 내장 함수 next도 제공하며, 이는 자동으로 객체의 next 메소드를 호출합니다
이터레이터가 필요한 이유
- 확장 가능한 이터레이터 인터페이스를 제공합니다.
- 리스트 이터레이션에 성능 향상을 가져옵니다.
- 딕셔너리 이터레이션에서 성능 향상.
- 원래의 임의 객체 접근이 아닌 진정한 이터레이터 인터페이스 생성.
- 모든 기존 사용자 정의 클래스 및 확장된 시퀀스 및 매핑 객체와의 호환성
- 시퀀스가 아닌 컬렉션(예: 매핑 및 파일)을 반복할 때 더 간결하고 읽기 쉬운 코드 생성
이터레이션 방법
-
근본적으로 이터레이터는 인덱스를 통한 카운팅이 아닌 next() 메소드를 가진 객체입니다
-
당신이나 반복 메커니즘(예: for 문)이 다음 항목이 필요할 때, 이터레이터의 next() 메소드를 호출하여 얻을 수 있습니다.
-
모든 항목이 추출된 후, StopIteration 예외가 발생하지만 이는 오류 발생을 의미하지 않으며, 외부 호출자에게 반복 완료를 알리는 것뿐입니다
-
이터레이터에는 몇 가지 제한이 있습니다. 예를 들어 뒤로 이동할 수 없으며, 시작으로 돌아갈 수도 없고, 이터레이터를 복제할 수도 없습니다
-
동일한 객체를 다시(또는 동시에) 반복해야 한다면, 다른 이터레이터 객체를 생성해야 합니다
-
reversed() 내장 함수는 역순 접근 이터레이터를 반환합니다
-
enumerate() 내장 함수도 이터레이터를 반환합니다
-
또 다른 두 개의 새로운 내장 함수 any()와 all()은 파이썬 2.5에 추가되었으며, 이터레이터의 특정/모든 항목 값이 모두 불린 참이면 참을 반환합니다.
-
파이썬은 유용한 이터레이터가 포함된 전체 itertools 모듈도 제공합니다
가변 객체와 이터레이터
-
시퀀스의 이터레이터는 현재 몇 번째 요소에 도달했는지만 기록하므로, 반복 중에 요소를 변경하면 업데이트가 즉시 반영됩니다.
-
딕셔너리의 key를 반복할 때 절대로 이 딕셔너리를 변경해서는 안 됩니다. 딕셔너리의 keys() 메소드를 사용하는 것은 가능하며, keys()는 딕셔너리와 독립적인 리스트를 반환합니다.
-
이터레이터는 실제 객체와 바인딩되어 있으므로, 더 이상 진행되지 않습니다
이터레이터 생성 방법
- 객체에 대해 iter()를 호출하면 해당 이터레이터를 얻을 수 있습니다. 구문은 다음과 같습니다
iter(obj)iter(func, sentinel )2. iter()에 하나의 인수를 전달하면 시퀀스인지 확인합니다. 시퀀스라면 간단합니다: 인덱스 0에서 시퀀스 끝까지 반복합니다.
- 이터레이터를 생성하는 다른 방법은 클래스를 사용하는 것입니다. iter()와 next() 메소드를 구현하는 클래스는 이터레이터로 사용할 수 있습니다
- 두 개의 인수를 iter()에 전달하면, 이터레이터의 다음 값이 sentinel과 같을 때까지 func를 반복적으로 호출합니다
testiter.py 스크립트 작성, 다양한 이터레이션 메커니즘 연습, 주요 요구 사항:
- 문자열을 생성하고 for 루프를 통해 각 문자 반복
- 리스트를 생성하고 for 루프를 통해 각 항목 반복
- 파일을 열고 for 루프를 통해 각 줄 반복
- 딕셔너리를 생성하고 for 루프를 통해 딕셔너리의 키 반복
방안:
많은 파이썬 객체가 for와 함께 반복할 수 있는 기능을 지원합니다. 이 기능을 사용하여 객체를 편리하게 순회할 수 있습니다
#!/usr/bin/env python#coding:utf-8내문자열 = 'Hello world!'내리스트 = ["hello", "world"]내파일 = '/etc/hosts'내딕셔너리 = {"name": "bob", "age": 23}for 각문자 in 내문자열: print(각문자)for 각항목 in 내리스트: print(각항목)for 각줄 in open(내파일): print(각줄, # 주의: 쉼표는 print의 줄 바꿈을 억제합니다for 각키 in 내딕셔너리: print(각키)
실행 결과:
[root@host-192-168-3-6 tarena]# python testiter.py Hello world!helloworld127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6agename
iter2.py 내용:
#!/usr/bin/env python#coding:utf8문자열 = 'hello'리스트 = ['tedu','cn']딕셔너리 = {'name':'bob','age':'20'}집합 = set(['new','world'])파일이름 = '/etc/hosts'내이터레이터 = iter((10,20))for 문자 in 문자열:print(문자)for 항목 in 리스트:print(항목) for 키 in 딕셔너리:print("%s:%s" % (키,딕셔너리[키]))for 요소 in 집합:print(요소)for i in 내이터이터:print(i)파일객체 = open(파일이름)for 줄 in 파일객체: print(줄, # 쉼호는 print의 줄 바꿈을 억제합니다파일객체.close()
실행 결과:
[root@host-192-168-3-6 tarena]# python iter2.py helloteducnage:20name:bobnewworld1020127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
리스트 컴프리헨션
- 매우 유용하고 간단하며 유연한 도구로, 동적으로 리스트를 생성하는 데 사용됩니다 2. 구문: [표현식 for 반복변수 in 반복가능객체]
- 이 문장의 핵심은 for 루프이며, 이는 반복가능객체의 모든 항목을 반복합니다 4. 표현식은 시퀀스의 각 멤버에 적용되며, 최종 결과 값은 해당 표현식이 생성한 리스트입니다 5. 한 줄에서 for 루프를 사용하여 모든 값을 리스트에 배치할 수 있습니다:6. 반복 변수는 표현식의 일부일 필요는 없습니다
- 리스트 컴프리헨션의 표현식은 내장 map() 함수 및 lambda를 대체할 수 있으며, 더 효율적입니다
- if 문과 결합하여 리스트 컴프리헨션은 확장된 구문 버전을 제공합니다
[표현식 for 반복변수 in 반복가능객체 if 조건식]
이 구문은 반복 시 조건식을 만족하는 시퀀스 멤버를 필터링/캡처합니다
리스트 컴프리헨션은 모든 데이터를 메모리에 저장하여 반환합니다;
리스트 컴프리헨션은 파이썬 이터레이션 메커니즘의 응용으로, 새로운 리스트를 생성하는 데 자주 사용되므로 []에 사용됩니다;
리스트 컴프리헨션을 사용하면 컴파일러가 최적화되며, 간추려진 것 때문에 효율이 저하되지 않고 오히려 효율이 향상되고 코드 양이 줄어들어 가독성이 높아지고 작업량이 감소하며 오류 발생 가능성이 줄어듭니다;
예제 1: 1부터 4까지의 제곱 리스트를 빠르게 생성#i를 1-4에서 추출하여 i의 값을 2제곱 연산<br></br>>>> a = [i ** 2 for i in range(1, 5)]<br></br>>>> a<br></br>[1, 4, 9, 16]예제 2: 1부터 10까지의 홀수 제곱 리스트를 빠르게 생성
#i를 1-10에서 추출하여 모듈러 연산을 수행, 추출된 모듈러가 1이면 해당 값을 제곱합니다>>> b = [i ** 2 for i in range(1, 11) if i % 2]>>> b[1, 9, 25, 49, 81]
예제 3: 1부터 10까지의 짝수 제곱 리스트를 빠르게 생성
#i를 1-10에서 추출하여 모듈러 연산을 수행, 추출된 모듈러가 0이면 해당 값을 제곱합니다>>> c = [i ** 2 for i in range(1, 11) if not (i % 2)]>>> c[4, 16, 36, 64, 100]
람다 표현식
람다 원형: lambda 매개변수: 작업(매개변수)
람다 함수는 익명 함수라고도 하며, 즉 구체적인 이름이 없는 함수입니다. 이는 단일 행 함수를 빠르게 정의하고, 함수가 필요한 모든 곳에 사용할 수 있게 해줍니다.
람다는 함수 객체를 반환하지만, 이 객체는 식별자에 할당되지 않습니다
람다 표현식: 뒤에는 단 하나의 표현식만 올 수 있습니다
if 또는 for 또는 print와 같은 문장은 람다에서 사용할 수 없습니다
람다는 일반적으로 간단한 함수를 정의하는 데 사용됩니다
>>> map(lambda x: x ** 2, range(6))[0, 1, 4, 9, 16]
map()은 파이썬의 내장 고차 함수로, 함수 f와 리스트를 받아 함수 f를 리스트의 각 요소에 순서대로 적용하고, 새로운 리스트를 반환합니다.
다음과 같은 리스트 컴프리헨션으로 대체할 수 있습니다:
>>> [x ** 2 for x in range(6)][0, 1, 4, 9, 16, 25]
filter()와 람다를 사용하여 시퀀스에서 홀수를 선택:
>>> 시퀀스 = [11, 10, 9, 9, 10, 10, 9, 8, 23, 9, 7, 18, 12, 11, 12]>>> filter(lambda x: x % 2, 시퀀스)[11, 9, 9, 9, 23, 9, 7, 11]
filter() 함수는 시퀀스를 필터링하는 데 사용되며, 조건에 맞지 않는 요소를 필터링하고 조건에 맞는 요소로 구성된 새 리스트를 반환합니다
filter()와 람다를 사용하지 않아도, 리스트 컴프리헨션을 사용하여 원하는 숫자를 얻을 수 있습니다:
>>> [x for x in 시퀀스 if x % 2][11, 9, 9, 9, 23, 9, 7, 11]
3행 5열의 행렬을 반복해야 하나요? 간단합니다:
>>> [(x+1,y+1) for x in range(3) for y in range(5)][(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2,3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
제너레이터 표현식
-
제너레이터 표현식은 리스트 컴프리헨션의 확장이며, 기본 구문은 거의 동일합니다
-
제너레이터는 특정 함수로, 값을 반환한 후 코드 실행을 "일시 중단"하고 나중에 다시 시작할 수 있습니다
-
리스트 컴프리헨션의 한계는 전체 리스트를 생성해야 한다는 점입니다. 이는 대량 데이터를 가진 이터레이터에 부정적인 영향을 미칠 수 있습니다.
-
제너레이터 표현식은 리스트 컴프리헨션과 제너레이터를 결합하여 이 문제를 해결합니다.
-
제너레이터 표현식은 파이썬 2.4에 도입되었으며, 실제로 모든 데이터를 생성하는 대신 제너레이터를 반환합니다
-
제너레이터는 각 항목이 계산될 때마다 그 항목을 '생성'(yield)합니다
-
제너레이터 표현식은 "지연 계산"(lazy evaluation)을 사용하므로 메모리 사용이 더 효율적입니다
-
제너레이터 표현식 구문:(표현식 for 반복변수 in 반복가능객체 if 조건식) 9. 제너레이터는 리스트 컴프리헨션을 폐기하는 것이 아니라, 메모리 사용에 더 친화적인 구조입니다
집합 컴프리헨션
집합 컴프리헨션은 리스트 컴프리헨션과 사용법이 동일하지만, 집합 컴프리헨션은 {} 중괄호를 사용합니다;
집합1 = {(x,x+1) for x in range(10)} print(집합1)
딕셔너리 컴프리헨션
딕셔너리 컴프리헨션도 {} 중괄호를 사용합니다;
딕셔너리에는 key-value 쌍이 있으므로, 딕셔너리 컴프리헨션을 사용할 때 key는 자동으로 중복 제거됩니다;
# 딕셔너리 컴프리헨션 딕셔너리1 = {'{}'.format(x):x for x in range(10)} print(딕셔너리1) # 세 요소 출력, key가 중복되어 덮어쓰기됨 딕셔너리2 = {x:y for x in range(3) for y in range(3)} print(딕셔너리2) # 위 식과 동일 딕셔너리3 = {} for x in range(3): for y in range(3): 딕셔너리3[x] = y print(딕셔너리3)
연습 문제
-
while 루프를 사용하여 1 2 3 4 5 6 8 9 10 출력
-
1-2+3-4+5 ... 99까지 모든 수의 합 계산
-
사용자 로그인(3회 기회): 총 3회 기회, 3회 모두 실패 시 종료
-
숫자 맞추기 게임: 3회 기회, 3회 중 맞추지 못하면 힌트 제공, 3회 모두 맞추지 못하면 격려! 참고 답안:1. while 루프를 사용하여 1 2 3 4 5 6 8 9 10 출력
#!/usr/bin/env python#-*- coding:utf-8 -*-숫자 = 1while True: if 숫자 <=10: if 숫자 == 7: pass else: print(숫자) 숫자 += 1실행 결과:
1234568910 2. 1-2+3-4+5 ... 99까지 모든 수의 합 계산 방법 1:합계100 = 0시작 = 1while 시작 < 100: 임시 = 시작 % 2 if 임시 == 1: 합계100 = 합계100 + 시작 else: 합계100 = 합계100 - 시작 시작 += 1print(합계100)방법 2:
#!/usr/bin/env python#coding:utf-8합계100 = 0시작 = 1while 시작 < 100: 임시 = 시작 % 2 if 임시 == 1: if 시작 == 1: s = str(시작) else: s = s + "+" + str(시작) 합계100 = 합계100 + 시작 else: s = s + "-" + str(시작) 합계100 = 합계100 - 시작 시작 += 1print(s)print(합계100)
3. 사용자 로그인(3회 기회): 총 3회 기회, 3회 모두 실패 시 종료
i = 0while i < 3: 사용자= input("사용자 이름: ") 비밀번호 = input("비밀번호: ") if 사용자 == "bob" and 비밀번호 == "123": print("예") break else: print("다시 시도...") i += 1
실행 결과:
사용자 이름: bob비밀번호: 12345다시 시도...사용자 이름: bob비밀번호: 1234다시 시도...사용자 이름: bob비밀번호: 123예 4. 숫자 맞추기 게임: 3회 기회, 3회 중 맞추지 못하면 힌트 제공, 3회 모두 맞추지 못하면 격려!
방법 1: random 모듈과 for 루프 사용
#!/usr/bin/env python#-*- coding:utf-8 -*-import random # 랜덤 모듈랜덤숫자 = random.randrange(10) # 0-9에서 무작위로 숫자 선택for i in range(3): 추측숫자 = int(input("숫자를 추측하세요: ")) if 추측숫자 == 랜덤숫자: print("정답입니다!") break elif 추측숫자 > 랜덤숫자: print("너무 큽니다. 작은 숫자를 시도해보세요") else: print("너무 작습니다. 큰 숫자를 시도해보세요")else: print "좀 더 분발하세요, 이번은 운이 없었던 것 같아요. 다음에 다시 시도해보세요"print("이 숫자는 %d입니다" % 랜덤숫자)
실행 결과:
숫자를 추측하세요: 7너무 작습니다. 큰 숫자를 시도해보세요숫자를 추측하세요: 9정답입니다!이 숫자는 9입니다random 모듈 일부 내용:
random.randrange([시작,] 끝 [,단계]) 메소드: 지정된 증가 기준 집합에서 무작위 숫자를 반환하며, 기준 기본값은 1입니다. 예를 들어: random.randrange(0, 101, 2)는 0에서 100 사이의 무작위 짝수를 선택합니다:
방법 2: random 모듈과 while 루프 사용
#!/usr/bin/env python#-*- coding:utf-8 -*-import random랜덤숫자 = random.randrange(10)시도횟수 = 0while 시도횟수 < 3: 추측숫자 = int(input("추측할 숫자를 입력하세요: ")) if 추측숫자 > 10: print("입력한 숫자가 범위를 벗어났습니다") continue if 추측숫자 == 랜덤숫자: print("와! 정답입니다!") break elif 추측숫자 < 랜덤숫자: print("추측한 숫자가 작습니다. 더 큰 숫자를 시도해보세요") else: print("추측한 숫자가 큽니다. 더 작은 숫자를 시도해보세요") 시도횟수 +=1else: print("좀 더 분발하세요, 이번은 운이 없었던 것 같아요. 다음에 다시 시도해보세요")print("이 숫자는 %d입니다" % 랜덤숫자)# 추측숫자> 10으로 실행하면 더 큰 숫자를 입력하면 continue가 실행되어 해당 루프를 빠져나가고 시도횟수 +=1이 실행되지 않아 카운트되지 않습니다!
실행 결과:
추측할 숫자를 입력하세요: 6추측한 숫자가 큽니다. 더 작은 숫자를 시도해보세요추측할 숫자를 입력하세요: 4추측한 숫자가 큽니다. 더 작은 숫자를 시도해보세요추측할 숫자를 입력하세요: 3와! 정답입니다!이 숫자는 3입니다