0%

  • 缘起
    • 日志与函数计时功能的实现
    • 学弟问起此话题,自己也感到初学时颇费功夫.
  • 背景
    • 返回同类指针: 装饰器本质只是函数or类, 唯一不同之处只在于返回值是函数指针or类指针
    • @符号: 装饰器的”@”符号没什么特别, 完全等价于(目标函数定义好后)把目标函数作为实参传进装饰器(再赋值给函数变量)
      • 装饰-赋值: bar=decorator(bar)
      • 调用装饰后函数: bar()
    • “插件”本质: 其他函数与装饰器关系独立, 装饰器执行不依赖也不影响其他函数的功能.
  • Demo理解
# 函数实体的存在是既定的, 不依赖于特定函数名.
import copy

def greet(name):
return 'Nice to meet you, '+name

print(greet)
# out: <function greet at 0x00000259C5FAD1E0>
## 函数实体已建立, 是<function greet at 0x00000259C5FAD1E0>
## 此时, greet仅仅是一个变量名, 一个函数指针, 它指向的函数对象是<function greet at 0x00000259C5FAD1E0>

sayNiceToMeetYou=greet
# python默认是浅复制, 事实上sayNiceToMeetYou与greet指向同一个对象, 该对象类型是函数

print(id(sayNiceToMeetYou),id(greet))
## out: 1980378239456 1980378239456, 符合假设

del greet

print(sayNiceToMeetYou('lkr'))
# out: Nice to meet you, lkr, 说明仅仅删除指针, 函数实体并没有被删除

## 正戏开始

def decorator(func):
def wrapper_who_return_funcPtr():
# 返回参数列表: `https://web.archive.org/web/20210512042121/https://www.cnblogs.com/snow-backup/p/11077917.html`
# inspect库: `https://web.archive.org/web/20220605125226/https://docs.python.org/3/library/inspect.html`
print('before {} works.'.format(decorator.__code__.co_varnames[0]))
func()
print('After {} works.'.format(decorator.__code__.co_varnames[0]))
return wrapper_who_return_funcPtr

decorator(sayNiceToMeetYou)

# d_sayNiceToMeetYou=copy.deepcopy(sayNiceToMeetYou)
# # print(id(sayNiceToMeetYou),id(d_sayNiceToMeetYou))
## out: 2303771464160 2303771464160, 没有新对象生成, 难道深拷贝也出了问题吗?
## 答案找到了: `https://web.archive.org/web/20220525023657/https://docs.python.org/3.7/library/copy.html` 搜索"It does “copy” functions and classes (shallow and deeply), by returning the original object unchanged"

阅读全文 »

  • 缘起
  • 结论
    • import搜索目录为sys.path这个列表
      • 由于是列表所以可以更改, 比如加入github.io文件夹什么的
      • sys.path的改变不跨文件, 可以拿两个py文件自己试下
    • 使用M模块中途M模块被修改, 使用imp.reload(module)进行模块的重新导入
      • 质疑: 是否本就不应该在使用某个模块的中途去修改这个模块
      • 全模块导入时存在模块依赖: 如果M模块自身也import了其他模块M1,M2, 那么这些M1,M2并不会被导入: 详见python全模块reload的坑
    • 避免循环引用
      • 循环引用: 存在a.py与b.py, 此时a.py中写import b同时b.py中写import a
      • 设计观点: “类-接口”模式的重要性, 包括:
        • 类C1,C2,C3…不互相import对方
        • import工作完全由接口实现, 接口I1,I2也要做到相对独立

以前没有使用标准指法, 导致打字速度无法提升. 由于近期较为清闲, 于是开始着手练习打字, 一是为了日后代码能够勤写注释, 二是为了考托福.

训练网站: keybr.com; 感谢知乎小伙伴@何明涛;

阅读全文 »

  • 缘起

  • 背景

    • 众所周知, python默认进行浅拷贝, 而深拷贝需要动用copy模块下的copy.deepcopy
    • 深浅拷贝的实质区别在于是否生成了新的对象, 深拷贝生成了新的对象, 浅拷贝在同一个对象上增加了一个引用
    • 不同对象可以由id进行区分
  • 结论

    • deepcopy作用于容器时, 深拷贝是递归进行的
    • copy.copy作用于容器时
      • 容器是可变对象, 此时copy.copy只对第一层进行深拷贝, 其余浅拷贝
      • 容器是不可变对象, 此时copy.copy对容器整体进行浅拷贝
  • 演示

import copy
# l for list

l1,l2=[1,2,3],[1,2,3]
print('l1:{};\tl2:{}'.format(id(l1),id(l2)))
l12=[l1,l2]

d_l12=copy.deepcopy(l12)

print('l12:{};\td_l12:{}'.format(id(l12),id(d_l12))) # deepcopy外壳实现了深拷贝
print('l1:{};\tl12元素0:{};\td_l12元素0:{}'.format(id(l1),id(l12[0]),id(d_l12[0]))) # deepcopy内部元素同样也实现了深拷贝:l12的元素0就是l1对象本身; 而d_l12元素0不是l1对象
# 由于l2也是同样的情况, 所以就不演示了

# cc for copy_copy obj

cc_l12=copy.copy(l12)

print('l12:{};\tcc_l12:{}'.format(id(l12),id(cc_l12))) # 对l12可变对象: copy.copy外壳实现了深拷贝
print('l1:{};\tl12元素0:{};\tcc_l12元素0:{}'.format(id(l1),id(l12[0]),id(cc_l12[0]))) # copy.copy内部元素仅仅实现了浅拷贝:l12的元素0就是l1对象本身; 而cc_l12元素0也是l1对象本身

