[내일배움단 ai트랙 3기]파이썬 문법(3)

2022. 9. 8. 00:21스파르타코딩클럽[AI트랙 3기]/TIL

22.09.07

좌절 : 이 두글자로 오늘 내기분을 완벽하게 표현할 수 있다. 긴글 쓰고 싶지 않다.


 

ㅁ파이선 수업 (이창호 튜터님)

*1교시

-개발에는 정답이 없음

-폴더에 name.py, cal.py 실제 프로그래밍할때는 네이밍에 신경을 써야함.

 

ㅇ계산기 풀이

1)dictionary 와 lambda

#main.py(예외처리 안하기)
import calc

def main():
result = calc.calc.(input().split(“”))
print(result)

main()

#calc.py
expression = {
“+” lambda x, y : x + y,
“-” lambda x, y : x + y,
“*” lambda x, y : x + y,
“/” lambda x, y : x + y,
}
def calc(num1, operation, num2):
return expression [operatior](int(num1), int(num2))

#main.py(예외처리 하기)
import calc

def main():
try:
result = calc.calc.(*input().split(“”))
	print(result)
excpet:
	print(“잘못된 수식을 입력하셨습니다.“)

main()

<cal.calc(*input().split(“”))>

여기서 '*'은 리스트를 벗겨줌. 입력을 할 때는 [“3”, “+”, “4”]와 같이 str로 입력. ‘*’을 적으면 list를 벗겨서 “3”,“+”,“4”와 같이 넣어줌. 만약 *이 없으면 num1에 리스트가 들어감.

lambda는 미니함수. 원래 함수는 'def 함수명 ()'로 정의해야하는데, 선언하지 않고도 바로 사용할 수 있음. 함수를 짧게 사용할 수 있다는 느낌으로 이해.

2)eval

evaluation : 사용자가 입력한 값을 그대로 실행시킴

print(eval()input()))

하면 계산기 끝남. eval은 다항식을 지원함. 하지만 보안상 매우 취약. 사용자가 받은 문자를 실행시키는 것인데, 의도하지 않은 명령어를 실행 할 수도있음. 예로 os라는 라이브러리가 있는데 그안의 다양한 기능 가능.(그림판열기, 메모장열기 등 의도치 않은 동작 실현 가능)

 

ㅇ반복문

numbers = [1,2,3,4]

for number in numbers:

print(number)

->numbers의 요소들을 하나씩 출력

a, b,c = 1,2,3
print(a)
print(b)
print(c)


1
2
3
print(c)
print(b)
print(a)
3
2
1

-enumerate : 순서 세기

A = [“q”,“w”,“e”,“f”]

for i, a in enumerate(A) :

print (f“{i}번째는 {a}입니다.”)

*실수) print 안에 f str안해주면 {}가 그대로 나옴.

-continue : 무시하고 진행하기

if 문 안에 조건에 맞는 것이 있으면 출력하고 아니면 다음거로 넘어감. else써서 아닐 경우 다른 것이 나오게 할 수 도 있는데, 이미 지나간 것에 대해서는 else의 조건이라도 출력하지 않는다.

 

-for / while: 조건은 다루는 방식의 차이가 있음.

강의 자료1)

member에는 members의 요소 , i에는 실행 순서가 담김.

members = [

(“lee”, 30 ),

(“kim”, 24 ),

(“lee”, 15 ),

]

for name, age in members:

print(f“{name}은 {age}살입니다.”)

-for 문 겹칙기

members = [

(“lee”, 30 ),

(“kim”, 24 ),

(“lee”, 15 ),

]

 

numbers = [

1,

2,

3

]

for i, member in enumerate(members):

print(f“{member}의 나이는 {numbers[i]}살입니다.”)

하면 number에 해당하는 index값 출력. 역순으로 출력하기 [-i]하면 됨. 0없으니 첫 번째거는 안바뀌는데 제대로 하고 싶으면 i-1하면됨.

리스트 개수는 상관 없음.

 

딕셔너리를 for문으로 돌리면 key만 나오는 것이 정상. 만약 value로 돌리고 싶으면 for k in products.value()넣으면 됨. key, value 둘다 쓰고 싶으면, for k,v in products.items()

 

for i in range(10):

print(i)

range는 시작하는 숫자를 정할 수 있음(3,10)+몇씩갈지도 정함 (3,10,2) 3부터 10까지 숫자 2개씩 건너띄면서 감. 3, 5, 7, 9. 마지막 숫자는 포함 안됨.

반복문 사용시 continue가 있는데 아무것도 하지 않고넘어가겠다는 뜻. if number <= 50: continue 하면 아무동작안함. 그럼 리스트에 50보다 작은 숫자를 찍으면 그냥 넘어감, 그러나 밑에 print(50보다 큰 숫자입니다.)하고 있으면 50이상일 때 부터는 출력됨.

-break:하면 for문을 나가게됨.

if number >=4: break 하면 조건에 맞는 것까지만 함수 실행하고 특정 조건에 안맞으면 그 뒤에것은 작동 안함.

-반복문에는 while문도 있음. while은 조건이 참일 경우 계속 실행

while “조건”:

“”“코드”“”

조건이 참이면 계속 돈다. 조건에 True넣으면

while “True”

