본문 바로가기
내일배움캠프/python

파이썬 문법 심화과정

by useSword 2024. 2. 22.

심화과정에서는 알아둬야할 중요한 정보들이 너무 많았고 오랫동안 두고 복습해야할 것 같다.

1. variable scope
 JS를 공부할 떄도 스코프에 대해 자세히 공부한 기억이 있었다.
JS 떄에는 var,let,const 등으로 나누어서 하였지만 파이썬은 공간으로 구별해서 더 편했다.

전역상태에 대한 토론 부분중에 아래의 의미가 아직 잘 이해가 안된다.

 

나쁜건 알겠지만 현재로서는 성능부분에서 얼마나 영향을 끼치는지에 대해 모르겠다.

그리고 아래와 같은 부분에서처럼의 장점들을 위해 전역변수를 사용하기도 낯설다.

 

알고리즘 최적화, 복잡성 감소, 캐싱 및 메모화 또는 주로 명령형 코드베이스에서 발생하는 구조 포팅의 실용성을 위해 기능적 프로그래밍에서도 전역 상태를 올바르게 사용하는 것이 허용됨


관련 논쟁 :  https://stackoverflow.com/questions/19158339/why-are-global-variables-evil

 

 

2. 자주 사용되는 모듈 및 패턴

 

type() - 값의 자료형 확인해보기

integer = 10
float_ = 1.23
list_ = [1, 2, 3]
tuple_ = (1, 2, 3)
set_ = {1, 2, 3}
dictionary = {"key": "value"}

print(type(integer)) # <class 'int'>
print(type(float_)) # <class 'float'>
print(type(list_)) # <class 'list'>
print(type(tuple_)) # <class 'tuple'>
print(type(set_)) # <class 'set'>
print(type(dictionary)) # <class 'dict'>

 

 

split() - string을 list로 변환하기

string = "hello/python/world!!"
string_list = string.split("/") # split() 안에 들어간 값을 기준으로 문자를 나눈다.

print(string_list) # ['hello', 'python', 'world!!']

 

 

join() - list를 string으로 변환하기

string_list = ["hello", "python", "world"]
string = "!! ".join(string_list)

print(string) # hello!! python!! world

 

replace() - 문자열 바꾸기

before_string = "hello world!!!"
after_string = before_string.replace("!", "~") # !를 ~로 변경

print(after_string) # hello world~~~

 

 

pprint() - 데이터를 더 예쁘게 출력

 

 

random - 랜덤한 로직이 필요할 때

import random

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
random.shuffle(numbers) # numbers를 무작위하게 섞기
print(numbers) # [2, 8, 6, 4, 3, 7, 1, 5]

random_number = random.randint(1, 10) # 1 ~ 10 사이의 무작위 번호 생성
print(random_number) # 4

 

 

datetime / 날짜 다루기

from datetime import datetime, timedelta

# 현재 날짜 및 시간 출력
print(datetime.now()) # 2023-02-22 15:55:32.277095

# datetime의 format code 더 제세한건 여기서 확인 가능합니다.
'''
%y : 두 자리 연도 / 20, 21, 22
%Y : 네 자리 연도 / 2020, 2021, 2022
%m : 두 자리 월 / 01, 02 ... 11 ,12
%d : 두 자리 일 / 01, 02 ...  30, 31
%I : 12시간제 시간 / 01, 02 ... 12
%H : 24시간제의 시간 / 00, 01 ... 23
%M : 두 자리 분 / 00, 01 ... 58, 59
%S : 두 자리 초 / 00, 01 ... 58, 59
'''

# string을 datetime 날짜로 변경하기
string_datetime = "23/12/25 13:20"
datetime_ = datetime.strptime(string_datetime, "%y/%m/%d %H:%M")
print(datetime_) # 2023-12-25 13:20:00

# datetime 날짜를 string으로 변환하기
now = datetime.now()
string_datetime = datetime.strftime(now, "%y/%m/%d %H:%M:%S")
print(string_datetime) # 22/09/04 04:04

# 3일 전 날짜 구하기
three_days_ago = datetime.now() - timedelta(days=3)
print(three_days_ago) # 2023-02-19 16:27:52.526502

 

 

3. 조건문

'''!= : 값이 일치하지 않는지 비교'''
0 != 1 # True
0 != 0 # False

'''>=, <= : 값이 크거나 같은지, 작거나 같은지 비교'''
1 >= 1 # True


'''in : 특정 값이 list / tuple / set에 포함되어 있는지 확인'''
4 in [1, 2, 3] # False
1 in (1, 2, 3) # True


