모두가 Python의 객체입니다. 즉, 함수를 의미합니다.
우리가 정의한 모든 함수가 이미 '클래스의 인스턴스'라는 의미에서 객체이기 때문에 이러한 클래스의 인스턴스로 함수를 생성하기 위해 특수 클래스를 정의 할 필요가 없습니다. sotapme이 있습니다.
예를 들어 누군가가 같은 유형의 여러 함수를 만들어야하는 경우 (예 : 각각 정확한 CSV 파일 열의 모든 값을 추가하는 경우) 반복되는 프로세스로 이러한 많은 함수를 만드는 것이 좋습니다.
이 시점에서 질문 : 제기 함수 팩터 리 또는 클래스?
Personnaly는 덜 장황하기 때문에 공장 방식을 선호합니다.
Theran의 대답 HERE에서도 더 빠름을 발견했습니다.
다음 코드에서 globals()로 트릭을 사용하여 함수 팩터를 통해 생성 된 각 함수에 특정 이름을 지정합니다. 어떤 사람들은 그것이 나쁘다고 말하지만, 나는 왜 그런지 모른다. 같은 것을 할 수있는 또 다른 방법이 있다면, 나는 그것을 배우게되어 기쁠 것이다.
코드에서 3 개의 함수는 함수 팩터 리로 빌드되며 일반적인 일반 정의 (op3)로 정의됩니다.
파이썬이 환상적입니다!
import csv
import re
# To create a CSV file
with open('Data.csv','wb') as csvhandle:
hw = csv.writer(csvhandle)
hw.writerows(((2,10,'%%',3000,'-statusOK-'),
(5,3,'##',500,'-modo OOOOKKK-'),
(1,60,'**',700,'-- anarada-')))
del hw
# To visualize the content of the CSV file
with open(r'Data.csv','rb') as f:
print "The CSV file at start :\n "+\
'\n '.join(map(repr,csv.reader(f)))
def run_funcs_on_CSVfile(FUNCS,CSV):
with open(CSV,'rb') as csvhandle:
for f in FUNCS:
# this is necessary for functions not created via
# via a function factory but via plain definition
# that defines only the attribute col of the function
if 'field' not in f.__dict__:
f.field = f.col - 1
# columns are numbered 1,2,3,4,...
# fields are numbered 0,1,2,3,...
for row in csv.reader(csvhandle):
for f in FUNCS:
f(row[f.field])
def SumColumn(name,col,start=0):
def g(s):
g.kept += int(s)
g.kept = start
g.field = col -1
g.func_name = name
globals()[name] = g
def MultColumn(name,col,start=1):
def g(s):
g.kept *= int(s)
g.kept = start
g.field = col - 1
g.func_name = name
globals()[name] = g
def ColumnMatcher(name,col,pat,start = 0):
RE = re.compile(pat)
def g(s,regx = RE):
if regx.search(s):
g.kept += 1
g.kept = start
g.field = col - 1
g.func_name = name
globals()[name] = g
SumColumn('op1',1)
MultColumn('op2',2)
ColumnMatcher('op4',5,'O+K')
def op3(s):
s = int(s)
if s%2:
op3.kept += (2*s)
else:
op3.kept += s
op3.kept = 0
op3.col = 4
print '\nbefore:\n ' +\
'\n '.join('%s.kept == %d'
% (f.func_name, f.kept)
for f in (op1,op2,op3,op4))
# The treatment is done here
run_funcs_on_CSVfile((op2,op3,op4,op1),r'Data.csv')
# note that the order of the functions in the tuple
# passed as argument can be any either one or another
print '\nafter:\n ' +\
'\n '.join('%s(column %d) in %s.kept == %d'
% (f.func_name, f.field+1, f.func_name, f.kept)
for f in (op1,op2,op3,op4))
. 결과는 입니다.
The CSV file at start :
['2', '10', '%%', '3000', '-statusOK-']
['5', '3', '##', '500', '-modo OOOOKKK-']
['1', '60', '**', '700', '-- anarada-']
before:
op1.kept == 0
op2.kept == 1
op3.kept == 0
op4.kept == 0
after:
op1(column 1) in op1.kept == 8
op2(column 2) in op2.kept == 1800
op3(column 4) in op3.kept == 4200
op4(column 5) in op4.kept == 2
"해야합니까?" 왜? "XY를 얻고 싶습니다. 지금까지 해보았습니다"라는 질문에 다시 말하면, 더 나은 행운을 얻게 될 것입니다. –
표준 라이브러리''csv''를 사용하면' 'total (field [0])''이며 전역 데이터에 액세스하지 않습니다. – sotapme
@Dragets : 당신이 성취하고자하는 것이 무엇인지는 분명하지 않습니다. 다시 말해 줄래? – pillmuncher