Search
🔎

basic

파이썬의 가상환경

파이썬을 사용하다 보면 pip로 패키지를 설치하게 되는데 이 패키지들은 파이썬 설치 폴더(디렉토리)의 Lib/site-packages 안에 저장된다. 그래서 pip로 설치한 패키지는 모든 파이썬 스크립트에서 사용할 수 있게 된다. 평상시에는 이런 방식이 큰 문제가 없지만 프로젝트를 여러 개 개발할 때는 패키지의 버전 문제가 발생한다. 즉, 글로벌 파이썬 환경에서 패키지들끼리 호환되지 않는 경우가 생길 수 있다.
이런 문제를 해결하기 위해 가상 환경을 제공하는데, 이는 독립된 공간을 만들어주는 기능이다. 가상 환경에서 pip로 패키지를 설치하면 가상 환경 폴더(디렉토리)의 Lib/site-packages 안에 패키지를 저장한다. 즉, 개별적인 프로젝트마다 가상 환경을 만들어서 서로 다른 패키지 버전을 설치할 수 있고 호환이 가능한 것이다.
특히, 가상 환경에서는 파이썬 실행 파일(인터프리터) 자체도 포함이 되기때문에 각 가상 환경 별로 다른 버전의 파이썬 인터프리터가 들어갈 수도 있다.
print( sep=" ", end="\n")
매개변수
설정값
sep
default : " ", 다른 기호로 설정해주면 여러 개를 출력할 때 그 기호가 사이에 끼어 들어감. (ex) sep="" ( 공백 없는 상태로 출력)
end
default : "\n", 다른 기호로 설정해주면 내용이 끝나고 다음 print에서 그 기호 뒤에 출력해준다. (ex) end="와" ( 와 뒤에 다음 프린트 내용 출력)
print(12,34,56, sep="^^", end="-->") print(78)
Python
복사
input() : 사용자로부터 값을 입력 받을 때 사용하는 함수. 변수에 저장해놔야 사용할 수 있다.
age = input("당신의 나이는 몇 살입니까?") print(age, "살", sep="") # 이때 sep=""을 해줘야 살이 붙여져서 나온다.
Python
복사
input은 입력받은 값을 모두 문자로 처리한다. 따라서 수치 연산을 하게 되면 그냥 붙여져서 나온다.
a = input("당신의 나이는 몇 살입니까?") b = input("당신의 영어점수는 몇 점입니까?") print("두 수의 합은: ", a+b)
Python
복사
만약 a = 25, b= 50 이면 a+b 는 2550으로 나온다.
하지만 int()함수를 사용하면 문자도 숫자(정수)로 바꿀 수 있다.
price = input("가격을 입력하세요: ") num = input("개수를 입력하세요: ") sum = int(price)*int(num) print("총액은",sum,"원입니다.")
Python
복사
하지만 위의 과정이 귀찮다면 input()을 할 때 바로 int로 저장하면된다.
price = int(input("가격을 입력하세요: ")) num = int(input("개수를 입력하세요: ")) sum = price*num print("총액은",sum, "원입니다.")
Python
복사

-variable-

변수 이름을 지어줄 때는 문자, 숫자, 밑줄기호만 사용할 수 있다.
숫자가 맨 처음에 오면 안된다.
ex) 4number (x)
변수 이름에 공백이 들어가면 안된다. 그럴때는 그냥 밑줄기호 사용
변수를 할당할때는 메모리 공간이 생기는데 그 공간의 번호는 id(변수)를 명령하면 구할 수 있다.

-data type basic-

