2017-04-04 1 views
0

Ich habe einen selbst modifizierenden Code gemacht, der auf Python 2.7 läuft und der Code ist ein bisschen groß und ich fragte mich, ob es einen Weg gab, den Code etwas einfacher zu machen, ich habe darüber nachgedacht und ich fand keine Antwort ... ich würde wirklich schätzen, wenn jemand mir eine Hand geben könnte, aber wie auch immer, hier ist der Codemacht selbsterstellenden Code einfacher

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() 

danken Sie im Voraus

+0

Was möchten Sie hier erreichen? Selbst modifizierender Code ist kein Standard-Idiom in Python. – duskwuff

+0

Während dies eine coole Idee ist, ist SO nicht der richtige Ort, um allgemeine Ratschläge zu erhalten, bitte stellen Sie die Frage genauer. Allerdings empfehle ich, zuerst ein paar Dinge zu lesen: [selbst modifizierender Code] (https://en.wikipedia.org/wiki/Self-modifying_code) und [Optimierung von zustandsabhängigen Schleifen.] (Https: // en .wikipedia.org/wiki/Self-modifying_code # Optimizing_a_state-dependent_loop) Es gibt noch viel mehr zu diesem Thema, das Sie lesen sollten, bevor Sie hier posten. –

+0

Können Sie bitte erläutern? Auch könnte man 3,4,5,6 Zeilen wie folgt vereinfachen: 'mit open (sys.argv [0], 'w') als f: f.write (''. Join (x))' –

Antwort

0

Es gibt keine Notwendigkeit für eine Liste verwenden Sie einfach eine Zeichenkette:

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) 

Die Anwendung des gleichen Prinzips auf den inneren Code könnte helfen, die Länge zu verkürzen.

+0

habe nicht darüber nachgedacht, es macht es besser und besser zu betrachten, danke. –