Pandora's box

Supo's Blogs


  • 首页

  • 归档

锦绣民俗村

发表于 2018-09-12 | 更新于 2018-09-22

P1




python中的骚操作

发表于 2018-09-12 | 更新于 2018-09-22

Python的魅力

Python是一个给人持续惊喜的编程语言,在读python代码的时候,读着读着就会发现,python还可以这样使用。本文用来收集python 的奇葩语法的。

1. lambda语法

lambda 是一行没有名字的函数,也称为匿名函数,在C++中也有这种语法。其具体用法为:

1
lambda params:f(params)

例如

1
2
z = lambda x,y:(x+y)
z(1,2) ==>3

还有一些其他特殊用法如

1
2
a = [(1,2),(5,6),(3,4),(6,2)]
a.sort(key=lambda x:x[1])

列表并行排序

1
2
3
data = zip(list1, list2)
data = sorted(data)
list1, list2 = map(lambda t: list(t), zip(*data))

2. b if c else d

相当于C++中 c?b:d,可用于任何判断一个表达式,而取两个值得情况
如:

1
2
$ a = 46
$ print(a,"is","even" if a%2==0 else "odd")

3. a = [b for _ in range(c)]

1
2
3
4
for … in … 产生的是一个generator,迭代生成一个列表,有趣的是可以与if else连用
l1 = [1,3,2,-1,-2,-3]
l2 = [x if x >0 else 0 for x in l1]
l2 = [1,3,2,0,0,0]

4. generator

深度剖析generator

5. python定义的系统标识符

  • 5.1 Class1.__name__ # 类型名称 ‘Class1’
  • 5.2 Class1.__module__ # 类型所在模块 ‘main‘
  • 5.3 Class1.__bases__ # 类型所继承的基类 (,)
  • 5.4 Class1.__dict__ # 类型字典,存储所有类型成员信息。
  • 5.5 Class1().__class__ # 类型
  • 5.6 Class1().__module__ # 实例类型所在模块 ‘main‘
  • 5.7 Class1().__dict__ # 对象字典,存储所有实例成员信息。 {‘i’: 1234}
  • 5.8 __repr__ #名称的官方输出
  • 5.9 __version__ 版本

6. __init__.py

放在文件夹内可以把文件夹名字作为类导入

7. map

map会根据给定的函数对指定的序列做映射
map(function, iterable)

1
2
3
4
5
6
7
8
9
10
11
>>>def square(x) :            # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]

# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

初步了解正则表达式

发表于 2018-09-10

初步了解正则表达式

什么是正则表达式

正则表达式(regular expression), 英文可以简写为regex、regexp,由一系列字符组成,表达一种可以被搜索、匹配、替换、删除的模式。正则表达式是对字符串和特殊字符操作的一种逻辑,通过一些事先定义好的符号来表达一种模式。
正则表达式常应用于文本检索、数据处理等领域,以前在写爬虫的时候还有学linux shell的时候遇到过正则表达式,但从来没用真正弄懂什么是正则表达式。这一次系统学习一下,以下内容多源自百度百科或维基百科。

理解元字符