# t for tuple
t12=(l1,l2)
cc_t12=copy.copy(t12)
print('t12:{};\tcc_t12:{}'.format(id(l12),id(cc_l12))) # 对t12可变对象: copy.copy外壳仅实现浅拷贝
print('l1:{};\tt12元素0:{};\tcc_t12元素0:{}'.format(id(l1),id(l12[0]),id(cc_l12[0]))) # copy.copy内部元素也仅仅实现了浅拷贝:t12的元素0就是l1对象本身; 而cc_t12元素0也是l1对象本身
阅读全文 »

  • 缘起
    • 办理移动业务时, 通过往日流水发现自己每月账单是88元,多花了不少冤枉钱.
    • 办理移动业务途中, 使用百度地图搜索营业厅, 到目的地后才发现没有开门.
    • 办理移动业务时, 产生”一体化”想法

  • 缘起:

    • 前文我们尝到了函数化的甜头, 于是我们考虑”处处函数化”的方案
  • 思路:

    • alias要保留, 函数可以实现复合功能, 但是单一功能还得由alias负责, 这些单一功能是不能被革命的
    • 函数直接写在bashrc里面, 一共就没几个函数, 但是注释要写好
  • 流程:

    • 设计两个函数, uguh(upload github & upload hexo)和ohn(outside hexo new)
    • 传参是字符串最好用变量接收一下, 增强可读性github自动上传脚本
  • 图示

  • 流程:

  • 图示

  • 建议

    • 勤用alias(常用的cd命令什么的建议全部装进去), 真的好用, 我已经用疯了(^_^)
  • 感想

    • 人们常说的肉食者鄙, 事实上有一定道理, 我不信一群权威的bash专家, 会没有想到我这个bash小白都能想出来并搞定的问题
    • 香港动乱,历史或将继续增添些许无辜者的鲜血,这种日常一脉相承了上下五千年, 全部被预言中了呀,黑格尔这个糟老头子真是坏得很!

  • 缘起:

    • 在windows平台下,由教程善用佳软winr, 我们知道可以利用winr唤醒gitbash(我记为gb), 但是进入gitbash后当前目录往往并不是工作目录, 需要cd几轮进行跳转,这件事很烦人.
  • 思路

    • 由listary的”路径复制”功能, 可以迅速获得某个文件的地址(或者其所在文件夹) 举例:
      • 这个路径显然是windows-style的路径, 但是我们需要的是unix like的路径才能直接在git bash里面cd {some unix-like path}这样子
    • 既然我们可以轻松地复制得到一个 windows-like的路径, 类似这样:{D:\备份地点\文档资料备份地点\cmBooks\Cpp\风浦可符香.jpg}, 那么有没有一个path conversion, 能够接受windows-path, 然后返回Unix-path的呢?
    • 倘若有,windows-path我们先convert成为unix-path, 然后直接把unix-path传给cd就可以了
  • 资料 & 分析

  • 举例分析

    • 要访问这个文件夹:{D:\备份地点\文档资料备份地点\cmBooks\Cpp}
    • 首先listary获取路径(过于简单,省略), 此时路径已经在我们的剪贴板中了
    • git bash下
      • wp=’D:\备份地点\文档资料备份地点\cmBooks\Cpp’
      • up=$(echo “/$wp” | sed -e ‘s/\///g’ -e ‘s/://‘)
        • 注意这个$wp前面的backslash不能省略!
      • cd $up, 大功告成
    • 一图胜千言:
  • 反思

    • 能不能利用alias或者自定义函数对这个进行直接调用呢?
  • 感想

    • 很久以前我在github的git-for-windows下面问了一圈,没人鸟我,这个如此简单的痛点竟然没人解决,妈的.
    • 每天我都要一遍遍告诉自己不是一个天才, 真累啊~
  • 参考信息截图(不po了, 就是一个记录而已)已存储

发现知乎的回答许多被删除了,此时纵使拿着网址也无法访问这些资源,可见仅仅保存网址是不安全的,毕竟删除网站的主动权不在我方手中.
知乎有位义士提供了”截图”这个办法蛏子圣子,可谓大道至简.
今后任何的博客教程和网站信息, 我都会立刻进行截图保存,做到”截图”和”网址”的两手抓.

  • hexo next代码块一键复制教程如下:

    • 感谢小哥恬雅过客的帮助.
    • 使用fast stone capture进行博文滚动截图, 截图如下: (利用前文中的”标签插件语法”)
  • 警示:

    • 每次对”环境文件”进行内部修改的时候,一定要有两个意识
      • 替身意识: 对象文件副本创建与备份
      • 独立化意识: 保存”修改前后”到一个独立文件中, 例如, {修改前(2019年8月14日11:21:07):{…}; 修改代码为{…}.}, 理由是:
        • 防备后患: 替身只能防止当前的出错, 但是有的问题是很久后才会暴露的
        • 便于移植: 其他电脑有相似需求, 可以立刻移植
        • 版本控制: ^举例^
          • 做过3次修改, 现在报错是哪一次导致的呢? 我们就可以根据这个独立的文件进行观察&有序进行版本回退.
阅读全文 »

  • 要求是:

    • 文章中必须能显示(ok)
    • 首页最好可以显示(ok)
  • 方法:

    1. source文件夹下新建images文件夹, 把所有图片放在此处
      • 日后图片多了, 可能要多设一个子文件夹, 道理一样
      • 把图片放入images文件夹下
    2. markdown语法采用绝对路径
      • 问题:能不能使用win风格的路径(例如D:/images/图片3.jpg)呢?
      • 绝对路径的引用语法
  • 参考网站: