我正在尝试编写我的第一个面向对象程序。 我想到的代码是:
class Lattice:
'Commomn base for all sublattice'
latc = 0
def __init__(self, conc, name, pot):
self.atcon = atcon
self.name =name
self.pot=[]
Lattice.latc += 1
atcon=[]
with open(inpf, "r") as f:
for line in f:
match = re.search(reall, line)
if match:
if (match.group(1).strip() == "atcon"):
atcon.append(match.group(2).split())
print("CON =>"+str(atcon))
print("CON[0] =>"+str(atcon[0]))
lat0=Lattice(atcon[0],pot[0],name[0])
print("lat0 =>"+str(lat0.atcon))
我原以为lat0.atcon
会atcon[0]
但最后3个打印语句的结果是:
CON =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']]
CON[0] =>['0.5d0', '0.50d0']
lat0 =>[['0.5d0', '0.50d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0'], ['0.98d0', '0.02d0']]
我不明白为什么。我是一个初学者,没有正式的python培训(学习使用net等),所以,请耐心等待
更新:
在接受答复后,这是我目前正在使用的代码。问题是,我正在读取list
中的所有内容,然后将这些列表插入lat0
即
#if match found
atcon.append(match.group(2).split())
# after getting all match, in global scope
lat0=Lattice(atcon[0],name[0],pot[0])
所以,我想我不是在浪费list
就是在浪费对象lat0
。当找到匹配项时,I是否可能直接填充lat0
?
e、 g
#if match found for <name>
lat0=Lattice(name)
迷你.py:
#!/usr/bin/env python3
import sys
import re
class Lattice:
'Commomn base for all sublattice'
latc = 0
def __init__(self, conc, names, pots):
self.atcon = conc
self.name =names
self.pot=pots
Lattice.latc += 1
reall='(.*)\s*=\s*(.*)'
inpf = sys.argv[1]
print(inpf)
with open(inpf, "r") as f:
pot=[]
name=[]
atcon=[]
for line in f:
match = re.search(reall, line)
if match:
if (match.group(1).strip() == "atcon"):
atcon.append(match.group(2).split())
if (match.group(1).strip() == "pot"):
pot.append(match.group(2).split())
if (match.group(1).strip() == "name"):
name.append(match.group(2).split())
lat0=Lattice(atcon[0],name[0],pot[0])
print("POT =>"+str(pot))
print("NAME =>"+str(name))
print("CON =>"+str(atcon))
print("CON[0] =>"+str(atcon[0]))
print("lat0 =>"+str(lat0.pot))
典型输入
pot=Rh1.pot Rh2.pot Fe1a.pot Fe2a.pot
name=Rh-up Fe-up
atcon=0.5d0 0.50d0
pot=Rh3.pot Rh4.pot Fe3a.pot Fe4a.pot
name=Rh-up Fe-up
atcon=0.98d0 0.02d0
我打赌你不是在空闲的时候写的就是测试的。在这一点上,我敢肯定这是非常混乱,但错误是非常简单的。实例化类时,通常建议使用发送给
__init__
的值,而不要引用其他值所发生的情况是
atcon
、pon
和name
在全局范围内定义,您在下面的示例中引用了它们:其输出如下:
编辑回答原问题的扩展编辑
我想我明白了。有两件事仍然困扰着我:
["Rh1.pot", "Rh2.pot", "Fe1a.pot", "Fe2a.pot"]
,我可能很冒昧,但是我在分割后添加了一个[0]
,只检索第一次点击。如果我没抓住重点就把它去掉李>以下代码将在找到第一次命中后停止循环。我声明
atcon
、pot
和name
为列表,因为.split()
将返回一个列表,但我不会附加结果,以免浪费内存。我还使用return Lattice
对象退出函数,避免在解析其余行时浪费时间另外,最后的
if atcon and pot and name
是为了避免在有匹配的文本但不包含所有重要信息的情况下返回。在python中,if
的空列表将是False
。您可以保留代码的其余部分(print语句除外)测试日期
输出:
相关问题 更多 >
编程相关推荐