print(“hello world”) 해주면 무한으로 계속 hello world로 찍어줌. 이렇게 도는 것을 무한루프라고 함. for문은 그럴일이 잘 없음. 끝이 있다. 리스트나, range로 써주기 때문.

*언제 while, for문 사용하냐면 for문은 반복회수가 정해져 있을 때. while 반복회수가 정해지지 않을 때

a5일때까지 코드를 짜라 하면 while a ==5: 하면 작동안됨.

a == 0

while a > 5=:

a += 1

print()

 

 

*2교시

-vs코드 필수 익스텐션 : 파워모드(카페에서 어그로 끌기 좋음)

-탭사용 유의(스페이스바 4번으로 공백만들기, 컨벤션 주의)

-randint(1, 5) : 끝숫자 포함 / randrage(1, 5) : 끝수자 미포함

-랜덤 사용하기

 

실습))비밀번호랜덤생성기

1)함수먼저 정의

def random_password_generator(length): < length는 길이를 얼마나 가져갈 것인지

for i in range(length): <length만큼 반복

 

2)STIRINGS 만들어서 비밀번호 뽑아올 요소 정해주기

STIRINGS= “abcdefgASXCZBR123!$%” < 뽑아올 요소 정해줌.

 

3)STRINGS에서 랜덤한 index 가져오기

def random_password_generator(length):

for i in range(length):

STRINGS[random.randrange(0. len(STRINGS))] <스트링스의 인덱스를 가져오는데 0부터 strings의 길이만큼 가져옴.

그리고 for 밑에

password += STRINGS[random.randrange(0. len(STRINGS))] <password에 하나씩 더해줌.

 

4)return으로 값 받아오기

password 밑에 return password

 

5)main 함수 지정

위에 저것들 다해주고 def main():

length = 30 < length를 미리 30으로 정해줘도 되고, input()으로 받아줘도됨.

password = random_password_generator(length)

print(password)

 

main() < 함수 실행

#종료#

 

원리) strings에 들어갈 수 있는 글자 모두 적어주고, 공백의 패스워드를 만들어줌. lengthpassword의 글자수. 그러면 range에서 그 수만큼 반복함. 그러면 password50개 글자가 붙게됨. 이 때 strings가 랜덤한 인덱스에 하나씩 붙게 되고 하나씩 뽑아서 password에 붙음. 마지막으로 password return해주면 값이 나옴.

 

+)main 함수에 바로 length를 인풋하는 것도 가능

def main(length): main을 정의하고 , 아래 main(숫자)하면 숫자만큼의 자리수로 비밀번호가 생성됨.

더 깔끔한 것은

def main():

length = int(intput(“비밀번호 길이를 입력해 주세요 : ”))

password = random_password_generator(length)

print(password)

 

main()도 가능함.

+)선언하고 사용하지 않는 것은 회색이 됨. 이럴땐 _를 사용.

gui / cli : gui는 눈에보이는 것 , cli는 브이에스코드에서 바로 실행하는 것

 

*3교시

-각기 다른 함수에서 매개변수 설정할 때 매개변수 이름이 동일해도 됨. (지역변수일 때)

-타임은 주로 sleep이랑 코드 작동 시간 구할 때 씀. end_time start_time 하면 코드의 실행 시간 나옴. sleep은 함수를 짜고 실행시간이 오래 걸릴 때, 구간에서 소요시간이 얼마걸리는지 파악해서 최적화 하는데 도움이됨.

-datetime

사용자 입력 : “2022-06-02“

계산하려면 각 월이 몇일까지 있는지도 확인해야하고, 날짜가 14보다 낮은 값이면 월을 빼주고 하는 등 계산식이 복잡해짐. 이런 경우 datetime 이라는 라이브러리를 사용하면 해결할 수 있음.

작업 순는서

1)사용자입력을 datetime으로 변경,

datetimestr -> datetime으로 변경. 원래 데이트 타입은 strptime /strfimedatetimestr으로.

2)datetime 포맷에서 날짜 계산.

3)datetime 포맷을 원하는 str으로 변경.

datetime_=datetime.strptime(string_datetime,)string

datetiem포맷은 기본적으로 시분초를 포함. 그래서 자체로 없앨수는 없지만 빼고 출력할 수 있음. 일단 timedelta를 사용하면 날짜를 더하고 뺄 수 있음.

-crtl 누르고 커서 갖다대면 정보 볼 수 있음.

-장고에서 예약 받기등에 활용 가능. 예약을 할 때 연, , ,

실습)로또번호 뽑는 코드

def lotto_number_generator(count):

result = []

if count < 1 :

print(“1이상의 값을 입력해 주세요”)

 

for _ in range(count):

lotto_number = set()

 

while len(lotto_numbers) <= 8 : <로또번호가 8자리가 되기전까지 계속 돌림.

lotto_numbers.add(random.randint(1,45)) <set에서는 add, list에서는 append

 

result.append(lotto_numbers)

 

return result

 

lotto_numbers = lotto_number_generator(10)

print(lotto_numpers)

하면 출력은 되는데 안이쁨 이럴 때 from pprint import pprint. 제너레이터 안에는 로또를 살 개수.

 

-이중 반복문 : for문안에서 while문 돌리는 경우