元字符 描述 组别
\ 将下一个字符标记符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配\n。“\n”匹配换行符。
^ 匹配输入字行首。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
$ 匹配输入行尾。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
* 匹配前面的子表达式任意次。例如,zo能匹配“z”,也能匹配“zo”以及“zoo”。等价于{0,}。
+ 匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”。?等价于{0,1}。
{n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
{n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
{n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格
? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’]
.点 匹配除“\n”和”\r”之外的任何单个字符。要匹配包括“\n”和”\r”在内的任何字符,请使用像“[\s\S]”的模式。
(pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“(”或“)”。
(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分时很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
(?=pattern) 非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern) 非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如“Windows(?95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern) 非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。“(\?<=95|98|NT|2000)Windows”目前在python3.6中re模块测试会报错,用“|”连接的字符串长度必须一样,这里“95|98|NT”的长度都是2,“2000”的长度是4,会报错。
(\?\<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<|95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。这个地方不正确,有问题此处用或任意一项都不能超过2位,如“(?\<95|98|NT|2000)Windows正确,“(?\<95|98|NT|2000)Windows 报错,若是单独使用则无限制,如(?<!2000)Windows 正确匹配。同上,这里在python3.6中re模块中字符串长度要一致,并不是一定为2,比如“(?\<95|98|NT|2000)Windows”也是可以的。
x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”(此处请谨慎)。“[zf]ood”则匹配“zood”或“food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b 匹配一个单词边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
\B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d 匹配一个数字字符。等价于[0-9]。grep 要加上-P,perl正则支持
\D 匹配一个非数字字符。等价于[^0-9]。grep要加上-P,perl正则支持
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
\S 匹配任何可见字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。类似但不等价于“[A-Za-z0-9_]”,这里的”单词”字符使用Unicode字符集。
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
\xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。
\num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml 如果n为八进制数字(0-7),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(\©)。
\p{P} 小写 p 是 property 的意思,表示 Unicode 属性,用于 Unicode 正表达式的前缀。中括号内的“P”表示Unicode 字符集七个字符属性之一:标点字符。其他六个属性:L:字母;M:标记符号(一般不会单独出现);Z:分隔符(比如空格、换行等);S:符号(比如数学符号、货币符号等);N:数字(比如阿拉伯数字、罗马数字等);C:其他字符。*注:此语法部分语言不支持,例:javascript。
\< > 匹配词(word)的开始(\<)和结束(>)。例如正则表达式\<the>能够匹配字符串”for the wise”中的”the”,但是不能匹配字符串”otherwise”中的”the”。注意:这个元字符不是所有的软件都支持的。
( ) 将( 和 ) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
| 将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配”it belongs to him”和”it belongs to her”,但是不能匹配”it belongs to them.”。注意:这个元字符不是所有的软件都支持的。

常见pattern

1
$ (?<=\.) {2,}(?=[A-Z])

At least two spaces are matched, but only if they occur directly after a period (.) and before an uppercase letter.

github个人博客搭建

发表于 2018-09-09 | 更新于 2019-10-04

写在前面

一直想在网上配置一个自己的博空间,方法有很多,可以自己搭建一个服务器,需要独立IP、还需要找宽带运营商开放端口,最重要的是要有一个服务器。也可以购买云端服务器,试过腾讯云的,没几天,腾讯云一直给我发,网址要在公安局备案,我一个博客不要玩这么大吧。当然也可以在CSDN之类的网站上发博客,但不喜欢自己博客周围有广告,也不喜欢千篇一律的样式。后来知道GitHub上可以建立一个博客空间,看过几个国外大神也是通过GitHub发布文章的,看起来十分高档,当然人家的技术文章写的也好。我也尝试在GitHub上建立自己的博客,但坑还真不少,好在国内有大量的教程教你如何搭建。但这些博客都是教你如何一步一步操作,对于我这种连node.js都不知道的人,看这些教程都是知其然,而不知其所以然。所以我的第一篇博客就是来介绍这些工具的,这样对以后自己写博客都有很大的帮助。

1. Github

Github实际上就是一个代码托管服务器,使用git工具进行版本控制。我们的博客网页的源码是托管在github上的。与GitHub服务器的通信可以通过http协议亦可以通过SSH,而Hexo可以通过SSH将代码上传,因此需要开通github上的SSH权限。
查看权限的命令以及成功的提示:

1
2
3
ssh -T git@github.com
Hi username! You are successfully authenticated, but GitHub does not
provide shell access.

2. Node.js

Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js 不是一个 JavaScript 框架,不同于CakePHP、Django、Rails。Node.js 更不是浏览器端的库,不能与 jQuery、ExtJS 相提并论。Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。
Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。
Hexo是基于node.js的,因此介绍一下

3. npm

npm(全称 Node Package Manager,即“node包管理器”)是Node.js默认的、以JavaScript编写的软件包管理系统。
npm可以管理本地项目的所需模块并自动维护依赖情况,也可以管理全局安装的JavaScript工具。
如果一个项目中存在package.json文件,那么用户可以直接使用npm install命令自动安装和维护当前项目所需的所有模块。在package.json文件中,开发者可以指定每个依赖项的版本范围,这样既可以保证模块自动更新,又不会因为所需模块功能大幅变化导致项目出现问题。开发者也可以选择将模块固定在某个版本之上。

4. Hexo

Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。以下是常用命令:

init

1
$ hexo init [folder]

新建一个网站。如果没有设置 folder ,Hexo 默认在目前的文件夹建立网站。

new

1
$ hexo new [layout] <title>

新建一篇文章。如果没有设置 layout 的话,默认使用 _config.yml 中的 default_layout 参数代替。如果标题包含空格的话,请使用引号括起来。

generate

1
$ hexo generate

生成静态文件。

选项 描述
-d, –deploy 文件生成后立即部署网站
-w, –watch 监视文件变动
该命令可以简写为

1
$ hexo g

publish

1
$ hexo publish [layout] <filename>

发表草稿。

server

1
$ hexo server

启动服务器。默认情况下,访问网址为: http://localhost:4000/。

选项 描述
-p, –port 重设端口
-s, –static 只使用静态文件
-l, –log 启动日记记录,使用覆盖记录格式

deploy

1
$ hexo deploy

部署网站。

参数 描述
-g, –generate 部署之前预先生成静态文件
该命令可以简写为:

1
$ hexo d

render

$ hexo render [file2] …
渲染文件。

参数 描述
-o, –output 设置输出路径
migrate
$ hexo migrate
从其他博客系统 迁移内容。

clean

1
$ hexo clean

清除缓存文件 (db.json) 和已生成的静态文件 (public)。

在某些情况(尤其是更换主题后),如果发现您对站点的更改无论如何也不生效,您可能需要运行该命令。

list

1
$ hexo list <type>

列出网站资料。

version

1
$ hexo version

显示 Hexo 版本。

选项

安全模式

1
$ hexo --safe

在安全模式下,不会载入插件和脚本。当您在安装新插件遭遇问题时,可以尝试以安全模式重新执行。

调试模式

1
$ hexo --debug

在终端中显示调试信息并记录到 debug.log。当您碰到问题时,可以尝试用调试模式重新执行一次,并 提交调试信息到 GitHub。

简洁模式

1
$ hexo --silent

隐藏终端信息。

自定义配置文件的路径

1
$ hexo --config custom.yml

自定义配置文件的路径,执行后将不再使用 _config.yml。

显示草稿

1
$ hexo --draft

显示 source/_drafts 文件夹中的草稿文章。

自定义 CWD

1
$ hexo --cwd /path/to/cwd

自定义当前工作目录(Current working directory)的路径。

5. Next

是一个简洁的Hexo主题,主题配置依然有很多坑要填

6. 博客发布流程

使用编辑器编辑markdown文档,md格式的,我使用atom编辑,使用hexo g转化为网页代码,再用hexo d发布到github,此时就可以在网上看到自己的博客了。有兴趣可以绑定自己的域名,设置主题,回复栏等等。

Hello World

发表于 2018-09-09

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

12

Supo Zhang

I'm A man who constantly to pursue self-breakthrough and not satisfy current situation

15 日志
8 标签
© 2019 Supo Zhang
由 Hexo 强力驱动 v3.7.1
|
主题 – NexT.Gemini v6.4.1