20230309 KDT 학습일지

2023. 3. 10. 15:58학습일지

728x90

1.스코프(scope)

  • 변수의 접근할 수 있는 범위
  • local : 가장 가까운 함수안의 범위
  • global : 함수 바깥의 변수 또는 import된 module
 
 
print(num1)
func1()
- 10
  20
# locals() : 로컬 변수를 확인해주는 함수
# globals() : 글로벌 변수를 확인해주는 함수

num1 = 10 #글로벌 변수

def func1():
    num2 = 20 # 로컬변수
    print('num1 로컬변수: ''num1' in locals())

def func2():
    num2 = 20 #로켤 변수
    print('num2 로컬 변수 : ','num2' in locals())

def func3():
    print('num1 글로벌 변수','num1' in locals())
 
func1()
- num1 로컬변수: False
 
func2()
- num2 로컬 변수 : True
 
func3()
- num1 글로벌 변수 False
 
num1 = 10

def func4():
    num1 = 20
    
    print(num1)
 
func4()
- 20
 
print(num1)# 전역 변수
 - 10
 

2. global 키워드

  • 함수 내부에서 로컬변수가 아닌 글로벌 변수로 사용하게 함
num1 = 10

def func5():
    print(num1)

def func6(num):
    global num1
    num1=num # 로컬변수에 값을 저장했으므로 글로벌 변수에 값이 변경되지 않음
 
func5()
-10
 
func6(5)
 
func5()
- 5

 


 

1. 콜백함수(Callback Function)

  • 직접 호출하는 것이 아닌 다른 함수에 의해 호출되는 함수
def callback_func(func):
    for i in range(5):
      func()
 
- def print_hello():
     print('안녕하세요! 파이썬!')
print_hello()
- 안녕하세요! 파이썬!
 
callback_func(print_hello)
- 안녕하세요! 파이썬!
  안녕하세요! 파이썬!
  안녕하세요! 파이썬!
  안녕하세요! 파이썬!
  안녕하세요! 파이썬!
 
def callback_func(func,num):
    for i in range(num):
        func(i)

def print_hello(num):
    print('안녕하세요! 파이썬',num)
 
def print_hi(num):
    print('하이! 파이썬!',num)
 
callback_func(print_hello,3)
- 안녕하세요! 파이썬 0
  안녕하세요! 파이썬 1
  안녕하세요! 파이썬 2
callback_func(print_hi,4)
- 하이! 파이썬! 0
  하이! 파이썬! 1
  하이! 파이썬! 2 
  하이! 파이썬! 3