print(bool(""))
print(bool(0))
print(bool([]))

print(bool("sample"))
print(bool([1, 2]))
print(bool(1))
print(bool(-1)) # 0이 아닌 숫자는 True로 판단

"""
False
False
False

True
True
True
True
"""


# all() : 요소들이 모두 True일 경우 True 리턴
if all([True, True, True, False, True]):
    print("통과!") # False가 존재하기 때문에 분기문을 통과하지 못함

# any() : 요소들 중 하나라도 True일 경우 True 리턴
if any([False, False, False, True, False]):
    print("통과!") # True가 1개 이상 존재하기 때문에 분기문을 통과함

 

 

4.함수의 인자와 리턴 타입

 

# sort
sample_list = [3, 2, 4, 1, 5]
sample_list.sort() # return data 없이 list 자체를 정렬
print(sample_list) # [1, 2, 3, 4, 5]

# sorted
sample_list = [3, 2, 4, 1, 5]
sorted_list = sorted(sample_list) # 정렬 된 list를 return
print(sorted_list) # [1, 2, 3, 4, 5]

# 잘못된 방법
sample_list = [3, 2, 4, 1, 5]
sorted_list = sample_list.sort() # .sort()의 return data는 None 입니다.

print(sorted_list) # None

 

 

5. try / exception을 활용한 에러 처리

number = input()

try:
    int(number)
    10 / number

except ValueError: # int로 변환하는 과정에서 에러가 발생했을 떄
    print(f"{number}은(는) 숫자가 아닙니다.")
    
except ZeroDivisionError: # 0으로 나누면서 에러가 발생했을 때
    print("0으로는 나눌수 없습니다.")
    
except Exception as e: # 위에서 정의하지 않은 에러가 발생했을 때(권장하지 않음)
    print(f"예상하지 못한 에러가 발생했습니다. error : {e}")

 

6. 정규표현식(regex) - 문자열이 특정 패턴과 일치하는지 판단하는 형식 언어

정규표현식 사이트 : https://regexr.com/

#정규표현식을 사용해  이메일 검증하기
from pprint import pprint
import re

# rstring : backslash(\)를 문자 그대로 표현
# ^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$ : 이메일 검증을 위한 정규표현식 코드
email_regex = re.compile(r"^[\w\.-]+@([\w-]+\.)+[\w-]{2,4}$")

def verify_email(email):
    return bool(email_regex.fullmatch(email))
    
test_case = [
    "apple",              # False
    "sparta@regex",       # False
    "$parta@regex.com",   # False
    "sparta@re&ex.com",   # False
    "spar_-ta@regex.com", # True
    "sparta@regex.co.kr", # True
    "sparta@regex.c",     # False
    "sparta@regex.cooom", # False
    "@regex.com",         # False
]

result = [{x: verify_email(x)} for x in test_case]

pprint(result)

 

 

7. requests - http 통신을 가능하게 해주는 모듈

 

requests - 요청에는 크게 네가지 종류의 method가 존재합니다.

  • GET : 데이터 정보 요청
  • POST : 데이터 생성 요청
  • PUT : 데이터 수정 요청
  • DELETE : 데이터 삭제 요청

8. json - 데이터를 저장하거나 데이터 통신을 할 때 주로 사용

import json
import requests

# 해당 사이트는 요청에 대한 응답을 json 형태의 문자열로 내려줍니다.
url = "https://jsonplaceholder.typicode.com/"

r = requests.get(f"{url}users/1")
print(type(r.text))  # <class 'str'>

# 문자열 형태의 json을 dictionary 자료형으로 변경합니다.
response_content = json.loads(r.text)
print(type(response_content))  # <class 'dict'>

# dictionary 자료형이기 때문에 key를 사용해 value를 확인할 수 있습니다.
print(f"사용자 이름은 {response_content['name']} 입니다.")

# result output
"""
사용자 이름은 Leanne Graham 입니다.
"""

 

 

지금 당장 사용할 문법

1. glob - 활용한 파일 및 디렉토리 목록 확인

2. open - open을 활용한 파일 다루기

 

'내일배움캠프 > python' 카테고리의 다른 글

list와 array의 간단 비교  (4) 2024.03.05
중요 개념  (0) 2024.02.24
파이썬 문법  (1) 2024.02.20
TIL(데이터를 Flask로 받기,배포하기,listplz 사이드메뉴)  (1) 2024.01.30
파이썬-2일차  (1) 2024.01.26