변수는 자신이 생성된 범위(코드블럭) 안에서만 유효
a = 'scott' # 전역변수
def fun2():
b = 'allen' # 지역변수
return b
print(a) # 전역변수는 어디서든 접근 가능
print(fun2()) # 함수를 호출해야 지역변수 사용 가능
# print(b) # 오류! 지역변수는 함수 외부에서 접근 불가
pi = 3.1415926 # 전역변수
def circle_func1(num): # 원의 넓이를 구하는 함수
return pi * num * num
def circle_func2(num): # 부채꼴의 넓이를 구하는 함수
return 1/4 * pi * num * num
print(circle_func1(5)) # 78.53975
print(circle_func2(5)) # 19.634375
전역변수가 필요한 이유는
원주율(π) 처럼 어느 함수에서 사용하든 절대로 일관된 데이터를 사용해야 할 때 필요
전역변수를 함수 내에서 변경하고 싶을 때는 global 키워드를 사용
pi = 3.1415926 # 전역변수
def circle_func1(num): # 원의 넓이를 구하는 함수
global pi
pi = 3.14 # 전역변수 값 변경
return pi * num * num
def circle_func2(num): # 원의 넓이를 구하는 함수
return pi * num * num
print(circle_func1(5)) # 78.5 (변경된 pi 값 사용)
print(circle_func2(5)) # 78.5 (전역변수가 변경되어 영향받음)
⚠️ global을 사용하게 되면 전역변수가 변경되어 다른 함수에도 영향을 받게 됨
전역변수는 무분별하게 사용하면
코드의 예측 가능성을 낮추고 유지보수를 어렵게 만들 수 있지만, 특정 상황에서는 필요
import oracledb # 오라클과 파이썬 연동을 위한 파이썬 모듈
import pandas as pd # 엑셀 --> 판다스(표 형태의 데이터를 다루는 모듈)
# 파이썬에서 오라클로 접속하기 위한 정보를 구성
dsn = oracledb.makedsn("127.0.0.1", '1521', "xe") #(건물주소, 층, 회사이름)
#(ip주소, 포트, 서비스이름)
db = oracledb.connect(user='c##scott', password='tiger', dsn=dsn)
# 오라클의 데이터를 파이썬에서 출력하는 코드
cursor = db.cursor() # 오라클의 데이터를 올리기 위한 메모리 구성
# 더블쿼테이션 마크를 3개로 둘러준 것은 SQL을 아래로 자유롭게 작성하기 위함
SQL = """ SELECT *
FROM emp """
cursor.execute(SQL) # 쿼리의 수행 결과가 메모리에 구성
row = cursor.fetchall() # 메모리에 올린 데이터를 row 변수에 담습니다
# 컬럼명 받아오는 코드
colname = cursor.description
# print(colname)
col = []
for i in colname:
col.append(i[0].lower())
print(col)
cursor.close() # 파이썬 메모리 닫기
db.close() # db 접속 끊기
print(row)
emp = pd.DataFrame(row, columns=col)
print(emp)
import oracledb
import pandas as pd
def fetch_oracle_data(table_name):
# 파이썬에서 오라클로 접속하기 위한 정보를 구성
dsn = oracledb.makedsn("127.0.0.1", '1521', "xe")
db = oracledb.connect(user='c##scott', password='tiger', dsn=dsn)
# 오라클의 데이터를 파이썬에서 출력하는 코드
cursor = db.cursor() # 오라클의 데이터를 올리기 위한 메모리 구성
SQL = f"""
SELECT * FROM {table_name}
"""
cursor.execute(SQL) # 쿼리의 수행 결과가 메모리에 구성
row = cursor.fetchall() # 메모리에 올린 데이터를 row 변수에 담습니다
# 컬럼명 받아오는 코드
colname = cursor.description
col = []
for i in colname:
col.append(i[0].lower())
cursor.close()
db.close()
table = pd.DataFrame(row, columns=col)
return table
# 함수 호출
result = fetch_oracle_data('dept')
# print(result)
result
import oracledb
import pandas as pd
# 전역변수 설정값
db_config = {
"host": "127.0.0.1",
"port": "1521",
"service_name": "xe",
"user": "c##scott",
"password": "tiger"
}
# DB에 연결하는 함수
def get_connection():
dsn = oracledb.makedsn(db_config['host'], db_config['port'],
service_name=db_config['service_name'])
db = oracledb.connect(user=db_config['user'], password=db_config['password'], dsn=dsn)
return db
# 오라클의 데이터를 가져오는 함수
def fetch_oracle_data(table_name):
# 파이썬에서 오라클로 접속하기 위한 정보를 구성
db = get_connection()
# 오라클의 데이터를 파이썬에서 출력하는 코드
cursor = db.cursor() # 오라클의 데이터를 올리기 위한 메모리 구성
SQL = f""" SELECT *
FROM {table_name} """
cursor.execute(SQL) # 쿼리의 수행 결과가 메모리에 구성
row = cursor.fetchall() # 메모리에 올린 데이터를 row 변수에 담습니다
# 컬럼명 받아오는 코드
colname = cursor.description
col = []
for i in colname:
col.append(i[0].lower())
cursor.close()
db.close()
table = pd.DataFrame(row, columns=col)
return table
# 함수 호출
result = fetch_oracle_data('emp')
print(result)
만약 DB 정보가 변경되면 전역변수를 사용했을 때는 전역변수만 수정해주면 간단하게 해결됩니다.
DB 보안의 이유로 자주 패스워드를 변경하는데, 패스워드를 변경하고 전역변수만 수정하면 됩니다
# 패스워드 변경 시 전역변수만 수정
db_config = {
"host": "127.0.0.1",
"port": "1521",
"service_name": "xe",
"user": "c##scott",
"password": "tiger2" # 패스워드만 변경
}
def visit(count):
count += 1
print(f"현재 방문 횟수: {count}")
return count
visit_count = 0
visit_count = visit(visit_count) # 현재 방문 횟수: 1
visit_count = visit(visit_count) # 현재 방문 횟수: 2
visit_count = visit(visit_count) # 현재 방문 횟수: 3
visit_count = 0
def visit():
global visit_count # 전역변수를 수정하겠다고 지정
visit_count += 1
print('현재 방문 횟수: ', visit_count)
visit()
visit()
visit()