2. 람다 함수(lamba function)

  • 단일문으로 표현되는 익명함수
  • 코드상에서 한번만 사용되는 기능이 있을때, 굳이 함수를 만들이 않고 일회성으로 만들어 사용(함수는 클래스를 통해 생성된 객체
  • return 형
def square(x):
    return x ** 2
print(square(4))
- 16
 
lambda x : x ** 2
- <function __main__.<lambda>(x)>
square = lambda x: x **2
- 16
 
def myData(string):
    return len(string.strip())
 
print(myData('apple'))
- 5
 
print(myData('     apple'))
- 5

data=['watermelon','     apple','          banana','     avocado']
 
print(sorted(data))

- ['                  banana', '           apple', '        avocado', 'watermelon']

 

print(sorted(data,key=myData))
- ['         apple', '               banana', '            avocado', 'watermelon']
#람다 함수를 이용하여 위 예제를 변경
print(sorted(data, key=lambda string: len(string.strip())))
- ['            apple', '                 banana', '            avocado', 'watermelon']
 

2-1.람다가 유용하게 사용되는 대표적인 함수

#filter(): 특정 조건을 만족하는 요소만 남기고 필터링

 

li = [1,2,3,4,7,9,10,14,15,19,20]
#print(filter(lambda n : n%2 == 0, li))
result = list(filter(lambda n : n%2 == 0, li))
print(result)
 
- [2, 4, 10, 14, 20]

 

def even(n):
    if n % 2 == 0:
        return True
    else:
        return False
 
result = list(filter(even, li))
print(result)
- [2, 4, 10, 14, 20]
#map(): 각 원소를 주어진 수식에 따라 변형하여 새로운 값을 변환
li = [1,2,3,4,7,9,10,14,15,19,20]

per = list(map(lambda n: n * 0.01, li))
print(per) 
- [0.01, 0.02, 0.03, 0.04, 0.07, 0.09, 0.1, 0.14, 0.15, 0.19, 0.2]
def percent(n):
        return n * 0.01
 
per = list(map(percent, li))
print(per)
 - [0.01, 0.02, 0.03, 0.04, 0.07, 0.09, 0.1, 0.14, 0.15, 0.19, 0.2]

1. 랜덤(random) 모듈

  • 임의의 숫자를 무작위로 반환

1-1.random()

  • 0이상 1미만의 숫자주에서 무작위로 하나를 뽑아 반환
import random 

num = random. random()
print(num)
num = num * 10
print(num)
num= int(num) #0~9까지 정수
print(num)
num=num + 1 # 1~10까지 정수
print(num)

- 0.6614337273196007

  6.614337273196007

  6

  7

 

#1~10까지 정수
num = int(random.random()*10)+1
print(num)

- 9

1-2. randrange()

  • 원하는 범위를 입력하여 범위의 정수를 반환
random. randrange(146)
- 31
 

1-3. shuffle()

  • 자료구조에 저장된 값 중 무작위로 섞음
li = ['김사과','반하나','오렌지','이메론','배애리']
random.shuffle(li)
print(li)
- ['반하나', '김사과', '이메론', '배애리', '오렌지']

1-4 choice()

  • 자료구조에 저장된 값 중 하나를 무작위로 반환
li = ['김사과',' 반하나','오렌지','이메론','배애리']
random.choice(li)

- '반하나'

random.choice([True,False])

- False

2.과제

2-1. 주사위를 던져서 주사위의 값을 맞추는 게임을 만들어보자

  • 주사위의 값을 입력하세요: 4
  • 주사위의 값 : 3, 틀렸습니다
  • 주사위의 값을 입력하세요 : 3
  • 주사위의 값:6, 틀렸습니다!
  • 주사위의 값을 입력하세요 : 2
  • 주사위의 값: 2, 맞았습니다. 프로그램을 종료하겠습니다.
import random
while True:
  cm = random.randrange(1,7)
  num = int(input('주사위 값을 입력하세요'))
  if num== cm:
      print(f'주사위 값:{cm},맞았습니다. 프로그램을 종료하겠습니다.')
      break
  else :
      print(f'주사위값{cm}, 틀렸습니다!')
  
- 주사위 값을 입력하세요1
  주사위값3, 틀렸습니다!
  주사위 값을 입력하세요1
   주사위값4, 틀렸습니다!
  주사위 값을 입력하세요1
  주사위값5, 틀렸습니다!
  주사위 값을 입력하세요1
   주사위 값:1,맞았습니다. 프로그램을 종료하겠습니다.
num = int(input('숫자를 입력하세요'))

while True:
    num= int(input('숫자를 입력하세요'))
    if num == 6:
      break
숫자를 입력하세요3
숫자를 입력하세요2
숫자를 입력하세요4
숫자를 입력하세요5
숫자를 입력하세요1
숫자를 입력하세요6
 

2-2. '가위바위보' 게임을 만들어보자.

  • 가위, 바위, 보 중 하나를 선택하세요 : 가위
  • 컴퓨터 : 바위, 나 : 가위 -> 졌습니다.
  • 가위, 바위, 보 중 하나를 선택하세요 : 가위
  • 컴퓨터 : 가위, 나 : 가위 -> 비겼습니다.
  • 가위, 바위, 보 중 하나를 선택하세요 : 가위
  • 컴퓨터 : 보, 나 : 가위 -> 이겼습니다!!!!!!! 게임을 종료합니다.
import random
cp= ['가위','바위','보']
while True:
  rm= random.choice(cp)
  num = input('가위,바위,보 중 하나를 선택하세요 :')
  if num == rm:
       print(f'컴퓨터:{rm},나:{num} -> 비겼습니다.'
  elif (rm=='바위'and num=='가위'or (rm =='가위'and num == '보'or (rm == '보' and num =='주먹'):
        print(f'컴퓨터 :{rm},나:{num}-> 이겼습니다.')
  else :
      print(f'컴퓨터:{rm},나:{num} ->  이겼습니다!!!!! 게임을 종료합니다.')
      break
-
가위,바위,보 중 하나를 선택하세요 :가위
컴퓨터 :바위,나:가위-> 이겼습니다.
가위,바위,보 중 하나를 선택하세요 :가위
컴퓨터:가위,나:가위 -> 비겼습니다.
가위,바위,보 중 하나를 선택하세요 :가위
컴퓨터:보,나:가위 ->  이겼습니다!!!!! 게임을 종료합니다.
 

2-3.로또번호 예상 프로그램을 만들어보자

  • 조건
    • 1~45까지 6개의 숫자를 무작위로 추출
    • 중복되면 안됨
    • 오름차순으로 정렬
    • 보너스 숫자는 생각하지 않음
mport random
list=[]

for i in range(6):
    number = random.randint(1,45)
    while number in list:
      number = random.randint(1,45)
    list.append(number)

  
print(sorted(list))
- [1, 5, 7, 12, 18, 29]

2-4. 주민등록번호 유효성 검사 프로그램을 만들어보자.

  • 001011-3068518
  • 0 0 1 0 1 1 3 0 6 8 5 1 8(마지막 자리는 잠시 빼둠)
  • 2 3 4 5 6 7 8 9 2 3 4 5 숫자를 각자리에 곱함
  • 0 0 4 0 6 7 24 0 12 24 20 5 숫자를 모두 더함
  • 102 % 11( 11로 나눈 나머지 값을 구함)
  • 11-3(해당 값을 11에서 뺌)
  • 8(주민등록번호의 마지막 자리와 일치하면 맞는 주민등록번호임)
id =input('주민등록번호를 입력하세요')
if len(id)==13:
  all=0
  for i in range(12) : 
      mu=int(id[i])*(i%8+2)
      all += mu
     # print('{}번째 가중치를 곱한 합계는 {}이다.'.format(i+1,mu))
  all=(11-all%11 )%10
  print('정상'if int(id[12])==all else '오류')
else :
    print('주민등록번호를 다시 한번 확인해주세요.')

-


오늘 아무도움없이 두문제를 풀어봤다 . 기분이 좋았다. 
앞으로 아무도움없이 다 푸는날을 목표를 잡아 공부할 것이다.
점점 어려워진다.
하지만 포기는 안할거다. 근데 좀 슬프다.
728x90
반응형

'학습일지' 카테고리의 다른 글

20230313 kdt 학습 일지  (1) 2023.03.14
20230310 KDT 학습일지  (0) 2023.03.10
20230308 KDT 수업일지  (0) 2023.03.09
20230307 KDT 학습일지  (0) 2023.03.07
20230306 KDT 수업일지  (0) 2023.03.06