반응형

본 내용은  fastcampus 딥러닝/인공지능 올인원 패키지 online을 정리한 것이다.

함수의 이행 와 사용

함수 : 코드가 중복된 것을 방지하기 위하여 많이 사용한다.

내장 함수

len(), sum() 등 여러가지 가있다.

 

함수를 정의 할려면 def 키워드가 나온다.

def function_name():

  

 

() -> parameter 인자  파라미터의 데이터 타입을 지정할 필요없다.

 

함수 이름은 제약 사항이 없지만 그래도  무엇을 해야 하는지 예상하는 값으로 하는게 좋다.

예:

def add(x, y):

  sum = x+y

  return sum

 

add(1,2)

 

값을 정확하게 전달해야 한다. 파라미터 개수에 맞게끔 입력을 해주시면 된다.

add()

 

파라미터 (argument)인자

함수내에서 사용되는 변수

 

python에서는 type을 명시할 수 없다. 

장점이면서 단점이여서 주의해야 한다.

 

type을 정확하게 넣어줘야 오류가 안난다.

 

기본 파라미터 

두개로 파라미터 지정할 경우에는 

 

print에도 있다. 

sep , end  등 

sep 구분한다는 점이고 

end는 마지막에 해주는 것이다.

 

기본파라미터에서 주의할 점은 순서에서 중간에 올 수 없다. 

기본파라미터 혼용 할 경우에는 잴 앞에 있으면 오류가 난다.

 

keyword parameter 키워드 파라미터

파라미터에 전달 할 때 , 파라미터의 이름을 명시하여 전달 하는 것

이 경우에는 파라미터의 순서를 무시 할 수 있다.

keyword값을 하고 싶을 때는 통일 하는게 좋다.

def test(x, y ,z):

 

test(x=1, y=2, z=3)

 

return 

함수의 종료를 의미 함수가 끝난다는 것을 의미 호출하는 쪽으로 값을 뱉는 것이다. 

함수가 끝나면서 값을 설정하지 않을 경우 None, 값이 있을 경우 값을 전달한다.

 

multiple return

튜플 형식으로 복수개의 값 리턴 효과 처럼 가능하다. : 값이 여러개 return 가능하다. 

return a,b

 

변수의 범위 variable scope

local 변수 : 코드 블록에서 선언된 변수

global 변수: 가장 상단에서 정의도어 프로그램 종료전까지 유지되는 변수

함수 안에 선언된 변수는 범위가 있다. 변수의 생명 주기가 있다. 임의로 가지는 범위가 있다. 함수 블록 

 

가별길이 인자 variable length argument

전하는 파라미터의  개수가 정해지지 않았다. 고정이 되지 않았다.

처리할 수 있는 파라미터의 개수가 동적이다.

*args: 파라미터를 튜플의 형태로 전달 , args 라고 해도 되고 따른것으로 해도 된다. 습관상 문제로 

  arguments의 줄임말이다.

 

가변길이 keyward parameter

**kwargs: 파라미터를 딕셔너리 형태로 전달(네임드 파라미터) ->dict

 

args로 정하는것이 좋다

def test(*args):

  for i in args:

    print(i)

test(1,10,9)

 

 

def test(**kwargs):

  for key, value in kwargs:

    print(key, value)

 

test(a=1, b=2 )

 

가변길의 함수의 대표적인 예 문자열 포맷 함수

placeholder 어떤 값을 넣을 지 모르겠지만 공간을 비워줘서 값을 여준다.

test = '오늘 온도 : {}도 , 강수 확률은 : {}% 입니다.'.format(25, 30)
print(test)

 

이름 자체를 몇시 가능하다.

test = '오늘 온도 : {temp}도 , 강수 확률은 : {prob}% 입니다.'.format(temp=20, prob=30)
print(test)

 

 

lambda함수

한줄로 간단하게 정의할 수 있는 문법적인 도움

단일문으로 표현되는 익명함수 할줄로 표현된다.

이름이 필요없다.

return keyword필요 없다. return 쓰면 안된다. 

 

람다 정의

ret = lambda a: a*2
ret(2)

입력값과 출력값만 하고 return 할 필요 없다.

 

파라미터 값이 2개일 경우

ret = lambda a,b: a+b
ret(2, 3)

 

간단한 함수 일 경우에는 lambda 함수를 사용할 수 있게 한다.

간결하게 하는 표현이다.

 

 

 

sort()

sort에 key가 있는데 함수이다.

 

def str_len(s):
  return len(s)

strings = ['alice','bob','chakdfjdkfj','alex']
strings.sort()
print(strings)

def str_len(s):
  return len(s)

strings = ['alice','bob','chakdfjdkfj','alex']
strings.sort(key=str_len)
print(strings)

str_len 외부에서 사용안하고 여기에서만 사용한다. 

따로 할 필요 없이 한 줄로 하는 것  

따로 공간 낭비 없이 한줄로 

test = ['za','cdfd', 'addddd' , 'ddd']
test.sort(key= lambda s:len(s))
print(test)

 

