---
title: "Python 정리 04"
date: "2019-05-09"
tags: ["Python"]
status: archived
verified: false
---

---

## List

* **가변길이 데이터형**

```python
# 초기값이 없는 List
변수명 = list()

# 초기값이 존재하는 List
변수명 = [값, ... ]
```

* **값 추가**
  * 값이 뒤로 붙는다

```python
변수명.append(값)
```


* **값 삽입**
  * 인덱스에 해당하는 번째 방에 값을 넣을 수 있다

```python
변수명.insert(인덱스, 값)
```

* **크기(방의 수)**

```python
len(변수명)
```

* **삭제**

```python
# 방의 내용 삭제
변수명.remove(값)

# 인덱스 삭제
del 변수명[인덱스]

# 모든 방 삭제
변수명.clear()
```

* **방안에 존재하는 동일 값의 개수**
  * java에서 list안에 존재하는 값의 개수를 구하기 위해선 for문 안에 if로 비교하고 cnt변수를 증가시켜야 함

```python
변수명.count(값)
```

```python
lang = list("is javascript the same as java?")
print(lang.count('j')) # 2
```

* **방의 값이 존재하는지**

```python
값 in 변수명 # True 또는 False 반환
```

```python
if 'j' in lang:
print('it has \'j\' ') 
```

* **문자열을 List로 생성**
  * 자바에서 문자열을 list에 담기위해선 문자열을 substring으로 잘라서 일일이 넣어줘야 함

```python
변수명 = list('문자열') # ['문','자','열'] 로 저장됨
```

```python
lang = list("is javascript the same as java?")
print(lang)
```

![01](/md/legacy-assets/python/04/01.webp)

* **split은 특정 문자를 구분하여 자르고 List로 저장**

```python
변수명 = '문자열'.split('구분문자')
```

```python
langs = "java,javascript,css,html,sql,python"
langList = langs.split(",")
print(langList)
```

![02](/md/legacy-assets/python/04/02.webp)

* **List는 Slicing을 제공한다**
  * n개의 List를 결합시킬 수 있다

```python
변수명[시작인덱스 : 끝인덱스]
```

```python
# 여러개의 리스트 합치기
li4 = ['노진경','김희철','박영민']
li5 = ['김정윤','최지우','이지수']
memberList = li4+li5

print(memberList)

# slicing : memberList에서 '박영민~최지우'까지만 얻기
print(memberList[2:5])

# '이지수'만 얻기
print(memberList[-1:])

# 짝수번째 요소만 얻기
print(memberList[::2])
print('이재찬' in memberList)
```

![03](/md/legacy-assets/python/04/03.webp)

## Tuple

* 빈 튜플을 생성할 수 있지만 값을 추가할 순 없다

```python
tu1 = ()
tu2 = ('1','2','3')
```

* **튜플은 값을 조작할 수 없다**
  * 추가X, 삭제 X

```python
# tu1.append('ho') # error!
```

* **튜플에 대해 붙임연산을 수행할 수 있다**

```python
tu2 = ('1','2','3')
tu3 = ('자바','오라클','자바스크립트')

tu4 = tu2 + tu3
print(tu4) # ('1','2','3','자바','오라클','자바스크립트')
```

![04](/md/legacy-assets/python/04/04.webp)


## Dict

* **키와 값의 쌍으로 이루어진 데이터형**
* **키는 중복이 안됨**

```python
# 빈 dict
변수명 = {}

# 값이 있는 dict
변수명 = {"키":"값", "키":"값", ... }
```

* **값 추가**
  * 키는 유일, 만약 이미 존재한다면 덮어 쓴다
  * 있으면 추가되고 없으면 바뀌는 것 == **upsert(insert+update)**

```python
변수명["키"] = "값"
```

* **값 삭제**

```python
del 변수명[키]
```

* **값 얻기**
  * 키가 없다면 None이 반환된다
  * 키가 없을 때 반환할 값(default)을 지정할 수 있다

```python
변수명.get(키) # 값을 반환한다

변수명.get(키, '키가 없을 때 반환할 디폴트값')
```

* **모든 키 얻기**

```python
변수명.keys()
```

* **모든 값 얻기**

```python
변수명.values()
```

* **모든 키와 값 얻기**
    * 키와 값이 tuple로 얻어짐(변경할 수 없다)

```python
변수명.items()
```

* **키의 존재여부 확인**

```python
'키' in 변수명 # True나 False 반환
```

