一个简单的步骤让你的 Python 代码更干净

122 篇文章 0 订阅
65 篇文章 0 订阅

说起来容易做起来难,我们都知道代码可读性非常重要,但是写的时候总是随心所欲,不考虑类型提示、import 排序、PEP8 规范。今天分享一个小技巧,通过一个简单的步骤就可以让你的 Python 代码更干净。

如果你正在学习Python并且找不到方向的话可以试试我这一份学习方法+籽料呀! 点击 领取(不要米米)

这就是 pre-commit:

可以让你的代码提交之前自动检查是否符合你想要的规范。

使用之前,先 pip 安装一下:

pip install pre-commit

然后在项目的根目录下创建两个文件:.pre-commit-config.yaml 和 pyproject.toml。

.pre-commit-config.yaml 文件内容如下:

exclude: _pb2\.py$
repos:
  - repo: https://github.com/psf/black
    rev: 22.3.0
    hooks:
      - id: black
        args: [--skip-string-normalization]
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.0.1
    hooks:
      - id: check-docstring-first
      - id: check-json
      - id: check-merge-conflict
      - id: check-yaml
      - id: debug-statements
      - id: end-of-file-fixer
      - id: trailing-whitespace
      - id: requirements-txt-fixer
  - repo: https://github.com/pre-commit/pygrep-hooks
    rev: v1.9.0
    hooks:
      - id: python-check-mock-methods
      - id: python-use-type-annotations
  - repo: https://github.com/pre-commit/mirrors-mypy
    rev: "v0.910"
    hooks:
      - id: mypy
        args:
          [
            --ignore-missing-imports,
            --warn-no-return,
            --warn-redundant-casts,
            --disallow-incomplete-defs,
          ]
        additional_dependencies: [types-all]
  - repo: https://github.com/PyCQA/isort
    rev: 5.9.3
    hooks:
      - id: isort
        args: [--profile, black, --filter-files]

这里面配置了 black、mypy、check-docstring-first、isort 等工具,id 就是对应的工具,可以说这个配置文件基本上就够用了。

在 .pre-commit-config.yaml 文件中,我们可以指定将使用哪些挂钩,在 pyproject.toml 中,我们可以为这些单独的钩子指定参数。

pyproject.toml 文件内容如下:

[tool.black]
line-length = 88
target-version = ["py38"]

[tool.isort]
profile = "black"
multi_line_output = 3

这里配置了 black 和 isort 的相关配置。

然后执行在项目的根目录执行 pre-commit install 命令,就可以安装 pre-commit 插件。

然后每次更新代码,提交代码时,这些钩子都会触发,会自动执行如下操作:

  1. 排序 import

  2. PEP8 的格式代码

  3. 检查您的 yaml 和 json 文件的正确性

  4. 类型检查(如果你使用了类型提示)

最后

你可以将这两个文件拷贝到自己的项目根目录中,然后执行一次 pre-commit install,这样每次提交代码的时候,都是干净的代码,是不是很方便?

如果你是准备学习Python或者正在学习(想通过Python兼职),下面这些你应该能用得上: 【点击这里】领取!

 

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

① Python所有方向的学习路线图,清楚各个方向要学什么东西

② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析

③ 100多个Python实战案例,学习不再是只会理论

④ 华为出品独家Python漫画教程,手机也能学习

⑤ 历年互联网企业Python面试真题,复习时非常方便****

当然可以!实现一个基于模型的真空吸尘器代理需要用到强化学习的知识,以下是一个简单的实现示例: 首先,需要安装 OpenAI Gym 和 TensorFlow 等相关依赖库。 接下来,定义一个代理类,这个代理类将用于训练智能体和执行动作。在这个类中,我们需要定义以下方法: - `__init__(self, env)`: 初始化函数,其中 env 是我们要训练的环境对象。 - `act(self, state)`: 根据状态执行动作的函数,该函数接收当前状态 state 作为输入,并返回智能体要执行的动作。 - `learn(self, state, action, reward, next_state, done)`: 根据当前状态、动作、奖励、下一个状态和是否结束的标志学习智能体的函数。 以下是一个可能的实现示例: ```python import gym import tensorflow as tf class VacuumAgent: def __init__(self, env): self.env = env self.model = tf.keras.models.Sequential([ tf.keras.layers.Dense(32, input_shape=(env.observation_space.shape[0],), activation='relu'), tf.keras.layers.Dense(16, activation='relu'), tf.keras.layers.Dense(env.action_space.n, activation='softmax') ]) self.optimizer = tf.optimizers.Adam(lr=0.001) def act(self, state): action_probs = self.model.predict(state) action = tf.random.categorical(action_probs, 1)[0, 0] return action.numpy() def learn(self, state, action, reward, next_state, done): with tf.GradientTape() as tape: action_probs = self.model(state, training=True) log_probs = tf.math.log(tf.reduce_sum(action_probs * tf.one_hot(action, self.env.action_space.n), axis=1)) loss = -log_probs * reward if done: loss += 0.1 * tf.math.log(tf.reduce_sum(action_probs, axis=1)) grads = tape.gradient(loss, self.model.trainable_variables) self.optimizer.apply_gradients(zip(grads, self.model.trainable_variables)) ``` 在上面的代码中,我们定义了一个基于神经网络的模型,并使用随机策略选择动作。在 learn 函数中,使用策略梯度方法对模型进行训练。 接下来,我们需要定义一个环境类,用于模拟真空吸尘器的操作。在这个类中,我们需要定义以下方法: - `__init__(self, room_size)`: 初始化函数,其中 room_size 是房间的大小,用于初始化房间状态。 - `reset(self)`: 重置房间状态,返回初始状态。 - `step(self, action)`: 执行指定动作,返回下一个状态、奖励和是否结束的标志。 以下是一个可能的实现示例: ```python class VacuumEnv(gym.Env): def __init__(self, room_size): self.room_size = room_size self.observation_space = gym.spaces.Box(low=0, high=1, shape=(room_size,)) self.action_space = gym.spaces.Discrete(2) self.state = np.zeros(room_size) for i in range(room_size): if np.random.rand() < 0.5: self.state[i] = 1 def reset(self): self.state = np.zeros(self.room_size) for i in range(self.room_size): if np.random.rand() < 0.5: self.state[i] = 1 return self.state def step(self, action): if action == 0: reward = -1 else: if self.state.sum() == 0: reward = 1 else: reward = 0 self.state = np.roll(self.state, -1) self.state[self.room_size-1] = 0 done = (self.state.sum() == 0) return self.state, reward, done, {} ``` 在上面的代码中,我们定义了一个简单的房间环境,并实现了真空吸尘器的操作。当真空吸尘器执行动作 0 时,会获得负奖励;当执行动作 1 时,会获得正奖励(如果房间已经干净)或零奖励(如果房间还有灰尘)。 最后,我们可以使用以下代码来训练我们的代理: ```python env = VacuumEnv(10) agent = VacuumAgent(env) for i in range(1000): state = env.reset() done = False while not done: action = agent.act(state) next_state, reward, done, _ = env.step(action) agent.learn(state, action, reward, next_state, done) state = next_state ``` 在上面的代码中,我们使用简单的 for 循环进行训练,每次循环都重置环境,并执行若干个动作,直到环境结束。在每个步骤中,我们调用代理的 act 方法来获取要执行的动作,并调用 learn 方法来学习智能体的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值