filter, map, reduce

filter -> list에서 filtering 한다. 기본 내장함수로 들어간다. 

filter(함수, 리스트) : 함수가 list의 각각 원소로 돌면서 참이면 출력 

원래 리스트에서 짝수만을 가진 것을 filtering한다.

각각의 원소에 even함수를 적용한다. 

def even(n):
    return n% 2 ==0

nums = [1,2,3,4,5,6]
list(filter(even, nums))

위의 것은 공간을 낭비한다.공간 낭비가 있어서 람다로 한다.

nums = [1,2,3,4,5,6]
list(filter(lambda n:n%2 == 0, nums))

 

각각의 값을 제곱으로 할 경우

filter를 하지 않지만 list개수가 변하지 않고 새로운 list가 만들어지는데 mapping한다.

nums = [1,2,3,4,5,6]
list(map(lambda n:n**2, nums))

python3에서는 reduce를 그냥 사용할 수 없다.

 

reduce: 주어진 리스트가 있으면 차례대로 구해서 한개 값만 남긴다.

functools.reduce(함수, 리스트)

주어진 list가 있으면 차례대로 해서 한개 값만 남긴다. 

결과가 하나 나온다.

import functools
a = [1,2,3,4]
functools.reduce(lambda x, y : x-y ,a)

 

문제가 주어지면 입력과 출력을 고려해야 한다.

 

평균구하기

def mean(nums):
    sum_ = 0
    for i in nums:
        sum_ += i
    return sum_ / len(nums)

mean([2,3,5 ])

함수로 한번 하면 구현된 이름으로 여러번 호출 가능하고 

코드의 중복이 없이 코드를 재사용할 수 있다.

 

 

python에는 sum이라는 내장함수가 있다.

def mean(nums):
    return sum(nums) / len(nums)

mean([2,3,5 ])

 

소수는 (1과 자기 자신으로만 나눠지는 수 )

입력 : 양의 정수 1개

출력 : 여부가 출력된다.

소수 , 합성수

def is_prime_number(num):
    for i in range(2, num):
        if num % i == 0 :
            return False
        
    return True
        
is_prime_number(16)
def num_prime(num):
    cnt = 0
    for i in range(2, num+1):
        if is_prime_number(i):
            cnt +=1
    return cnt

print(num_prime(6))

 

모듈의 이해 및 사용과 import 방법

module 필요한 모듈 형태

구현한 내용을 불러서 사용하기 

특정한 것만 import 하고 싶을 경우 from으로 한다.

import math
from math import pi # 특정한 값만 import 한다. 필요한것만 import 할수 있다
from math import *
sin(1)

별명: alias  => as를 이용하여 한다.

import numpy as np

모든 기능을 다하고 싶을 경우 *로 한다.

*를 권장하지 않는다 . 똑같은 것 있을 수 있기 때문이다.

class와 object

List 타입 (class)

실제로 존재하는 객체 (object)

 

클래스 정의 및 사용하기

class: 속성와 동작를 갖는 데이터 타입 : 타입을 정의 하는것 새로운 타입을 정의 

 

class 선언하기

class keyward가 있다.

class People:

   pass

pass 없이 수행하면 문법 오류가 생긴다. class, method에 다 가능

빈 class라도 오류 없이 진행하고 싶을 경우에는 pass라도 해야 한다.

 

lily = People()

 

lily = list() 와 비슷하게 사용한다.

 

모든 타입을 타입의 객체로 생성되였다.

 

__init__ : 생성자 클래스 인스턴스가 생성될 때 호출 됨

self 인잔는 자기 자신을 의미한다.

가장 첫번째로 돌리는 함수

 

class Dog:

  def __init__(selft):

     self.name = 'dog'  #name의 속성이 있다.

 

#생성자에서 self keyword를 해서 생성한다. 

하지만 이 경우에는 동적의 경우가 아니여서 

동적으로 생성하는 것을 변경해야 한다.

 

class Dog:

  def __init__(selft, name):

     self.name = name

 

self 는 그 객체 자체이다.

모두 첫번째에 온다. 

그 메소드가 불리는 자체 자신을 의미한다.

 

메소드는 클래스가 다루자 하는 것을 행동 

자신의 주소

 

 

종속

기존에 정의해둔 클래스의 기능을 그대로 물려반들 수 있다.

코드를 재사용하는 도우미

 

class Qiwawa(Dog):  =>이런식으로 상속 받는다.

 

부모클래스에서 정의 된 것을 다시 정의 => override  재정의 

override 재정의 하는 순간 부모의 메소드가 사라지기 때문에 

사라지지 않게 하기 위하여 super를 사용한다.

super().work() =>부모의 work()를 호출한다.

 

point

2차원 좌표 평면 각 점(x,y)

 

__str__ 지정한데로 출력을 할 수 있다.

예:

    

1+2 이런식으로 바꾸고 싶을 경우

 

 