```python
dict1 = {}
dict2 = {'김정윤':'디자인을 잘하며 이상한 쿼리를  알려준다',
    '김희철':'질문할 때 팔의 각도가 예술이다',
    '노진경':'예비군 갔다 병얻어 왔다',
    '김정운':'아이언맨 계약만료로 사망, 이승탈출  넘버원' }

print(dict1) # {}
print(dict2) # {'김정윤': '디자인을 잘하며...', '김희철': '질문할 ... ', ... }

print(len(dict1)) # 0
print(len(dict2)) # 4

# 값 추가
dict2['이재찬'] = '햄버거가 좋아요'
dict2['이재찬'] = '피자도 좋아요' # 키가 같으면 이전 갚을 덮어씌운다

# 값 얻기, 변수명.get('키')
print(dict2.get('이재찬'))
print(dict2.get('오영근')) # 키가 없기 때문에 None이  반환됨
print(dict2.get('오영근','드디어 학원 일주일도  안남았다')) # default값이 출력됨

del dict2['김정운']
print(dict2) 

# 모든 키 얻기 keys()
print(dict2.keys())

# 모든 값 얻기
print(dict2.values())

# 모든 키와 값 얻기
print(dict2.items())
print('김정운' in dict2)
```

![05](/md/legacy-assets/python/04/05.webp)

## 함수

* **중복 코드를 미리 작성한 후 필요한 곳에서 호출하여 사용(코드의 재사용성)**
* **함수의 선언은 def로 시작**
* **함수의 영역은 들여쓰기(indentation)로 구분**
* 함수의 내용이 없다면 Error 발생
    * **pass**란 키워드를 넣으면 Error 안남
    * 자바는 내용이 없어도 Error 안남
* **파이썬은 반환형, 접근지정자가 없고 매개변수만 존재**
    * JavaScript의 함수와 닮았다
* **return을 생략하면 None이 반환됨**
* **함수가 종료되면 두 줄 정도 띄우고 다음 코드를 작성 (PEP8)**

```python
def 함수명(매개변수, ... ):
    자주 사용될 코드

    # 내용이 없을땐 pass 명시
    pass

    return 값;
```

* **호출**

```python
함수명(값, ... )
```

* **함수명과 변수명이 같다면 먼저 선언된 건 사용할 수 없다**
    * 둘 다 객체로 이름이 같으면 덮어씌워짐
    * **함수명은 변수명과 같은 취급을 하기 때문에 함수명, 변수명을 다르게 만든다**

```python
# 변수의 이름과 함수의 이름이 같다면 먼저 선언된 것은 사용할 수 없다
def temp():
    print('temp!!!')
    
    
temp = 3
print(temp) # 3 출력

temp() # error!
```

```python
def test():
    print('test')
        

# 호출    
test()

# 함수의 반환형이 없을 땐 None이 반환됨
name = test() 
print(name) # None

# 반환값이 존재하는 함수
def test1():
    name='이재찬'
    return name


name = test1()
print(name) # 이재찬
```

## 함수 - 매개변수 사용

* **매개변수에 기본값(default)을 사용할 수 있다**
  * **함수 호출 시 값이 없다면 기본값으로 사용**
  * **때문에 오버로딩이 없음**
    * **파이썬에선 동명의 함수를 만들 수 없다**

```python
def 함수명(매개변수명 = 값, ...):
    ...
```

```python
# 매개변수의 기본값 사용
def test4(name='김희철',addr='강남구 역삼동',age=20):
    print("name : {}, addr : {}, age : {}".format(name,  addr, age))
    
# default값을 줄 수 있기 때문에 오버로딩이 안됨
test4()
test4('오영근')
test4('오영근','강남구 논현동')
test4('오영근','강남구 논현동',30)
```

![06](/md/legacy-assets/python/04/06.webp)

* **Variable Arguments(가변인자형)**
  * 매개변수는 하나인데 값을 여러개 넣을 수 있는 것

```python
def 함수명(*매개변수명):
    # 들어오는 매개변수명은 tuple로 처리됨
    ...


함수명()
함수명(값, ... ) # 둘 다 가능
```

```python
# Variable Arguments
def test5(*names):
    print(type(names))
    print(names)
    for name in names:
        print(name)
    

test5('young','sol','minsoo')
```

![07](/md/legacy-assets/python/04/07.webp)


* **dict 형태로 입력받을 수 있다**
  * == KVP로 매개변수 처리 가능

```python
def 함수명(**매개변수명)
    # 들어오는 매개변수명은 dict로 처리됨
    ...


함수명(이름=값, 이름=값, 이름=값, ...)
```

```python
# dict : 값을 입력할 때 '이름=값'의 형식을 가져야 한다
def test6(**info):
    print(type(info))
    print(info)
    for k,v in info.items():
        print(k,v)

    print(info.get('name')) # 이름 얻기


test6(name='김희철',age=20,addr='서울시 동작구')
```

![08](/md/legacy-assets/python/04/08.webp)