변수의 타입은 변수에 들어가있는 데이터의 타입을 말하며 데이터의 타입을 불러오려면
type() 함수를 사용하면 된다.
1.
int
2.
float
3.
string
int (정수형)
파이썬은 10진수 정수 외에도 2진수, 8진수, 16진수를 모두 저장할 수 있다.
# 2진수 (0b를 접두어로) a = 0b1101 print(a) # 8진수 (0o를 접두어로) a = 0o17 print(a) # 16진수 (0x를 접두어로) a = 0xaf print(a) # 10진수를 다른 진수로 바꾸려면 print(bin(33)) # 33을 2진수로 print(oct(26)) # 26을 8진수로 print(hex(31)) # 31을 16진수로
Python
복사
float (실수형)
지수형도 저장할 수 있다.
my_money = 2.124e14 your_money = 9.174e13 d = 4.32e-3 print(my_money,your_money,d,sep=" / ")
Python
복사
complex (복소수)
복소수도 저장할 수 있다. 허수는 j로 나타낸다.
a = 1 + 2j b = 3 + 4j print(a + b)
Python
복사
bool(논리형)
변수의 값을 비교하는 연산자는 비교 결과를 논리형으로 반환한다.
a=5 b=a==5 # 순서대로 = 다음에 == 를 적용 print(b) print(type(b))
Python
복사
b1= True b2 = False a=4 if a==5: print("a의 값은 5입니다.") else: print("a의 값은 5가 아닙니다.")
Python
복사
string(문자형)
문자열은 ""나 ''로 감싸서 나열한 것. 저장할 수 있는 길이에 제한이 없다.
print("I say "Hello" to you.") # error 발생 print('I say "Hello" to you.') print("I say \"Hello\" to you.") #쓰고 싶은 문자형이 있다면 a=4 if a==5: print("a의 값은 5입니다.") else: print("a의 값은 5가 아닙니다.") print('Let's go!') # error print("Let's go!") print('Let\'s go!') # --> 홑따옴표로 시작하면 홑따옴표로 닫아주어야 한다. # --> 쌍따옴표로 시작하면 쌍따옴표로 닫아주어야 한다. # 문자열을 출력할 때 다음줄에 나타내고 싶으면 print("first\nsecond") # 물론 \는 path를 구분지을 때 사용하기도 한다. path = r"c:\temp\new.txt" # 이때 r을 접두어로 붙이면 탈출문자 적용x, 그대로 기억 print(path)
Python
복사
# 긴 문자열을 문단형식으로 저장하는 방법--> """ """ 을 사용하거나 ''' ''' 사용 s1 = """긴 문자열 입력 부분입니다. 긴 문자열 입력 부분입니다. 긴 문자열 입력 부분입니다. 긴 문자열 입력 부분입니다. 긴 문자열 입력 부분입니다.""" print(s1) # 이때, \는 줄바꿈이 일어나지 않고 연달아 입력함을 의미 s2 = "따옴표 하나로 문단을 처리하는 방법\ \n따옴표 하나로 문단을 처리하는 방법\ \n따옴표 하나로 문단을 처리하는 방법\ \n따옴표 하나로 문단을 처리하는 방법" print(s2)
Python
복사
결국 s1과 s2의 결과는 비슷하다.
# 문자열 병합하기 s3 = "korea" "japan" "2002" print(s3) s3 = "korea" + "japan" + "2002" print(s3)
Python
복사
결과는 같다.
operator(연산자)
1.
산술연산자 : 사칙연산을 수행(+ , - , * , ** , / , // , %)
# /는 단순나누기, //는 나누고 소수점 버리는 연산자 print(10/4) print(1000//400) # ** 는 거듭제곱 # %는 나눗셈의 나머지 print(3%4) print(27%5)
Python
복사
2.
대입연산자 : 변수에 값을 대입할 때 사용하는 연산자(=, +=, -=, *=, /=, %=)
# =과 함께 붙여져 있는 연산자는 복합연산자다. a += 3 # a = a + 3 을 의미 print(a) a -= 5 # a = a - 5
Python
복사
3.
shift 연산자
a = 2 print(a << 3) # 왼쪽으로 세번 민다. 2의 세제곱을 곱한다. -> 결과 2 * 2^3 = 16 print(a >> 3) # 오른쪽으로 세번 민다. 오른쪽으로 밀 자리가 더이상 없기 때문에 = 0
Python
복사

-타입변환-

연산자는 피연산자의 타입에 따라 같은 연산자여도 다른일을 수행할 수 있다.
1.
string operating
# + 와 * 연산에 대해 숫자와 다른 연산을 수행한다. s1 = "우리나라 " s2 = "좋은나라" # 문자열의 +는 그냥 연결한다. print(s1 + s2) print(s1, s2, sep="") # 와 같음 # * 는 문자열을 곱해진 정수만큼 반복한다. 좌항은 문자열, 우항은 정수가 와야한다. # 문자열끼리 곱하거나 실수를 곱할 수는 없다. print(s1 * 5) print("배고파 " * 4) print("-" * 40)
Python
복사
# 문자열string을 정수int로 바꾸기( 숫자인 경우만 가능 ) s = "홍길동의 점수: " n = 96 print(s + n) # error # 이 경우는 n을 문자로 바꿔줘야 한다. print(s,str(n),sep="") print(s + str(n)) # int()는 문자열이 숫자형태여야 변환가능하다. print(int("23%")) print(int("23.4")) print(int("23")) # 물론 int()로 변환시에 다른 진수로도 바꿀 수 있다. 2번 인자값으로 설정 num1 = int("1a",16) # 1a는 16진법 num2 = int("110", 2) # 110은 2진법수 print(num1, num2, int("77", 8)) # 77은 8진법수
Python
복사
2.
float operating
#문자열로 되어있는 실수를 실수형으로 변환하려면 float()을 사용한다. print(float("2.22")) print(float("314e-2")) # 실수를 정수로 변환할때 int()를 사용하면 소수점 아래는 버린다. print(int(2.77)) # --> 결과 2 # 반올림할때는 round()함수를 사용한다. 반올림할 자리수는 2번 인자값으로 설정한다. print(round(2.77)) # --> 결과 3, default는 0번째 소수점으로 반올림 print(round(2.77, 1)) # --> 결과 2.8 , 1번째 소수점으로 반올림 print(round(2.76785, 3)) # --> 결과 2.768 , 3번째 소수점으로 반올림 print(round(1234567, -3)) # --> -3은 4이고 결과는 1235000
Python
복사

조건문 if

지켜야 할 조건
# 간단하게 age = int(input("당신의 나이는 몇 살인가요? ")) if age >19: print("당신은 성인입니다")
Python
복사
비교연산자(==, != , <=, >=, <, >)
# 문자열도 비교할 수 있다.(동등, 비동등) print("=" * 40) fruit = "Peach" if fruit == "Peach": print("복숭아입니다.") if fruit == "PEACH": print("피치입니다.") # -->출력값 없음 # 문자열끼리도 대소비교 가능(사전순서로 비교, 뒤로갈수록 커진다.) if "apple" < "grape": print("사과가 포도보다 작습니다.") if "김강찬" < "홍길동": print("홍길동이 김강찬보다 큽니다.") if "zoo" < "동물원": print("영어가 한국어보다 작습니다.")
Python
복사
영어가 한국어보다 크기가 작다.
논리 연산자(두개 이상의 조건을 동시에 검사, and, or, not)
1.
and 는 두 조건이 모두 참이면 True
2.
or은 두 조건 중 하나만 참이면 True
3.
not연산자는 결과를 반전시킴(True→False)
# and if a > 1 and a < 10 : print("a는 1보다 크고 10보다 작다.") # 또는 if 1 < a < 10 : print("위의 결과와 같다.") # or if a==3 or a==5: print("a는 3이거나 5입니다.") # 만약 첫째 조건에서 결과가 나오게 되면 나머지 조건은 수행하지 않는다. a = 0 if a==1 and 10/a : # 이미 a==1에서 거짓 print("a가 0입니다.") else: print("에러없이 통과") # not if not a<0 :# a>=0 이면 아래 수행 print("a는 0보다 작지 않습니다.")
Python
복사

if -else 문

if 문은 조건이 있어야 하지만 else문은 아무것도 적지 않는다. if문은 단독으로 사용 가능. else는 if와 함께 사용
point = int(input("당신의 점수를 입력하세요: ")) if point >= 60 : print("60점이상의 점수를 획득하셨습니다.") print("축하드립니다! 합격하셨습니다.") else : print("60점 미만의 점수를 획득하셨습니다.") print("불합격하셨습니다.") print("수고하셨습니다!")
Python
복사
# if-else 퀴즈 ''' 1. 놀이기구에 키가 140cm이상이고, 나이가 8세 이상인 사람만 탑승한다고 가정합니다. 2. 먼저 키(height)와 나이(age)를 입력받으세요. 3. 조건문 if~else를 사용하여 2개의 조건이 모두 참일 경우 "놀이기구에 탑승할 수 있습니다."를 출력하세요. 4. 위 조건이 거짓일 경우 "놀이기구에 탑승할 수 없습니다."를 출력하세요. 5. 조건식과는 별개로 "오늘 하루 즐거운 시간되세요!"를 출력하세요. ''' height = int(input("키가 몇입니까?(cm): ")) age = int(input("나이가 몇 살입니까?: ")) if age >= 8 and height >= 140 : print("놀이기구에 탑승할 수 있습니다.") else: print("놀이기구에 탑승할 수 없습니다.") print("오늘 하루 즐거운 시간되세요!")
Python
복사

if-elif 문

조건을 여러가지 설정하고 싶을 때 if 블록 밑에 하위조건문 elif를 사용하고 여러 elif를 사용할 수도 있다. 조건설정이 중복되지 않도록 나누어야 함을 주의하자.
age = int(input("나이를 입력하세요: ")) if age >= 20: print("성인입니다.") elif age >= 17 : print("고등학생입니다.") elif age >= 14: print("중학생입니다.") elif age >= 8 : print("초등학생입니다.") else: print("미취학 아동입니다.")
Python
복사
print("단어를 입력하세요.") print("[안녕, 헬로, 니하오, 곤니치와]") lang = input("> ") if lang=="안녕": print("한국어입니다.") elif lang=="헬로": print("영어입니다.") elif lang=="니하오": print("중국어입니다.") elif lang=="곤니치와": print("일본어입니다.") else: print("단어를 입력하세요.")
Python
복사
# elif 퀴즈 ''' * 퀴즈 1. 정수를 입력받아 해당 정수가 5의 배수이면 "입력하신 숫자는 5의 배수입니다"를 출력. 2. 0이라면 "입력하신 숫자는 0입니다."를 출력. 3. 그 외의 숫자를 입력하면 "입력한 숫자는 5의 배수가 아닙니다."를 출력하세요. 4. 힌트 5의 배수는 5로 나눌 시 나머지가 0이다. ''' number = int(input("정수를 입력하세요: ") if number == 0: print("입력하신 숫자는 0입니다.") elif number % 5 == 0: print("입력하신 숫자는 5의 배수입니다.") else: print("입력하신 숫자는 5의 배수가 아닙니다.")
Python
복사

if 중첩문

if안에 또 다른 if문이 있는 경우다. 상위의 if가 True여야 아래 if문을 실행한다.
age = int(input("나이를 입력하세요: ")) gender = input("성별을 입력하세요: ") if gender == "남자": if age > 19: print("성인 남자입니다.") else: print("청소년 남자입니다.") elif : if age > 19 : print("성인 여자입니다.") else: print("청소년 여자입니다.") else: print("성별을 다시 입력하세요: ")
Python
복사
# if 중첩문 퀴즈 ''' 1. 점수(point)를 입력받아 90점 이상이면 다시한번 조건을 검사하여 100점을 초과할 경우 "점수를 잘못 입력했습니다", 95점이상일 경우 "당신의 학점은 A+입니다.", 위 두조건이 모두 거짓일 경우 "당신의 학점은 A입니다." 를 출력하세요. 2. 다중 분기 조건문을 이용하여 80점이상이면 "당신의 학점은 B입니다." 70점이상이면 C, 60점 이상이면 D, 그 미만은 모두 F학점으로 처리하세요. ''' point = int(input("점수를 입력하세요: ")) if point >=90 : if point > 100 : print("점수를 잘못 입력했습니다.") elif point >= 95: print("당신의 학점은 A+입니다.") else: print("당신의 학점은 A입니다.") elif point >= 80 : print("당신의 학점은 B입니다.") elif point >= 70 : print("C") elif point >= 60 : print("D") else: print("F")
Python
복사

반복문 while

파이썬의 반복문은 while과 for 가 있다.
student = 1; while student <= 5: print(student, "번 학생의 출석을 체크합니다." ,sep="") student += 1 num = 1 sum = 0 while num <= 10: sum += num num += 1 print("1부터 10까지의 누적합계: ", sum, sep="") # 201 ~ 400 사이의 모든 홀수의 합계를 while을 사용해서 구해보라. num = 201 sum = 0 while num <= 400 : if num % 2 == 1: sum += num num += 1 print("201~400사이의 모든 홀수의 누적합계: ", sum, sep="") # 또는 아래와 같이 구할수도 있다. num = 201 sum = 0 while num <= 400: sum += num num += 2 print(sum)
Python
복사
''' * while 연습 - 정수를 하나 입력받아 1부터 입력받은 정수까지의 누적합계를 while을 사용하여 구하는 코드를 만드세요. ex) 출력 예시: "1부터 x까지의 누적합계: y" ''' num = int(input("정수를 입력하세요(양수): ")) sum = 0 i = 1 while i <= num : sum += i i += 1 print("1부터 %d까지의 누적합계: "%num , sum,sep="") # ex2 ( 커피판매기 ) coffee = 10 while True: money = int(input("돈을 넣어주세요: ")) if money == 300: print("커피를 줍니다.") coffee -= 1 elif money > 300 : print("거스름돈", money-300, "원을 주고 커피를 줍니다.",sep="") coffee -= 1 else: print("돈을 다시 돌려주고 커피를 주지 않습니다.") print("남은 커피의 양은 ", coffee, "개 입니다.",sep="") if not coffee : # 이때 0은 boolean으로 보면 False이다. print("커피가 다 떨어졌습니다. 판매를 중지합니다.") break # break는 반복문을 빠져나온다는 의미
Python
복사

반복문 for

for문은 리스트나 문자열같이 인덱스가 있는 경우의 요소들을 순서대로 꺼내서 반복하는 반복문이다.
for student in [1,2,3,4,5]: print(student,"번 학생 출석합니다.", sep="") # 보통 in 뒤에 내부의 요소를 일일이 적는것보다는 range()함수를 사용한다. # range(시작값, 끝값, 증가/감소값) # 파이썬의 특징은 끝값-1 까지만 포함한다는 특징이있다. # 또한 시작점은 지정해주지 않으면 0부터다. # 위의 식을 range()를 이용해서 쓰면 for student in range(1,6): print(student,"번 학생의 출석을 체크합니다.", sep="") # 1 ~ 100 까지의 누적합 range() 이용 sum = 0 for i in range(1, 101): sum += i print("1~100까지의 누적합: ", sum, sep="") # 1부터 특정 정수까지의 누적합계 num = int(input("양의 정수를 입력하세요: ")) sum = 0 for i in range(1,num+1): sum += i print("1부터 %d까지의 누적합계: "%num, sum, sep="") # 2 ~ 100 까지의 누적 짝수합을 구하는 for 문 sum = 0 for i in range(2, 101, 2): sum += i print("2부터 100까지의 누적 짝수합: ", sum, sep="")
Python
복사
주로 while은 반복의 정확한 횟수를 모를 때, for문은 반복 횟수를 알고 있을 때 사용한다.
# for ex_02 # 반복문은 반복을 끝내기 위한 제어변수라는 것을 사용한다. # 반드시 사용하는 것은 아니고 단순히 반복횟수를 통제하는 용도로 사용할 수 있다. # boolean에서 0은 False 이고 그 외의 숫자들은 True다. for a in range(5): # 단순 다섯번 반복 print("안녕하세요?") # 50개의 - 를 출력하되 매 10번째에는 +를 출력하는 for 문 사용 for i in range(50): if (i+1) % 10 == 0: print("+",end="") else: print("-",end="") # 또는 아래와 같이 할 수 있다. for x in range(1,51): if x % 10 == 0: # 또는 그냥 if not x % 10 print("+",end="") else: print("-",end="") # 또는 아래와 같이 할 수 있다. for x in range(1,6): print("-"*9, end="") print("+",end="") # 또는 이렇게 할 수 있다. x = 1 while x <= 50: if x % 10 : print("-",end="") else: print("+",end="") x += 1 # 50개의 -를 출력하되 매 5번째에는 +가 출력되게 반복문으로 나타내라. for i in range(1,11): # 묶음으로 치면 5개씩 10번 반복이니까 print("-"*4,end="") print("+",end="") for i in range(1,51): if i % 5 : # 5의 배수가 아닌 것들 print("-",end="") else: # 0부터 5의 배수인 것들 print("+",end="") # 50개의 -를 출력하되 5, 15, 25, 35, 45번째에는 +가 출력되게 하세요. for i in range(1,51): if i % 10 == 5: # 위의 숫자들은 10으로 나눴을때 나머지가 5가 나오는 숫자들이다. print("+",end="") else: print("-",end="")
Python
복사

탈출문 break

현재 반복문을 즉시 종료하고 반복문을 탈출한다. 보통 if문과 같이 사용한다.
score=[92,56,33,127,99] for s in score: if (s<0 or s>100): break print(s) #--> 결과는 127 이라는 점수전까지 출력될 것임. for a in range(1,11) : #1부터 10까지 print(a, end="") if a == 6: break print("\n반복문 종료!") # --> 결과는 1부터 6까지 출력된다.
Python
복사

탈출문 continue

이번 반복만 건너뛰고 다음 반복은 진행하는 탈출문이다.
score = [92,46,22,-1,87] for s in score: if(s == -1): continue # 아래 진행하지 않고 다시 위의 반복문으로 올라간다. print(s) print("점수 처리 완료") # --> 결과는 -1만 빼고 나머지 모두 출력 for a in range(1,11): # 1부터 10까지 if a % 2 ==0 : # 즉 2의 배수이면 continue # 다시 위로 올라간다. print(a, end="") print("\n반복문 종료!") # --> 홀수만 출력하고 종료
Python
복사

이중루프

# 구구단 로직 만들기 ''' 1. 단수를 정수로 입력받고 2. 해당 단수에 맞게 구구단을 반복문 for를 사용하여 출력하세요. ex) 구구단 2단 --------- 2 x 1 = 2 2 x 2 = 4 ~ 2 x 9 = 18 ''' dan = int(input("단수를 입력하세요: ")) print("구구단 %d단"%dan) print("-"*10) for i in range(1,10): result = dan * i print("\n%d x %d = %d"%(dan, i, result)) # 구구단 전체 출력 (이중 루프 사용) for dan in range(2,10): print("-"*10) print("%s단"%dan) print("-"*10) for i in range(1,10): result = dan * i print("%d x %d = %d"%(dan,i,result)) # 위의 방법을 while을 사용하면 dan = 2 while dan <= 9: print("-"*10) print("%s단"%dan) print("-"*10) i = 1 while i <= 9: result = dan * i print("%d x %d = %d"%(dan, i, result)) i += 1 dan += 1
Python
복사
# 이중루프 사용해서 피라미드 만들기 for y in range(1,6): #1부터 5까지 for x in range(y): print("*",end="") print() # 다음 줄로 넘어가기 위해 # 2. """ * ** *** **** 다음과 같은 피라미드 만들기 """ for y in range(1,6): print(" "*(5-y),end="") print("*"*y) # 또는 이중루프를 사용하면 for y in range(1,6): for x in range(5-y): print(" ",end="") print("*"*y) # 3. """ * *** ***** ******* ********* 다음과 같은 피라미드를 만드세요""" # 1. 피라미드가 대칭이므로 반쪽만 생각해보면 전체 공간은 5이고 for y in range(1,6): for s in range(5-y): print(" ",end="") for p in range(2*y-1): # 별의 개수만 생각해보면 print("*",end="") print()
Python
복사

무한루프

무한루프는 while에서만 사용 가능하다. 특정 조건을 만족할 때 break를 통해서 루프를 빠져나온다.
''' while True: 반복명령 if 조건: break ''' print("17 x 3 = ?") while True: answer = int(input("정답: ")) if answer == 51: print("정답입니다!") break print("틀렸습니다.") # coffee machine using infinite loop coffee = 10 # 총 커피는 10잔, 1잔당 가격은 300원 while True: money = int(input("돈을 넣어주세요: ")) if money == 300: print("커피를 줍니다.") coffee -= 1 elif money < 300 : print("돈을 돌려주고 커피를 주지 않습니다.") else: print("거스름돈",(money-300),"원을 주고 커피를 줍니다.") coffee -= 1 if coffee = 0 # 또는 print("커피가 다 떨어졌습니다. 판매를 중지합니다.") break
Python
복사

문자열 조작(index)

s = "python" print(s[2]) print(s[-2]) # 문자열은 리스트의 한 종류. for문을 이용해보기 for c in s: print(c, end=",")
Python
복사

문자열 슬라이스(slice)

인덱스로 불러올 때 범위로 불러오면 slice라고 한다.
# 문자열[start:end:step], # range처럼 end-1까지 포함 print(s[2:-2]) # 끝에서 3번째자리까지 포함 # 연습1 ssn = "960201-2342123" print(ssn[:6]) # 주민번호 앞자리 print(ssn[7:]) # 주민번호 뒷자리 # 연습2 file = "20180819-134709.jpg" print("촬영 날짜: " + file[4:6] + "월 " + file[6:8] + "일") print("촬영 시간: " + file[9:11] + "시 " + file[11:13] + "분 " + file[13:15] + "초") print("확장자 : " + file[-3:]) # 연습 3 yoil = "월화수목금토일" print(yoil[::2]) # 두칸씩 띄어서 읽기--> 월 수 금 일 print(yoil[::-1]) # 순서 뒤집기, 즉 뒤에서부터 한칸씩 읽기
Python
복사

문자열 관련 함수와 메서드

s = "python programming" # len() 길이를 출력 print(len(s)) # find() : 문자열 내부의 원소에 해당하는 인덱스번호를 찾아준다. print(s.find("o")) # rfind() : 문자열 내부의 원소에 해당하는 인덱스번호를 뒤에서 찾아준다. print(s.rfind("o")) # find() 와 rfind() 모두 찾는 문자가 없다면 -1을 출력한다. print(s.find("k")) print(s.rfind("k")) s1 = "C programming" if s1.find("java") == -1: # 즉 찾는 단어가 없다면 print("C와 관련없는 단어입니다.") else: print("C와 관련된 단어입니다.") # index() 는 find()와 수행내용은 같지만 찾는 문자가 없다면 find()와 달리 error을 출력한다. print(s1.index("java")) # count() : 문자열 내부에 해당하는 원소의 등장횟수를 출력 # 찾는 원소가 없다면 0을 출력한다. print(s.count("k")) print(s.count("r")) s2 = """생각이란 생각할수록 생각나므로 생각하지 말아야 할 생각은 생각하지 않으려고 하는 생각이 옳은 생각이라고 생각합니다.""" print("'생각'의 등장 횟수: ", s2.count('생각'))
Python
복사
# in 키워드 : 특정 문자가 문자열 내부에 있는지 없는지 확인. 있으면 True, 없으면 False 반환 # not in : 없으면 True, 있으면 False s = "python programming" print("a" in s) print("r" in s) print("pro" in s) print("x" not in s) ''' startswith(): 특정 문자열로 시작하는지 확인 endswith() : 특정 문자열로 끝나는지 확인 ''' name = "홍길동" if name.startswith("홍"): print("홍씨입니다.") if name.startswith("박"): print("박씨입니다.") file = "cat.jpg" if file.endswith(".jpg"): print("그림파일입니다.") #연습 - 도메인주소 "www.koo.co.kr"이 .kr로 끝나는 한국 도메인인지를 #확인하는 코드를 작성해보세요. domain = "www.koo.co.kr" if domain.endswith(".kr"): print("한국 도메인입니다.") ''' - 사용자에게 입력을 받을 때 입력값을 확인할 수 있다.(이때 입력값은 문자열임을 잊지말것) 1. isalpha() - 모든 문자가 알파벳인지를 조사 2. islower() - 모든 문자가 소문자인지를 조사 3. isupper() - 모든 문자가 대문자인지를 조사 4. isdecimal() - 모든 문자가 숫자인지를 조사 ''' height = input("당신의 키를 입력하세요: ") # 이때 문자열이여야 하고 if height.isdecimal(): print("키: " + height + "cm") else: print("숫자로 입력하세요.") # 백육십이라고 입력하면 이 값으로 출력한다. # str_swap ''' * 문자열 변경 -lower() : 영문 알파벳 모두 소문자로 변경 -upper() : 영문 알파벳 모두 대문자로 변경 -swapcase() : 영문 알파벳의 대소문자를 반대로 뒤집음 -capitalize() : 문장의 첫글자만 대문자로 변경 -title() : 모든 단어의 첫글자를 대문자로 변경 ''' s = "Good afternoon! my name is HONG." print(s.lower()) print(s.upper()) print(s.swapcase()) print(s.capitalize()) print(s.title()) print(s) # 기존의 문자열에 영향을 미치지 않는다. #--> 변경된 문자열을 변수에 재저장하면 완전히 변경된다. # ex) s = s.lower() python = input("파이썬의 영문 철자를 입력하세요: ") if python.lower() == "python": print("정답입니다.") else: print("오답입니다.") # str_trim : 문자열 공백 제거 ''' -공백 제거 메서드 1. lstrip() : 왼쪽 공백 제거 2. rstrip() : 오른쪽 공백 제거 3. strip() : 모든 공백 제거 ''' s = " abc1234 " print(s + "님") print(s.lstrip()+"님") print(s.rstrip()+"님") print(s.strip()+"님") # str_split : 문자열 분할 ''' - 문자열 분할 split() 메서드는 구분자를 기준으로 문자열을 분할하여 리스트에 저장한다. ''' s1 = "떡볶이 김말이 닭강정" print(s1.split()) # default는 공백. 공백을 기준으로 분할 s2 = "서울->대전->대구->부산" city = s2.split("->") # '->'를 구분자로 분할 print(city) for c in city: print(c, "찍고", end=" ") # str_join : 문자열 끼워넣기 ''' join()메서드는 문자열의 각 문자 사이에 다른 문자열을 끼워넣는다. ''' s = "^-^" print(s.join("안알랴쥼")) # join함수 안에 들어오는 것이 기준이 되는 문자고 # join앞에 오는 변수가 끼어들어오는 기호다. # split()과 다르니까 참고 # split과 함께 사용해서 구분자를 교체하는 것도 가능하다. s3 = "배?고?프?다" s4 = s3.split("?") # ?를 기준으로 분할 ---> 리스트 생성 print(s4) print("!".join(s4)) # 연습1 - idol변수에 문자열 "방탄소년단, 여자친구, 아이오아이"가 저장되어 있습니다. # split을 이용해 각 가수이름을 추출한 뒤 "사랑해"와 함께 3줄로 출력하세요 idol = "방탄소년단, 여자친구, 아이오아이" idol = idol.split(", ") for idol in idol: print(idol, "사랑해") # str_replace : 문자열 대체하기 ''' -replace()메서드는 특정 문자열을 찾아 다른 문자열로 대체한다. ''' s = "파이썬 프로그래밍! 파이썬은 문자열을 관리할 수 있는 많은 메서드들이 있어요!" print(s.replace("파이썬","python")) # 파이썬을 python으로 대체 # 연습 - 다음 문자열의 "커피"를 "우유"로 교체하세요. s = "아침에 커피를 마시고 점심먹고 커피 또 마시고 자기 전에도 커피로 마무리~~" print(s.replace("커피","우유")) # zfill() : 자릿수만큼 나머지를 0으로 채운다. a = "Hello WORLD! Hi." b = a.zfill(50) print(b)
Python
복사

함수

함수의 형태는 입력값과 결과값의 존재 유무에 따라 4가지 유형으로 나뉜다.
1.
일반적인 함수 : 입력값과 결과값이 모두 있는 함수
def 함수명(입력 인수): 수행할 문장 . . . return 결과값 # 합을 구해주는 함수 def sum(a,b): result = a + b return result a = sum(3,4) print(a)
Python
복사
2.
입력값이 없는 함수
def say(): return 'Hi' a = say() print(a)
Python
복사
3.
결과값이 없는 함수 : 함수를 호출할 때 return 되지 않기 때문에 변수로 함수를 받지 않는다.( ‘결과값을 받는 변수 = 함수명()’ 을 쓰지 않음)
def sum(a,b): print("%d, %d 의 합은 %d입니다."%(a,b,a+b)) sum(3,4) #위의 함수가 결과값이 있는지 확인해보자 a = sum(3,4) print(a) # 결과는 None
Python
복사
4.
입력값과 결과값이 모두 없는 함수 : ‘함수명()’ 으로 사용한다
def say(): print('Hi') say()
Python
복사
입력값이 몇 개가 될지 모를 경우
입력 인수 부분이 ‘*입력 변수’로 바뀐다. (이때 입력변수들은 튜플 형태로 변한다.)
# 여러 개의 입력값을 모두 더해주는 함수 만들기 def sum_many(*args): sum = 0 for i in args: sum += i return sum # 두번째 예시 def sum_mul(choice,*args): if choice=="sum": result=0 for i in args: result += i elif choice=="mul": result = 1 for i in args: result *= i return result result = sum_mul("sum",1,2,3,4,5,6,7,8,9,10) print(result) # 결과는 55 result = sum_mul("mul",1,2,3,4) print(result) # 결과는 24
Python
복사
함수의 결과값은 언제나 하나다.
def sum_and_mul(a,b): return a+b, a*b result = sum_and_mul(3,4) print(result) # 결과는 (7,12) , 튜플의 형태로 출력해준다. # 두개의 변수로 받고 싶다면 아래와 같이 호출한다. (그냥 숫자형으로 받는다) sum, mul = sum_and_mul(3,4) print(sum) print(mul)
Python
복사
함수는 return문을 만나는 순간 결과값을 반환해주고 함수를 빠져나간다. 즉, 함수 내에 return이 여러개 있어도 맨 처음 만나는 return을 만나는 순간 함수는 종료된다.
—> 이런 return의 성질을 이용해서 함수를 빠져나가는 장치로 사용할 수 있다.
# return을 함수를 종료시키는 장치로 사용하는 예제 def say_nick(nick): if nick=="바보": return print("나의 별명은 %s입니다."%nick) say_nick("바보") # 아무것도 출력되지 않는다 say_nick("멍청이")
Python
복사
입력 인수에 초깃값 미리 설정하기
def say_myself(name,old,man=True): print("나의 이름은 %s입니다."%name) print("나이는 %d입니다."%old) if man: print("남자입니다.") else: print("여자입니다.") say_myself("박응용",27) say_myself("박응용",27,?) # 인수의 초깃값 위치를 바꾸면 주의해야할 점! def say_myself(name,man=True,old): print("나의 이름은 %s입니다."%name) print("나이는 %d입니다."%old) if man: print("남자입니다.") else: print("여자입니다.") say_myself("박응용",27) # 을 하게되면 man이라는 인자에 집어넣은 것이다--> old인자에 값이 없다.-->오류
Python
복사
결론적으로는, 초깃값 인자를 설정할 때는 해당 인자를 맨 뒤에 위치시키자
함수 안에서 선언된 변수의 효력 범위
함수 안에서 사용한 변수를 함수 밖에서도 동일하게 사용할 수 있을까?
a = 1 # 함수 밖의 변수 a def vartest(a): # 함수 내의 변수 a a += 1 # 결과값은 없다 vartest(a) # 결과값은 여전히 없다 print(a) # 함수 밖의 변수 a의 값을 반환한 것이다.
Python
복사
즉, 함수 밖의 a와 함수 내의 a는 전혀 다른 변수다.
def vartest(a): a += 1 vartest(3) # 함수 내의 a인자에 3대입, but 반환값 없음 print(a) # 함수 밖에서 만든 변수 a를 반환, 결과는 1
Python
복사
함수 안에서 함수 밖의 변수를 변경하는 방법
return 사용하기
a = 1 # 함수 밖의 변수 a def vartest(a): # 함수 내의 변수 a a += 1 return a # 반환한다 a = vartest(a) # vartest(a)의 결과값을 함수 밖의 변수 a에 대입 print (a)
Python
복사
global 명령어 사용하기 : 별로 추천하지 않는다.
a = 1 def vartest(): global a # 함수 내의 변수 a를 전역변수 a와 일치시킴 a += 1 vartest() # 함수 밖의 변수값을 이미 아니까 굳이 다시 넣어줄 필요 없음 print(a)
Python
복사

사용자 입력과 출력

입력은 먼저 input과 프롬프트가 있다.
1.
input
a = input() # 입력한다. a # 'Life is too short, you need python'
Python
복사
2.
input 을 이용하면서 질문을 띄우기
number = input("숫자를 입력하세요: ") # 입력 print(number) # '3'
Python
복사
사용자 입력의 결과값은 문자열 형태라는 것을 기억하자
print 자세히 알기
큰 따옴표(”)로 둘러싸인 문자열은 + 연산자와 동일하다
print("life" "is" "too short") print("life"+"is"+"too short")
Python
복사
콤마를 사용하면 문자열 간에 띄어쓰기를 할 수 있다.
print("life","is","too","short")
Python
복사
한 줄에 결과값 출력하기
한 줄에 결과값을 계속 이어서 출력하려면 print의 인수 end=” ” 로 지정한다.
for i in range(10): print(i, end=" ")
Python
복사

파일 읽고 쓰기

파일을 통한 입출력 방법에 대해서 공부해보자. 결과값을 새 파일에 출력하거나 파일에 적힌 내용을 읽어보는 것이다.
f = open("새파일.txt", 'w') # 새파일.txt 파일을 열어서 쓰기 모드, 워킹 디렉토리에 생성 f.close() # 파일을 닫기,왠만하면 사용해주자
Python
복사
r : 읽기 모드
w : 쓰기 모드
a : 추가 모드, 파일의 마지막에 새로운 내용을 추가할 때 사용ㅇ
만약, 기존에 동일한 파일이 있는데 쓰기모드로 열게 되면 기존에 있던 내용은 모두 삭제된다.
f = open("디렉토리/새파일.txt", 'w') for i in range(1,11): # 1~10 data = "%d번째 줄입니다.\n"%i f.write(data) f.close() # 위의 결과는 아래와 다름없다. for i in range(1,11): data = "%d번째 줄입니다.\n" %i print(data)
Python
복사
프로그램의 외부에 저장된 파일을 읽는 여러 가지 방법
1.
readline() 함수 이용하기(R은 readLines()) : 파일의 첫 번째 줄을 읽어 출력하기, 읽을 라인이 없다면 None을 출력한다.
f = open("디렉토리/새파일.txt", 'r') # 새파일.txt를 읽기 모드로 열기 line = f.readline() # 첫 번째 줄 읽기 print(line) # 출력은 console창에 f.close() # 모든 라인을 읽고 싶다면 f = open("디렉토리/새파일.txt", 'r') while True: line= f.readline() if not line : break # 읽을 라인이 없으면 반복문 탈출 print(line) f.close()
Python
복사
2.
readlines() 함수 이용하기 : 모든 라인을 읽어서 각각의 라인을 요소로 갖는 리스트로 반환한다.
f = open("디렉토리/새파일.txt", 'r') lines = f.readlines() for line in lines: print(line) f.close()
Python
복사
3.
read() 함수 이용하기 : 내용 전체문자열로 반환한다.
f = open("디렉토리/새파일.txt", 'r') data = f.read() print(data) f.close()
Python
복사
파일에 새로운 내용 추가하기
원래 있던 값을 유지하면서 새로운 값만 추가해야 할 경우에 추가 모드 ‘a’로 파일을 연다.
f = open("디렉토리/새파일.txt", 'a') for i in range(11,20): # 11~19 data = "%d번째 줄입니다."%i f.write(data) f.close()
Python
복사
with문과 함께 사용하기
파일을 열고 닫는 과정을 자동으로 처리해주는 역할을 해준다. with블록을 벗어나는 순간 자동으로 close된다.
with open("디렉토리/foo.txt", "w") as f: f.write("Life is too short, you need python")
Python
복사
Q1. 정수 n을 입력받고, n이하까지의 피보나치 수열을 출력하는 함수를 만들자.
def fib(n): # 피보나치 수열 만드는 함수 if n==0 : return 0 if n==1: return 1 return f(n-1)+f(n-2) # 재귀 호출 사용 fib(5)
Python
복사
Q2. 파일에 있는 10줄의 숫자값을 모두 읽고 총합과 평균값을 구하고 평균값은 result.txt파일에 써보자.
with open("sample.txt", "r") as f: lines = f.readlines() # 각 줄은 리스트 원소다. sum=0 for line in lines: sum += int(line) mean = sum/len(lines) with open("result.txt", "w") as f: f.write("평균은 %d입니다"%mean)
Python
복사

zip

두 그룹의 데이터를 서로 엮어주는 파이썬의 내장 함수
zip () 함수는 여러 개의 순회 가능한 객체를 인자로 받고 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자를 반환한다.
numbers = [1,2,3] letters = ['A','B','C'] for pair in zip(numbers,letters): print(pair) (1, 'A') (2, 'B') (3, 'C') # 인덱스 변수를 사용하면 이해가 쉽다. for i in range(3): pair = (numbers[i], letters[i]) print(pair)
SQL
복사

zip - 병렬처리

여러 그룹의 데이터를 루프를 한번만 돌면서 처리할 수 있다.
for number, upper, lower in zip('12345','ABCDE','abcde'): print(number, upper, lower) 1 A a 2 B b 3 C c 4 D d 5 E e
SQL
복사

unzip

zip()함수로 엮어 놓은 데이터를 다시 해체하고 싶을 때도 zip()함수를 사용할 수 있다.
먼저, zip() 함수로 2개의 튜플의 데이터를 엮은 후 리스트로 변환해보자.
numbers = (1,2,3) letters = ('a','b','c') pairs = list(zip(numbers,letters)) print(pairs) [(1, 'a'), (2, 'b'), (3, 'c')]
SQL
복사
이 리스트 앞에 unpacking 연산자를 붙여서 다시 zip() 함수에 넘기면 원래의 2개 튜플을 다시 얻을 수 있다.
numbers, letters = zip(*pairs) numbers (1, 2, 3) letters ('a', 'b', 'c')
SQL
복사

사전 변환

zip() 함수를 이용하면 두 개의 리스트나 튜플로부터 쉽게 사전을 만들 수 있다. 키를 담고 있는 리스트와 값을 담고 있는 리스트를 zip() 함수에 넘긴 후, 그 결과를 다시 dict()함수에 넘기면 된다.
keys = [1,2,3] values = ['a','b','c'] dict(zip(keys,values)) {1: 'a', 2: 'b', 3: 'c'} # 날짜 데이터의 필드 이름 리스트와 필드 값 리스트를 사전으로 변환해보자. dict(zip(['year','month','day'],[2001,1,31])) {'year': 2001, 'month': 1, 'day': 31}
SQL
복사

주의 사항

인자로 넘기는 길이가 다를 때는 주의해야 한다. 가장 짧은 인자를 기준으로 데이터가 엮이기 때문에 나머지는 버려진다.
numbers = ['1','2','3'] letters = ['a'] dict(zip(numbers,letters)) {'1': 'a'}
SQL
복사

map()

파이썬의 내장함수인 map()은 여러 개의 데이터를 한번에 다른 형태로 변환하기 위해서 사용된다. 따라서, 여러 개의 데이터를 담고 있는 list나 tuple을 대상으로 주로 사용하는 함수이다.
기본문법은 다음과 같다.
map(변환 함수, 순회 가능한 데이터)
실습데이터를 형성해보자. 유저 5명의 데이터를 임의로 생성.
# 5개의 딕셔너리를 담고 있는 리스트 users = [{'mail': 'gregorythomas@gmail.com', 'name': 'Brett Holland', 'sex': 'M'}, {'mail': 'hintoncynthia@hotmail.com', 'name': 'Madison Martinez', 'sex': 'F'}, {'mail': 'wwagner@gmail.com', 'name': 'Michael Jenkins', 'sex': 'M'}, {'mail': 'daniel79@gmail.com', 'name': 'Karen Rodriguez', 'sex': 'F'}, {'mail': 'ujackson@gmail.com', 'name': 'Amber Rhodes', 'sex': 'F'}]
SQL
복사

map() - 일반 함수로 맵핑

map()함수를 사용해서 각 유저의 이름과 성을 출력해보자.
함수를 먼저 생성한다.
def conver_to_name(user): first, last = user['name'].split() # 공백으로 분리 return {'first':first, 'last':last}
SQL
복사
이제 함수를 첫 번째 인자로, users를 두번째 인자로 넣어서 map함수를 호출해보자.
for name in map(conver_to_name,users): print(name) {'first': 'Brett', 'last': 'Holland'} {'first': 'Madison', 'last': 'Martinez'} {'first': 'Michael', 'last': 'Jenkins'} {'first': 'Karen', 'last': 'Rodriguez'} {'first': 'Amber', 'last': 'Rhodes'}
SQL
복사

map() - 람다 함수로 필터링

변환 함수의 코드가 긴 경우 위와 같이 함수를 선언하는 것이 좋지만, 짧은 경우에는 람다 함수를 사용하면 더 간단하게 코드를 짤 수 있다.
이번에는 람다 함수로 유저의 성별을 한국어로 출력해보자.
for mail in map(lambda x: '남' if x['sex']=='M' else '여', users): print(mail) 남 여 남 여 여
SQL
복사

map() - 결과 데이터 반환

많은 경우, 결과 데이터를 list나 tuple 타입으로 저장을 한다. 하지만 map()함수는 결과로 map타입을 반환한다.
예를들어, 유저 리스트를 이메일 리스트로 변환하는 map()함수의 결과는 다음과 같이 출력된다.
map(lambda x : x['mail'], users) <map at 0x29475a75490>
SQL
복사
map()함수의 결괏값을 리스트로 변환하는 가장 쉬운 방법은 list() 함수를 사용하는 것이다.
list(map(lambda x : x['mail'], users)) ['gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com']
SQL
복사
 여러 개의 리스트에 적용
list1 = [1,2,3,4,5] list2 = [6,7,8,9,10] result = map(lambda x, y: x + y, list1,list2) print(list(result))
Python
복사
또는 tuple() 함수를 사용하면 튜플로 변환할 수 있다.
tuple(map(lambda x : x['mail'], users)) ('gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com')
SQL
복사

map() - list comprehension

map() 함수를 사용하는 것보다 더 파이썬답게 데이터를 변환하는 방법이 있다. 바로 list comprehension을 사용하는 것이다.
예를들어, 유저 리스트를 이메일 리스트로 변환하는 코드를 list comprehension을 이용해서 재작성해보면 아래와 같다.
[user['mail'] for user in users] ['gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com']
SQL
복사
list comprehension의 결괏값 역시 리스트 타입이기 때문에 별다른 타입 변환이 필요없는 것도 장점이다. 만약 튜플을 얻고 싶다면 여기서 tuple()함수만 사용하면 된다.
tuple(user['mail'] for user in users) ('gregorythomas@gmail.com', 'hintoncynthia@hotmail.com', 'wwagner@gmail.com', 'daniel79@gmail.com', 'ujackson@gmail.com')
SQL
복사

집합 자료형 관련 함수

add(원소) : 새로운 원소 추가
update([원소1,원소2]) : 새로운 원소 여러 개 추가
remove(원소) : 특정한 값을 갖는 원소 삭제
data = set([1,2,3]) # data = {1,2,3} # 새로운 원소 추가 data.add(4) print(data) # {1,2,3,4} # 새로운 원소 여러 개 추가 data.update([5,6]) print(data) # {1,2,3,4,5,6} # 특정한 원소 삭제 data.remove(3) print(data) # {1,2,4,5,6}
Python
복사

람다함수의 쓰임

내장함수의 속성의 값으로 잘 사용된다. ex) sorted(), sort() 의 key 속성
array = [('홍길동',50),('이순신',32),('아무개',74)] def my_key(x): return x[1] print(sorted(array,key=my_key)) print(sorted(array, key = lambda x : x[1]))
Python
복사