개발 꿀팁/PYTHON

파이썬의 기초 지식

Jammie 2022. 11. 24. 11:16
반응형

카테고리

함수명 뒤의 '->'

코드가 너무 길어서 줄을 바꿔야 합니다

클래스 메서드/함수의 선행 밑줄

Function과 Method

문자열 앞에 있는 u, r, b

문자열 앞에 u 추가

문자열 앞에 r 추가

문자열 앞에 b 추가

흔히 볼 수 있는 포맷 기호

변경 가능(mutable) 및 변경 불가(immutable) 개체

Python3 import 용법

Python2와 Python3에서 dict의 차이

python 수식자@

그룹—tuple(파이썬 개념)

ndarray

axis=-1

연산 중 ** 연산자

파이썬 매개 변수 전달

numpy에서 행렬 곱하기, 별 곱하기(*)와 점 곱하기(.dot)의 차이

==와 is의 차이

for _

전역 변수 수정

/ 와 //

상대 경로

기타

설치 경로

GIL

 

함수명 뒤의 '->'
함수의 반환 형식 설명

코드가 너무 길어서 줄을 바꿔야 합니다
예를 들어 문자열

str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

코드 안에서 두 줄만 예쁘게 만들고 싶어요.

\"를 사용해야 합니다.

str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \

"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"

보통 IDE는 줄바꿈이 필요한 곳에서 리턴하면 되며 \"\"가 자동으로 추가됩니다.

클래스 메서드/함수의 선행 밑줄
이름 앞에 있는 단일 밑줄은 프로그래머가 이름을 '개인'으로 간주하도록 지정하는 데 사용됩니다.이것은 코드를 읽는 사람이 내부적으로 사용하기 위해 _로 시작하는 이름을 알기 쉽게 하는 약속으로 볼 수 있습니다.이것은 해석 프로그램에 실제로 어떤 의미가 있기 때문에 약속이라고 할 수 있습니다. 만약 우리가 <module/package> import*에서 모듈/패키지의 __all_열로 그것들이 포함되어 있음을 나타내지 않는 한 _로 시작하는 이름을 가져오지 않습니다.

명칭(특히 방법명) 앞에 이중 밑줄(__)을 사용하는 것은 약정이 아니라 분석 절차에 특별한 의미가 있을 뿐입니다.Python은 이러한 이름을 관리하며 하위 클래스에서 정의된 이름과 충돌하지 않도록 합니다.Python 문서에 언급된 바와 같이 __spam의 모든 형태(최소 2개의 선행 밑줄, 최대 1개의 후속 밑줄)는 텍스트에서 _classname_spam으로 대체되며, 여기서 classname은 선행 밑줄이 제거된 현재 클래스 이름입니다.

Function과 Method
파이썬에서 함수(Function)와 방법(Method)의 차이:

클래스 및 인스턴스와 바인딩되지 않은 function은 모두 함수(function)에 속합니다.
클래스 및 인스턴스와 연결된 function은 모두 메서드(method)에 속합니다.
문자열 앞에 있는 u, r, b
문자열 앞에 u 추가
예:u "저는 중국어로 된 문자열입니다."

역할: 후면 문자열은 Unicode 형식으로 인코딩되며 일반적으로 중국어 문자열 앞에 사용되며 소스 코드 저장 형식 문제로 인해 재사용 시 깨지는 코드를 방지합니다.

PS: 단순히 중국어만 대상으로 하는 것이 아니라 어떤 문자열도 대상으로 할 수 있습니다.

문자열 앞에 r 추가
예:r"\n\n\n\n\n"

역할: 선언 뒤에 있는 문자열은 일반 문자열입니다. 상대적이며 특수 문자열에는 이스케이프 문자 \n\t 뭐 이런 것들이 포함되어 있습니다.

용도: 일반적으로 정규 표현, 문서의 절대 주소 등에 사용됩니다.

문자열 앞에 b 추가
역할: python3.x에서 기본 str은 (py2.x에서) unicode이고 bytes는 (py2.x)의 str, bytes" 접두사가 bytes입니다.
python2.x에서, b 접두사는 아무런 구체적인 의미가 없다. 다만, python3.x의 이런 표기법을 호환하기 위해서이다.

파이썬의 문자열 형식 기호

