From 527d3b655a1fafc676f98b26e012c6140fd75048 Mon Sep 17 00:00:00 2001 From: 100gle <569590461@qq.com> Date: Sat, 19 Nov 2022 11:21:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=8A=80=E8=83=BD?= =?UTF-8?q?=E6=89=A9=E5=B1=95N6=E4=B8=80=E7=AB=A0=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/newsletter/N6/method_chaining.ipynb | 351 +++++++++++++++++++++++ 1 file changed, 351 insertions(+) create mode 100644 code/newsletter/N6/method_chaining.ipynb diff --git a/code/newsletter/N6/method_chaining.ipynb b/code/newsletter/N6/method_chaining.ipynb new file mode 100644 index 0000000..b98d209 --- /dev/null +++ b/code/newsletter/N6/method_chaining.ipynb @@ -0,0 +1,351 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "source": [ + "# 链式调用示例" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + }, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [ + { + "data": { + "text/plain": " date\n0 2022-01-02\n1 2022-01-09\n2 2022-01-16\n3 2022-01-23\n4 2022-01-30", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
date
02022-01-02
12022-01-09
22022-01-16
32022-01-23
42022-01-30
\n
" + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.DataFrame(dict(date=pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")))\n", + "data.head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [ + { + "data": { + "text/plain": " date year month day year_month\n0 2022-01-02 2022 01 02 202201\n1 2022-01-09 2022 01 09 202201\n2 2022-01-16 2022 01 16 202201\n3 2022-01-23 2022 01 23 202201\n4 2022-01-30 2022 01 30 202201", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
dateyearmonthdayyear_month
02022-01-0220220102202201
12022-01-0920220109202201
22022-01-1620220116202201
32022-01-2320220123202201
42022-01-3020220130202201
\n
" + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"date\"] = data[\"date\"].astype(str)\n", + "data[\"year\"] = data[\"date\"].map(lambda s: s.split(\"-\")[0])\n", + "data[\"month\"] = data[\"date\"].map(lambda s: s.split(\"-\")[1])\n", + "data[\"day\"] = data[\"date\"].map(lambda s: s.split(\"-\")[2])\n", + "data[\"year_month\"] = data[\"year\"].str.cat(data[\"month\"])\n", + "data.head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "## 第一种重构方式" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "source": [ + "data = (\n", + " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n", + " .astype({\"date\": \"str\"})[\"date\"]\n", + " .str.split(\"-\", expand=True)\n", + " .rename(\n", + " columns={\n", + " 0: \"year\",\n", + " 1: \"month\",\n", + " 2: \"day\",\n", + " }\n", + " )\n", + " .assign(\n", + " date=lambda df: df.apply(lambda r: \"-\".join(r.tolist()), axis=1),\n", + " year_month=lambda df: df[\"year\"].str.cat(df[\"month\"]),\n", + " )\n", + ")\n", + "data.head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + }, + "execution_count": 4, + "outputs": [ + { + "data": { + "text/plain": " year month day date year_month\n0 2022 01 02 2022-01-02 202201\n1 2022 01 09 2022-01-09 202201\n2 2022 01 16 2022-01-16 202201\n3 2022 01 23 2022-01-23 202201\n4 2022 01 30 2022-01-30 202201", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
yearmonthdaydateyear_month
0202201022022-01-02202201
1202201092022-01-09202201
2202201162022-01-16202201
3202201232022-01-23202201
4202201302022-01-30202201
\n
" + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## 第二种重构方式" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [ + { + "data": { + "text/plain": " year month day date year_month\n0 2022 01 02 2022-01-02 202201\n1 2022 01 09 2022-01-09 202201\n2 2022 01 16 2022-01-16 202201\n3 2022 01 23 2022-01-23 202201\n4 2022 01 30 2022-01-30 202201", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
yearmonthdaydateyear_month
0202201022022-01-02202201
1202201092022-01-09202201
2202201162022-01-16202201
3202201232022-01-23202201
4202201302022-01-30202201
\n
" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = (\n", + " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n", + " .astype({\"date\": \"str\"})[\"date\"]\n", + " .str.extract(r\"(?P\\d{4})-(?P\\d{2})-(?P\\d{2})\")\n", + " .assign(\n", + " date=lambda df: df.apply(lambda row: \"-\".join(row.tolist()), axis=1),\n", + " year_month=lambda df: df[\"year\"].str.cat(df[\"month\"]),\n", + " )\n", + ")\n", + "\n", + "data.head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "## 第三种重构方式" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "data": { + "text/plain": " date year month day year_month\n0 2022-01-02 2022 01 02 202201\n1 2022-01-09 2022 01 09 202201\n2 2022-01-16 2022 01 16 202201\n3 2022-01-23 2022 01 23 202201\n4 2022-01-30 2022 01 30 202201", + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
dateyearmonthdayyear_month
02022-01-0220220102202201
12022-01-0920220109202201
22022-01-1620220116202201
32022-01-2320220123202201
42022-01-3020220130202201
\n
" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = (\n", + " pd.DataFrame({\"date\": pd.date_range(\"20220101\", \"20220201\", freq=\"1W\")})\n", + " .assign(\n", + " year=lambda df: df[\"date\"].dt.year,\n", + " month=lambda df: df[\"date\"].dt.month.astype(str).str.zfill(2),\n", + " day=lambda df: df[\"date\"].dt.day.astype(str).str.zfill(2),\n", + " year_month=lambda df: df[\"date\"].dt.strftime(\"%Y%m\"),\n", + " )\n", + " .astype(str)\n", + ")\n", + "data.head()" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "markdown", + "source": [ + "# 链式调用的实现原理以及优劣" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%% md\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 7, + "outputs": [], + "source": [ + "class Command:\n", + " def __init__(self, name=None):\n", + " self.name = name\n", + "\n", + " def set_options(self, **kwargs):\n", + " for k, v in kwargs.items():\n", + " if not hasattr(self, k):\n", + " setattr(self, k, v)\n", + " return self\n", + "\n", + " def parse(self):\n", + " opts = [f\"{v}\" for k, v in self.__dict__.items() if k != \"name\"]\n", + " final = \" \".join([self.name, *opts])\n", + " return final\n", + "\n", + " def __repr__(self):\n", + " opts = [f\"{k}={v}\" for k, v in self.__dict__.items() if k != \"name\"]\n", + " return f\"Command\"" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [], + "source": [ + "cmd = Command(\"curl\").set_options(verbose=\"-v\").set_options(target=\"sspai.com\")" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Command\n" + ] + } + ], + "source": [ + "print(cmd)" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": 10, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "curl -v sspai.com\n" + ] + } + ], + "source": [ + "print(cmd.parse())" + ], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false, + "pycharm": { + "name": "#%%\n" + } + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file