用Python代码自己写Python代码,竟如此简单

用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库画了一个正方形。

总结

  1. 本文介绍了用Python自动生成代码的方法,讲解了基本的实现原理和知识。

  2. 本文分析了自动生成代码时的一些细节处理方法,更多具体的情况可以根据你的应用场景进行补充。

  3. 本文分享了一个实际的案例,你可以充分发挥自己的聪明才智,将自动生成代码的方式应用到更多场景,为自己所用。

如果本文对你有帮助或能给你一些启发,欢迎你点赞、收藏、评论、关注。

相关阅读
Python文件读写操作

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值