흔히 볼 수 있는 포맷 기호
%s을( 를) 문자열로 변환하여 포맷합니다
%u 부호 없는 10진 정수
%d 기호가 있는 십진수 정수
%o 8진수 정수
%x 16진수 정수, 소문자
%X 16진수 정수, 대문자
%e 부동 소수점 숫자 (과학 계수법)
%E 부동 소수점 숫자 (과학 계수법, e 대신 E)
%f 부동 소수점 실수
%g 부동 소수점 숫자 (값의 크기에 따라 %e 또는 %f 사용)
%G 부동 소수점 숫자 (%g와 유사)

i=1
while i<10: #줄 제어, 1~9
j=1
while j <= i: # 줄당 표시 수, 1에서 9까지 제어
print("%d*%d=%d"%(i,j,i*j),end='") #출력
j+=1 #줄당 1개씩 표시
print("\n") # 줄 바꿈 끝
i+=1 #행수 더하기 1

변경 가능(mutable) 및 변경 불가(immutable) 개체
python에서 strings, tuples, numbers는 변경할 수 없는 대상이고 list, dict 등은 수정할 수 있는 대상입니다.
가변 유형: 변수 할당 a=5 후 a=10, 여기서 실제로 int 값 객체 10으로 새로 생성된 다음 a가 가리키도록 하고 5는 a의 값을 변경하는 것이 아니라 a의 값을 변경하는 것이 아니라 a의 새로 생성된 a에 해당합니다.
가변 유형: 변수 할당 la=[1,2,3,4] 및 la[2]=5 할당은 listla의 세 번째 요소 값을 변경하는 것이며 la 자체는 움직이지 않지만 내부 값의 일부만 수정됩니다.

Python3 import 용법
import 문구는 무슨 소용이 있습니까?import 문은 코드 다중화의 목적을 달성하기 위해 모듈에 정의된 클래스, 방법 또는 변수를 사용하여 다른 파이썬 파일(모듈 모듈이라고 함)을 가져오는 데 사용됩니다.

import module_name。즉, import 후 모듈명을 직접 연결합니다.이 경우 Python은 두 곳에서 이 모듈을 찾습니다. 첫 번째는 sys.path(실행 코드 import sys; print(sys.path)를 통해 확인)이고 os라는 모듈이 있는 디렉토리는 목록 sys.path에 있으며 일반적으로 설치된 Python 라이브러리의 디렉토리는 sys.path에서 찾을 수 있습니다(Python의 설치 디렉토리를 컴퓨터의 환경 변수에 추가해야 하는 경우). 따라서 설치된 라이브러리는 직접 import하면 됩니다.두 번째는 실행파일(m1.py)이 있는 디렉토리로, m2.py과 실행파일이 같은 디렉토리에 있기 때문에 위의 작성법은 문제가 없다.

from package_name import module_name。일반적으로 모듈로 구성된 집합을 패키지(package)라고 합니다.첫 번째 쓰기 방법과 유사하게 Python은 sys.path와 실행 파일 디렉토리 두 곳에서 패키지를 찾은 다음 패키지의 module_name이라는 모듈을 가져옵니다.

다른 경로를 참조해야 하는 py 파일의 경우 sys.path.append("")를 사용하여 해당 py 파일이 있는 경로를 참조해야 하며, 이후 해당 py 파일의 클래스 및 함수를 사용할 수 있습니다

import sys
sys.path.append( '../A/') #aa는 A 폴더 아래에 있습니다.
from aa import classA #classA는 aa의 한 종류이다

Python2와 Python3에서 dict의 차이
예를 들어 Python2에서 dict.keys() 목록을 반환합니다.

dict={'name':'ming','age':20}

dict.keys()

출력: ['name', 'age']

Python3에서 dict.keys () 는 dict_keys 개체를 반환합니다.

dict={'name':'ming','age':20}

dict.keys()

출력: dict_keys (['name', 'age'])

list 추가 후 등가 가능합니다.

list(dict.keys())

출력: ['name', 'age']

python 수식자@
파이썬 함수 수식자@의 역할은 로그 삽입, 성능 테스트, 트랜잭션 처리 등에 사용되는 기존 함수의 추가 기능을 추가하는 것입니다.

함수 수식자를 만드는 규칙:
(1) 수식자는 하나의 함수이다.
(2) 수식자는 피수식 함수를 파라미터로 취한다.
(3) 수식자가 새 함수를 반환합니다.
(4) 수식자 유지보수 대상 함수의 서명

def log(func):
def wrapper():
print('log 시작...')
func()
print('log 끝...')
return wrapper

@log
def test():
print('test ..')

test()

그룹—tuple(파이썬 개념)
튜플(tuple)이 리스트와 배열이 다른 점은 일단 정의되면 수정할 수 없고 리스트와 배열은 가능하다는 것이다.또한 메타 그룹의 특성은 목록과 유사합니다.

Python 메타 그룹의 업그레이드된 버전 -- namedtuple

그룹 내의 데이터에 이름을 붙일 수 없기 때문에 종종 그룹이 표현하는 의미를 모르기 때문에 여기에 collections.namedtuple이라는 공장 함수를 도입하여 필드 이름이 있는 그룹을 구성합니다.필드 이름이 해당 클래스에 존재하기 때문에 이름이 있는 메타 그룹의 인스턴스는 일반 메타 그룹이 사용하는 메모리만큼 많습니다.이 클래스는 일반 개체 인스턴스보다 작습니다. 파이썬은 이러한 인스턴스의 속성을 저장하기 위해 _dict_를 사용하지 않기 때문입니다.

namedtuple 객체의 정의는 다음과 같습니다

collections.namedtuple(typename, field_names, verbose=False, rename=False)

매개 변수의 의미는 다음과 같이 명명된 이름 있는 메타그룹 하위 클래스 typename을 반환합니다.

typeName: 그룹 이름
field_names: 메타 그룹의 요소 이름
rename: 요소 이름에 python 키워드가 포함되어 있으면 rename=True로 설정해야 합니다
verbose: 기본값으로 설정
ndarray
NumPy의 가장 중요한 특징은 N차원 배열 객체인 ndarray로, 동일한 유형의 일련의 데이터 집합이며 집합의 요소를 인덱싱하기 위해 0 첨자를 사용합니다.

ndarray 객체는 동일한 유형의 요소를 저장하는 데 사용되는 다차원 배열입니다.

ndarray의 각 요소는 메모리에 동일한 저장 크기의 영역을 가지고 있습니다.

ndarray 내부는 다음과 같이 구성되어 있습니다.

데이터(메모리 또는 메모리 매핑 파일의 데이터 블록)에 대한 포인터입니다.

데이터 유형 또는 dtype은 배열의 고정된 크기 값을 설명하는 격자입니다.

배열 모양(shape)을 나타내는 메타 그룹은 각 차원의 크기를 나타냅니다.

스판 메타그룹(stride)에서 정수는 현재 차원의 다음 요소로 진행하기 위해 '스판'이 필요한 바이트 수를 나타냅니다.

ndarray의 내부 구조:

axis=-1
파이톤에서, -1은 끝에서 첫 번째를 나타낸다.

만일 당신의 행렬 shape=[3,4,5]라면, 이 행렬에 대하여 말하자면, axis=-1이며, 사실 또한 axis=2와 같다.

연산 중 ** 연산자
대표승수

 
>>> 2 * 5
10
>>> 2 ** 5
32

파이썬 매개 변수 전달
값 전달(passl-by-value) 과정에서 변조된 함수의 형식 매개변수는 변조된 함수의 국소 변수로 처리되며, 즉 스택에 메모리 공간을 열어 변조된 함수에 의해 입력된 실제 매개변수의 값을 저장하여 실제 매개변수의 복사본이 되고자 합니다.값 전달의 특징은 변조된 함수의 형식 매개변수에 대한 모든 조작이 국소 변수로 수행되며 주 변조 함수의 실제 매개변수 값에 영향을 미치지 않는다는 것입니다.

참조 전달(pass-by-reference) 과정에서 변조된 함수의 형식 매개변수도 스택의 메모리 공간을 여는 로컬 변수로 사용되지만 이때 변조된 함수에 의해 입력된 실제 매개변수 주소도 저장됩니다.변조된 함수에 의한 형상 모수의 모든 조작은 스택에 저장된 주소를 통해 변조된 함수의 실제 매개변수에 액세스하는 간접 주소 지정으로 처리됩니다.이러한 이유로 피변조 함수가 형태학적 매개변수에 대해 수행하는 모든 조작은 주요 변조 함수의 실제 매개변수 변수에 영향을 미칩니다.

파이썬(python)은 프로그래머가 전송 값을 사용할지 전송 참조를 사용할지 선택하는 것을 허용하지 않습니다.파이썬 매개 변수 전달은 분명히 '전달 대상 인용' 방식을 채택합니다.이 방법은 전송 값과 전송 참조의 통합에 해당합니다.함수가 불변 객체(숫자, 문자 또는 메타 그룹)에 대한 참조를 받는 경우 원래 객체를 직접 수정할 수 없으며 이는 '값 전달'을 통해 객체를 전달하는 것과 같습니다.함수가 가변 객체(사전, 목록)에 대한 참조를 받는 경우 객체의 원래 값을 수정할 수 있습니다.

def foo(arg):
arg = 2
print(arg)

a = 1
foo(a) # 출력: 2
print(a) # 출력:1
def bar(args):
args.append(1)

b = []
print(b)# 출력:[ ]
print(id(b)) # 출력:4324106952
bar(b)
print(b) # 출력: [1]
print(id(b)) # 출력:4324106952

numpy에서 행렬 곱하기, 별 곱하기(*)와 점 곱하기(.dot)의 차이
별 곱하기(elementwise)는 행렬 내 각 대응 위치의 곱하기(원소별 곱하기), 행렬 a*b 첨자(0,0) = 행렬 a 첨자(0,0) x 행렬 b 첨자(0,0)를 나타낸다.

점 곱은 행렬의 내적을 나타내며, 2차원 배열을 행렬의 곱(mastrix product)이라고 합니다.

==와 is의 차이
Python에서는 모든 것이 대상이고 예외 없이 정수도 대상이며, 대상 간의 동등성 여부를 비교하기 위해 ==를 사용할 수도 있고 is를 사용할 수도 있습니다.

Is는 두 개체의 id 값이 동일한지, 즉 두 개체가 동일한 인스턴스 개체인지, 동일한 메모리 주소를 가리키는지 여부를 비교합니다.

== 두 객체의 내용이 동일한지 여부를 비교하며 기본적으로 객체의 __eq_() 메서드가 호출됩니다.

for _
for _ in range(n) 중
_ 중요하지 않은 변수를 나타내는 값은 n번 순환하는 데만 사용됩니다.
예를 들어 한 시퀀스에서 머리와 꼬리만 취하려고 하면 사용할 수 있습니다_
사실 의미는 foreach in range(n)와 같은 의미이며 _는 each가 될 수 있고 다른 임의의 규범에 부합하는 기호일 수 있으며 후속 인용을 용이하게 할 뿐입니다.


전역 변수 수정
글로벌 변수를 인용하고 수정하려면 global 키워드를 추가해야 합니다

a = 3
def Fuc():
	global a
    print (a)
    a=a+1
Fuc()

/ 와 //
Python 3 이후: "/"는 부동 소수점 나눗셈을 나타내고 부동 소수점 결과를 반환하며 "//"는 정수 나눗셈을 나타냅니다.

상대 경로
"/": "E:\"와 같이, 윈도 시스템에서 디스크의 루트를 나타냅니다.

./": 현재 디렉토리를 나타냅니다. (현재 디렉토리를 표시할 경우 ./"을 빼고 파일명 또는 하위 디렉토리를 직접 작성할 수도 있습니다)

