使自修改代码更容易

时间:2017-04-04 17:53:12

标签: python self-modifying

我做了一个自修改代码,运行在python 2.7上,代码有点大,我想知道是否有办法使代码更容易,我已经考虑过了,我没有找到任何答案......如果有人能帮助我,我真的很感激,但无论如何,这是代码

import sys
x = ['num = 0\n', 'from threading import *\n', 'import sys\n', 'def change(b, line=1):\n', '\tline -= 1\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tlines[line] = b+"\\n"\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\n', 'def addline(b):\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tlines.append("\\n"+b)\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\n', 'def delline(b = 10):\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\tlines = []\n', '\tfor i in g:\n', '\t\tlines.append(i)\n', '\tleng = len(lines) - b\n', '\tlines = lines[:leng]\n', "\tf = open(sys.argv[0], 'w')\n", '\tfor each in lines:\n', '\t\tf.write(each)\n', '\tf.close()\n', '\t\t\n', 'def showfile():\n', '\tcheck = num\n', '\tf = open(sys.argv[0])\n', '\tg = f.readlines()\n', '\twhile num != check + 1:\n', '\t\tfor i in g:\n', '\t\t\tprint i\n', '\t\n', '\t\n', 'if num == 0:\n', '\tThread(target=showfile).start()\n', '\tf = open("values.py", \'w\')\n', '\twriter = [\'linestowrite1 = [\\\'import os\\\\n\\\', \\\'from time import *\\\\n\\\',\\\'os.system("cls")\\\\n\\\', \\\'print("hello...")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("I am a program that is able to evolve by itself")\\\\n\\\', \\\'sleep(4)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("everytime someone opens me, I evolve")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\',\\\'change("num = 2")\\\\n\\\' \\\'raw_input("press ENTER to exit")\\\\n\\\']\\n\', \'linestowrite2 = [\\\'from time import *\\\\n\\\', \\\'f = open(sys.argv[0])\\\\n\\\', \\\'g = f.readlines()\\\\n\\\', \\\'leng = len(g)\\\\n\\\', \\\'sleep(1)\\\\n\\\', \\\'print("CURRENT LENGTH : "+str(leng))\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'print("Extending length to : "+str(leng+20))\\\\n\\\', \\\'sleep(3)\\\\n\\\', \\\'change("num = 5")\\\\n\\\', \\\'\\\\t\\\']\']\n', '\tfor i in writer:\n', '\t\tf.write(i)\n', '\tf.close()\n', '\timport values\n', '\ttowrite = values.linestowrite1\n', '\tfor i in towrite:\n', '\t\taddline(i)\n', '\tchange("num = 1")\n', '\tnum += 1\n', 'elif num == 2:\n', '\tThread(target=showfile).start()\n', '\tdelline(26)\n', '\tchange("num = 3")\n', '\tnum += 1\n', '\thorse69\n', 'elif num == 3:\n', '\tThread(target=showfile).start()\n', '\timport values\n', '\ttowrite = values.linestowrite2\n', '\tfor i in towrite:\n', '\t\taddline(i)\n', '\tchange("num = 4")\n', '\tnum += 1\n', 'elif num == 5:\n', '\tThread(target=showfile).start()\n', '\tdelline(21)\n', '\tchange("num = 6")\n', '\tnum += 1\n', '\thorse69\n', 'elif num == 6:\n', '\tprint("EVOLUTION COMPLETE")\n', '\traw_input()\n']
f = open(sys.argv[0], 'w')
for i in x:
    f.write(i)
f.close()

提前谢谢

1 个答案:

答案 0 :(得分:0)

不需要列表,只需使用字符串:

import sys

newcode = 'num = 0\nfrom threading import *\nimport sys\ndef change(b, line=1):\n\tline -= 1\n\tf = open(sys.argv[0])\n\tg = f.readlines()\n\tlines = []\n\tfor i in g:\n\t\tlines.append(i)\n\tlines[line] = b+"\\n"\n\tf = open(sys.argv[0], \'w\')\n\tfor each in lines:\n\t\tf.write(each)\n\tf.close()\n\t\ndef addline(b):\n\tf = open(sys.argv[0])\n\tg = f.readlines()\n\tlines = []\n\tfor i in g:\n\t\tlines.append(i)\n\tlines.append("\\n"+b)\n\tf = open(sys.argv[0], \'w\')\n\tfor each in lines:\n\t\tf.write(each)\n\tf.close()\n\t\ndef delline(b = 10):\n\tf = open(sys.argv[0])\n\tg = f.readlines()\n\tlines = []\n\tfor i in g:\n\t\tlines.append(i)\n\tleng = len(lines) - b\n\tlines = lines[:leng]\n\tf = open(sys.argv[0], \'w\')\n\tfor each in lines:\n\t\tf.write(each)\n\tf.close()\n\t\t\ndef showfile():\n\tcheck = num\n\tf = open(sys.argv[0])\n\tg = f.readlines()\n\twhile num != check + 1:\n\t\tfor i in g:\n\t\t\tprint i\n\t\n\t\nif num == 0:\n\tThread(target=showfile).start()\n\tf = open("values.py", \'w\')\n\twriter = [\'linestowrite1 = [\\\'import os\\\\n\\\', \\\'from time import *\\\\n\\\',\\\'os.system("cls")\\\\n\\\', \\\'print("hello...")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("I am a program that is able to evolve by itself")\\\\n\\\', \\\'sleep(4)\\\\n\\\', \\\'os.system("cls")\\\\n\\\', \\\'print("everytime someone opens me, I evolve")\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'os.system("cls")\\\\n\\\',\\\'change("num = 2")\\\\n\\\' \\\'raw_input("press ENTER to exit")\\\\n\\\']\\n\', \'linestowrite2 = [\\\'from time import *\\\\n\\\', \\\'f = open(sys.argv[0])\\\\n\\\', \\\'g = f.readlines()\\\\n\\\', \\\'leng = len(g)\\\\n\\\', \\\'sleep(1)\\\\n\\\', \\\'print("CURRENT LENGTH : "+str(leng))\\\\n\\\', \\\'sleep(2)\\\\n\\\', \\\'print("Extending length to : "+str(leng+20))\\\\n\\\', \\\'sleep(3)\\\\n\\\', \\\'change("num = 5")\\\\n\\\', \\\'\\\\t\\\']\']\n\tfor i in writer:\n\t\tf.write(i)\n\tf.close()\n\timport values\n\ttowrite = values.linestowrite1\n\tfor i in towrite:\n\t\taddline(i)\n\tchange("num = 1")\n\tnum += 1\nelif num == 2:\n\tThread(target=showfile).start()\n\tdelline(26)\n\tchange("num = 3")\n\tnum += 1\n\thorse69\nelif num == 3:\n\tThread(target=showfile).start()\n\timport values\n\ttowrite = values.linestowrite2\n\tfor i in towrite:\n\t\taddline(i)\n\tchange("num = 4")\n\tnum += 1\nelif num == 5:\n\tThread(target=showfile).start()\n\tdelline(21)\n\tchange("num = 6")\n\tnum += 1\n\thorse69\nelif num == 6:\n\tprint("EVOLUTION COMPLETE")\n\traw_input()\n'

with open(sys.argv[0], 'w') as f:
    f.write(newcode)

将相同的原则应用于内部代码可能有助于缩短内部代码。