class Point:
  def __init__(self, a, b) :
    self.a= a
    self.b = b
  def __add__(self , pt):
    new_a = self.a + pt.a
    new_b = self.b + pt.b
    return Point(new_a, new_b)

  def __str__(self):
    return '({}, {})'.format(self.a, self.b)

  def length(self):
    return self.a **2 + self.b ** 2


p1 = Point(3,4)
p2 = Point(1,2)
print(p1)

print(p1 + p2)
print(p1.length())

 

len(p1)으로 하고 싶다.

  def __len__(self):

    return self.a **2 + self.b ** 2

print(len(p1))

 

point에 index 적용하고 싶을 경우에는

pl[0] => point 객체는 index를 지원하지 않아서 __getitem__으로 한다.

  def __getitem__(self, index):
    if index == 0:
      return self.a
    elif index ==1:
      return self.b
    else:
      return -1

 

복소수 클래스

출력을 예쁘게 할려면 str함수를 재정의 한다.

'{}+{}j'.format(self.real, self.img)

 

__mul__이런것은 연산 없이 잘 할 수 있다. 

 

정규표현식

특정한 패턴을 검색가능하다.

복잡한 문자여도 패턴을 하면 쉽게 사용할 수 있다. 

크롤링에서 많이 사용한다. 

 

raw string : 패턴 같은 경우는 많이 사용하다.

문자열 앞에 r이 붙으면 문자열이 구성된 그대로 문자열로 변환

문자열을 return 되는 것이 아니라 특수한 기능을 하기 위해서 그대로 인식하기 위해서 \n 같은 경우에는 그대로 인식하게 한다.

\n이런것 많이 사용할 경우가 있다. 이런것 표현하기 위해서 raw string을 사용한다. 

a = 'abc\n'
print(a)

a = r'abc\n'
print(a)

import re
m = re.search(r'ab','abcdjkjkab')
print(m)
print(m.start())
print(m.end())
print(m.group())

가장 먼저것 나온다.

 

[] 대괄호 문자들의 범위를 나타내기 위해 사용

  - 범위를 나타난다.  

^앞에 있을 경우 아닌것으로 한다.

\d: 숫자

\D: 숫자가 아닌 문자

\s: 공백문자

\S: 공백이 아닌 문자

\w: 알파벳 대소문자 , 숫자  동일  [^0-9a-zA-Z]

\W: non-alpha-numeric문자

. : 모든 문자를 의미한다.

 

 

+ : 한번 이상의 패턴이 생성(최소한 한번은 나와야 한다.)

* : 0번 이상의 패턴이 발생

? : 0번 혹은 1번의 패턴이 발생 , 한번 있거나 없거나 

 

반복 패턴이 있을 경우에는 마지막 까지 나온다. 

greedy하게 동작한다.

 

^ : 맨 시작부터 일치하는 경우 문자열 시작

$ :  맨 뒤부터 일치하는 경우  문자열 끝

 

grouping:

()을 사용하여 그루핑 

group는 1부터 시작한다. 

매칭 결과를 각 그룹별로 분리 가능

 

m = re.search(r'(\w+)@(.+)', 'test@gmail.com')
print(m.group(1))
print(m.group(2))

 

패턴을 생성하고 ()를 이용해서 그룹을 한다.

 

{} -> 중괄호

+, * 반복적인 패턴은 가능하지만 횟수는 불가능하다. 

*, + ,? 을 사용하여 반복적인 패턴을 찾는 것이 가능하지만 , 반복의 횟수의 제한은 불가해서 {} 로 반복의 횟수를 명시한다.

횟수 지정 한다. 

m = re.search('a{2}d' , 'aadddd')
print(m)
m = re.search('a{2,5}d' , 'aadddddddd')
print(m)

{2,5}는 2번 이상 혹은 5번 이하

 

<.+?> => minimum 매칭하게 한다. greedy하게 하는 것이 아니라

{}? {3,5}? => 

 

match 함수 => 검색을 하는데 문자열을 처음부터 검사한다.

검사를 하는데 차원으로 한다. 

search와 동일한데 문자열의 처음부터 검사

search와 비슷하지만 최초로 매칭 되는 것

 

findall => 매칭되는 전체의 패턴을 반환한다.

해당하는것을 전부 매칭 되는 패턴을 찾는다. 

 

sub는 치환시킨다. 문자열 내에서 특정한 문자를 찾아서 치환한다. 

count가 0인 경우 전체를 , 1이상이면 해당 숫자대로 치환한다

re.sub(패턴,이것으로 치환,문자열)

문자열에서 패턴 찾아서 이것으로 치환한다. 

re.sub(패턴,이것으로 치환,문자열,count)

 

 

compile 함수 

동일한 정규표현식을 매번 다시 쓰기 번거러움을 해결

패턴을 입력할 수 있다.

 

중복 리스트 

map 주어진 리스트로 부터 어떤 규칙 혹은 람다에 의해서 새로운 리스트를 생성할 수 있다. 

 

반응형

+ Recent posts