파이썬의 가상환경
파이썬을 사용하다 보면 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
복사