"../": 상위 디렉터리 표시

기타
설치 경로
C:\Users\xxxx에 있는 내 이름\AppData\Local\Programs\Python

GIL
먼저 GIL은 파이썬의 특성이 아니며 파이썬 분석기(CPython)를 구현할 때 도입된 개념이라는 점을 명확히 해야 합니다.마치 C++가 언어(문법) 표준 세트이지만 다른 컴파일러를 사용하여 실행 가능한 코드로 컴파일할 수 있습니다.GCC, INTELC++, Visual C++ 등과 같은 유명한 컴파일러입니다.파이썬도 마찬가지로 CPython, PyPy, Psyco 등 다양한 파이썬 실행 환경을 통해 동일한 코드를 실행할 수 있습니다.그중에서도 JPython은 GIL이 없습니다.그러나 CPython은 대부분의 환경에서 기본 Python 실행 환경이기 때문입니다.그래서 많은 사람들의 개념에서 CPython은 Python이고 GIL은 당연히 Python 언어의 결함으로 귀결된다고 생각합니다.GIL은 파이썬의 특성이 아니며 파이썬은 GIL에 의존하지 않아도 된다는 점을 분명히 해야 합니다.

그렇다면 CPython에서 구현 중인 GIL은 무엇일까요?글로벌 인터프리터 록(GIL)은 오해의 소지가 없도록 공식 설명을 살펴본다.

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

 

반응형