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

news2024/9/21 18:00:12

用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文件读写操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ学习笔记

目录 尚硅谷mq视频学习笔记 1.1. MQ 的相关概念 1.1.1. 什么是MQ 1.1.2. 为什么要用MQ 1.1.3. MQ 的分类 1.ActiveMQ 2.Kafka 3.RocketMQ 4.RabbitMQ 1.1.4. MQ 的选择 1.Kafka 2.RocketMQ 3.RabbitMQ 1.2. RabbitMQ 1.2.1. RabbitMQ 的概念 1.2.2. 四大核心概念…

7.7网络(二)

接上篇:7.7 网络(一)_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中,属于端的技术。对于端来…

分布式锁-全面详解(学习总结---从入门到深化)

目录 分布式锁概述 为什么需要分布式锁 什么是分布式锁 分布式锁的特点 分布式锁问题_业务介绍 案列介绍 技术选型 创建表 创建订单表 创建商品表 创建订单商品关联表 分布式锁问题_创建SpringBoot项目 引入依赖 修改配置文件 编写主启动类 代码生成 编写创建订单接…

(附源码)node.js电商管理系统 毕业设计 251001

node.js电商管理系统 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,电商管理系统当然也不能排除在外。电商管理系统 是以实际运用为开发背景,运用软件工程开…

【数据结构与算法】拓扑排序与关键路径

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:数据结构与算法 🌠 首发时间:2022年12月4日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾…

【C++智能指针】智能指针的发展和循环引用的原理和解决

目录 1.RAIl(智能指针的雏形) 2.拷贝导致的问题以及智能指针发展历史 2.1拷贝的问题(资源被析构两次) 2.2auto_ptr(资源权转移,不建议使用) 2.3unique_ptr(防拷贝,在不需要拷贝的情况下使用) 2.4share…

【vue】vue-count-to(数字滚动)插件:

文章目录一、效果:二、使用:【1】安装插件【2】案例三、Options四、Functions一、效果: 二、使用: 官方文档: github地址——https://github.com/PanJiaChen/vue-countTo npm地址——https://www.npmjs.com/package/…

在本地PC运行 Stable Diffusion 2.0

Stable Diffusion 2.0在前几天已经发布了,新版本在上一个版本的基础上进行了许多改进。OpenCLIP中新的深度检测和更好的文本到图像模型是主要的改进之一。 有很多的文章介绍了Stable Diffusion 2.0的改进,所以我们就不多介绍了,这里我们将介…

30分钟部署一个kubernetes集群【1.17】

作者:李振良 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm init# 将一个 Node 节点加入到当前集群中 $ kubeadm join <Master节点的IP和端口 >1. 安装要求…

.m3u8.sqlite文件转mp4,m3u8.sqlite文件转视频工具(开源免费)

文章目录一、预先准备1. 前提2. 主要思路3. 准备工具二、视频转换实战2.1. 软件下载2.2. TS转MP4工具2.3. 操作流程一、预先准备 1. 前提 如果已经买了课程&#xff0c;是可以下载的&#xff0c;并且腾讯课堂APP里就有下载功能。 2. 主要思路 在APP上下载视频缓存到手机本地…

postgres源码解析41 btree索引文件的创建--1

上述小节讲解了索引文件的物理创建&#xff0c;本篇讲解btree索引元组填充至索引文件的操作。先从数据结构入手&#xff0c;后深入执行流程。 postgres源码解析37 表创建执行全流程梳理–1 postgres源码解析37 表创建执行全流程梳理–2 postgres源码解析37 表创建执行全流程梳理…

详解设计模式:责任链模式

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;也被称为职责链模式&#xff0c;是在 GoF 23 种设计模式中定义了的行为型模式。 责任链模式 是将链中的每一个节点看作是一个对象&#xff0c;每个节点处理的请求不同&#xff0c;且内部自动维护一个下一节点…

降温了好冷,总结下11月

1、这两天广东气温骤降&#xff0c;出门必须加外套了&#xff0c;emmm&#xff0c;不想出门&#xff0c;各位宝宝注意保暖吖&#xff0c;别感冒了。2、这边疫情开始放开了&#xff0c;备好感冒药&#xff0c;锻炼身体&#xff0c;做好预防&#xff0c;靠自己了。3、11月过的真快…

jsp人事考勤管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 人事考勤管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.…

[附源码]计算机毕业设计基于Springboot的花店售卖系统的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【45-线程的实现方式-线程池的创建方式-线程池的执行顺序-CompletableFutrue异步处理】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

物联网毕设 -- 基于STM32的心率检测

目录 前言 1 演示视频 一 连线图 1. 原理图 2.功能概括 二 底层代码使用方式 1. 下载程序 2. 查看云平台数据 三 APP使用方式 1. 下载APP 2. 配对蓝牙 四 网盘链接 前言 分享一个之前做到心率监测项目&#xff0c;有APP端有OLED显示端&#xff0c;我会把把他放…

Windows搭建web站点:免费内网穿透发布至公网 1-2

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

[附源码]Python计算机毕业设计Django软考刷题小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

ssm项目整合,简单的用户管理系统

ssm项目整合&#xff0c;简单的用户管理系统项目概述项目搭建创建项目1.创建maven项目2.导入项目依赖及maven资源过滤设置3.添加web支持4.配置tomcat5.配置web发布依赖jar包6.数据库的表创建7.实体类创建7.1 lombok常用注解:dao层1.daoMapper接口创建2.Mapper.xml配置文件3.myb…