用Python代码自己写Python代码,竟如此简单
Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有“无所不能”的特质。
Python甚至可以代替人,自己写Python代码。而且很简单,只需学会Python的基础知识就可以了。
本文介绍用Python代码自己生成Python代码的方法,请往下看。
需要的知识
1.文件写入操作
在python中,使用内置函数open(),可以打开一个已经存在的文件,或创建一个新文件。open(文件名,访问模式)
访问模式:
- r: 以只读方式打开文件,文件的指针将会放在文件的开头。打开文件后,从文件的开头开始读取内容。
- w: 打开一个文件用于从头写入。文件的指针也是放在文件的开头,如果该文件已存在则将其覆盖。如果该文件不存在则创建新文件。
- a: 打开一个文件用于追加写入。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件从头开始写入。
此外,还有很多其他模式:rb,wb,ab,r+,w+,a+,rb+,wb+,ab+,不一一介绍了。
本文用到w模式和a模式,open()函数通常与上下文管理关键字with配合使用。
例如:
with open("test.txt", "w") as f:
f.write('写入的内容')
创建的test.txt文件:
2.Python代码文件扩展名
Python代码是扩展名(文件后缀名)为 .py 的文本文件,在安装了Python解释器的地方可以运行。如果用Python生成了一个 .py 后缀的文件,这个生成的文件就可以被Python解释器识别。
所以,用Python自动写Python代码的方法就是创建一个 .py 文件,在文件中写入要生成的代码。
内容写入使用字符串的方式,写入的内容需要满足Python的编码规范。
写一个Hello World程序
介绍完方法,先写一个 Hello World 程序,方便理解。
python_file = "hello_world.py"
with open(python_file, "w") as f:
f.write("# coding=utf-8\n")
f.write("print('Hello World!')\n")
生成的hello_world.py代码:
# coding=utf-8
print('Hello World!')
生成的代码文件hello_world.py可以直接运行,说明Python解释器对自动生成的 .py 文件和人工编写的 .py 文件是“一视同仁”的,都可以正常运行。
基于上面的内容,用Python自动写Python代码这条路已经走通了。
下面继续分析如何满足Python的各种编码规范(处理编码规范的细节),以及思考哪些场景可以利用Python自动写代码。
部分细节介绍和分析
python_file = "auto_gen_print.py"
with open(python_file, "w") as f:
f.write("# coding=utf-8\n\n")
f.write("for i in range(10):\n")
f.write(" print(i)\n")
生成的auto_gen_print.py代码:
# coding=utf-8
for i in range(10):
print(i)
生成的代码运行后会在控制台循环打印0-9这10个数字。
代码换行和缩进处理:
- 换行:要在生成的代码中换行,写入内容时要在每一行代码后都加上换行符\n。一个\n表示一次换行,需要有空行的地方要加上对应个数的换行符。
- 缩进:在IDE中(如PyCharm)编写代码时,经常使用Tab键来控制代码的缩进,对应的字符为\t,自动生成代码时,可以用\t来表示缩进。
但是,在PyCharm中打开生成的代码后,发现\t生成的缩进不满足PEP编码规范,要用4个空格表示缩进才满足PEP编码规范。不过,\t生成的缩进不影响代码运行和代码可读性,可以放心使用。
python_file = "auto_gen_print.py"
with open(python_file, "a") as f:
f.write("\n")
f.write("print('-' * 20)\n")
for i in range(10):
f.write("print({})\n".format(i))
在auto_gen_print.py中追加写入代码:
print('-' * 20)
print(0)
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
上面的auto_gen_print.py第一次写入时使用的是w模式,第二次写入时使用的是a模式。
对于重复调用的代码,上面的auto_gen_print.py第一次生成了一个for循环,第二次是直接将函数代码写了N行。
重复逻辑的处理:
- 生成循环:Python中处理重复逻辑的方式一般是用循环,所以可以在代码中生成循环,用循环执行重复代码。
- 重复调用:在自动生成代码时,把循环提前到用于生成代码的脚本中,执行脚本后生成重复的代码,替代手写和复制粘贴。
对于重复的业务逻辑,这两种生成方式的运行结果没有差别。
从自动生成代码的角度思考,第一种方式生成的是一个循环代码。第二种方式是不断重复生成一行(或多行)代码,用自动生成的方式避免重复写代码和重复复制粘贴。
第二种重复生成代码的方式更可能是自动生成代码的“用武之地”。思考一下,假如遇到业务逻辑不断重复的场景,又不适合使用循环和不适合使用函数或类封装,不妨试试用自动生成代码的方式。
自动生成代码的另一个核心作用是可以反复执行反复生成。
不难发现,前面用于生成循环的代码有5行,而循环代码只有两行,用自动生成的方式,代码反而更多了。不过,重点是这5行代码可以执行N次,只要调整少量参数,每次重新执行,都可以生成一个新的Python代码文件。
实际应用时,考虑到反复利用,自动生成代码的方式绝对可以“大有作为”。
案例演示
下面的案例演示用代码生成一段画正方形的代码。
python_file = "auto_gen_square.py"
with open(python_file, "w", encoding='utf-8') as f:
f.write("# coding=utf-8\n")
f.write("import turtle as t\n\n")
point = [(-50, 50), (50, 50), (50, -50), (-50, -50)]
f.write("t.title('DrawSquare(公众号:小斌哥ge)')\n")
f.write("t.setup(400, 300, 100, 200)\n")
f.write("t.speed(5)\n")
f.write("t.penup()\n")
f.write("t.goto({})\n".format(point[0]))
f.write("t.pendown()\n")
for p in point[1:]:
f.write("t.goto({})\n".format(p))
f.write("t.goto({})\n".format(point[0]))
f.write("t.penup()\n")
f.write("t.goto(100, 0)\n")
f.write("t.done()\n")
生成的auto_gen_square.py代码:
# coding=utf-8
import turtle as t
t.title('DrawSquare(公众号:小斌哥ge)')
t.setup(400, 300, 100, 200)
t.speed(5)
t.penup()
t.goto((-50, 50))
t.pendown()
t.goto((50, 50))
t.goto((50, -50))
t.goto((-50, -50))
t.goto((-50, 50))
t.penup()
t.goto(100, 0)
t.done()
运行auto_gen_square.py的结果:
运行自动生成的代码,使用turtle库画了一个正方形。
总结
-
本文介绍了用Python自动生成代码的方法,讲解了基本的实现原理和知识。
-
本文分析了自动生成代码时的一些细节处理方法,更多具体的情况可以根据你的应用场景进行补充。
-
本文分享了一个实际的案例,你可以充分发挥自己的聪明才智,将自动生成代码的方式应用到更多场景,为自己所用。
如果本文对你有帮助或能给你一些启发,欢迎你点赞、收藏、评论、关注。
相关阅读
Python文件读写操作