近期文章

Python 2018-05-26

python学习笔记系列

摘录《流畅的python》书中前言部分作为本篇文章开头:

受其他语言的影响,你大概能猜出python会支持正则表达式,然后就回去查阅文档。但如果你从来没有见过元组拆包,也没有听过描述符这个概念,那么估计你也不会特地去搜索它们,然后就永远失去了使用这些python独有的特性的机会。

使用python也有好一段时间了,正如上面那段话所说,对于python只是了解其中的基本用法,对于一些高级的语法很不熟悉,正好最近事情都趋于稳定,也可以静下心来从头到尾真正的学习下python这门语言了。从开始看《流畅的python》这本书之后,深感自己以前对python认知的浅薄,写出来的代码很不Pythonic。本着边看书变做笔记的道理,我将会把阅读该书的笔记和理解记录下来,所以会有一个系列的笔记,这篇文章就作为是目录,后续会持续更新。

目录:

努力

Python 2018-05-26

python的一等函数

在Python中,函数是一等对象,而一等对象的定义是满足下述条件的程序实体:
- 在运行时创建 - 能赋值给变量或数据结构中的元素 - 能作为参数传递给函数 - 能作为函数的返回结果

我们通过下面的例子来证明python中的函数是对象:

>>> def factorial(n):
...     '''return n!'''
...     return 1 if n < 2 else n * factorial(n-1)
...
>>> factorial(41)
33452526613163807108170062053440751665152000000000
>>> factorial.__doc__
'return n!'
>>> type(factorial)
<class 'function'>

在第三行就可以看出,factorial是一个类的示例,另外再看看下面的例子可以看出,python中的函数满足上面所讲的一等对象定义的要求:

>>> fact=factorial
>>> fact
<function factorial at 0x10d6daea0>
>>> fact(5)
120
>>> map(factorial,range(11))
<map object at 0x10d5e9c88>
>>> list(map(factor...
Python 2018-05-05

Python中的字典和集合

Python标准库中的所有映射类型都是使用dict来实现的,因此他们都有一个共同的限制,即只有可散列的数据类型才可以作为映射的键,那么什么是可散列的数据类型呢?下面介绍下:
在python词汇表中,关于可散列类型的定义有这么一段话:

如果一个对象是可散列的,那么在这个对象的生命周期中,他的可散列值是不变的,而且这个对象需要实现__hash__()方法。另外可散列对象还要有__eq__()方法,这样才可以和别的键做比较,如果两个可散列对象的值是相等的,那么他们的散列值一定是相等的。

原子不可变数据类型(strbytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozonset里只能容纳可散列类型。元组的话,只有当一个元组敖汉的所有元素都是可散列类型的情况下,它才是可散列的。一般来讲,用户自定义的类型都是可散列的,散列值就是他们的id()函数返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象内部实现了__eq__方法并且在方法内部用到了这个对象的内部状态的话那么只有当所有内部状态都是不可变的情况下,这个对象才是可散列的。

处理找不到的键

当字典d[k]找不到正确的键时,Python会抛出异常,虽然我们可以使用d.get(k,default)来代替d[k],给找不到的键一个默认的返回值,但是在更新时候,效率还是很低的,在这种情况...

Python 2018-05-01

Python中的序列

内置序列类型概述:

Python标准库使用C实现了丰富的序列类型,列举如下:

  • 容器序列
    listtuplecollsctions.deque这些序列能存放不同的数据类型。
  • 扁平序列
    str,bytes,bytearray,memoryview和array.array,这些序列只能存放一种类型。

容器序列存放的是他们所包含的任意类型的对象引用,而扁平序列存放的是值而不是引用,也就是说,扁平序列其实是一段连续的内存空间,因此扁平序列其实更加紧凑,但是他们里面只能存放例如字符,字节和数值这种基础类型。
序列类型还可以按照是否可以修改赖分类。
- 可变序列
listbytearrayarray.array,collections.dequememview - 不可变序列
tuplestrbytes

列表推导和生成器表达式

虽然都可以使用列表推导赖初始化元组,数组或其他序列类型,但是生成器表达式是更好都选择,因为生成器表达式背后遵循了迭代器都协议,可以逐个的产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数中。 下面分别是列表推导和生成器表达式的简单示例:

>>>vals=range(10)
>>>[s for s in vals if s>5]
[6, 7, 8, 9]
>>>tuple(s for s in vals if s>5)
(...
Linux 2018-04-30

tmux 简介

以前只是听说过tmux的大名,但是一直没有用过,今天试用了下发现简直是神器,再也不用傻傻的开窗口了,一个窗口就可以搞定了。

Tmux 简单来说就是终端里的『窗口管理器』,如果我使用终端登录到远程主机并运行前台程序,那么这个窗口等于就被占用了,想要看一下 CPU 的使用率,就得再连接一次。但是如果在远程主机上运行 tmux,那么就可以开启多个控制台(类似于窗口),相当高效。而窗口管理只是 tmux 功能的一小部分,另一个很有用的功能就是,连接到远程主机之后,一旦断开,那么当前账户登录的任务就被取消了,但是使用 tmux 可以在断开之后继续工作,下次登录可以查看,功能有点类似于screen。其他的功能还有: - 窗口切换,每个窗口里还可以分割面板 - 配置方便,可以使用脚本 - 类似 vim 的双层操作逻辑 - 复制粘贴缓冲区

安装的话也很简单,在 mac 下直接 brew install tmux(前提需要安装 homebrew),ubuntu 下则直接 sudo apt-get install tmux 在终端中输入tmux就可以打开一个新的 tmux session,tmux 的所有操作必须先使用一个前缀键(默认是 ctrl + b)进入命令模式,或者说进入控制台,就像 vim 中的 esc。

下面列出了一些常用的基本操作:

信息查询

  • tmux list-ke...
8456 0
猿来如此 2018-04-21

Ajax跨域请求

首先说明下什么是跨域?其实就是两个不同的站,比如a.abc.com,另外一个b.abc.com。a站需要请求b站的接口,这时就发生了跨域,那么跨域一般是怎么解决的呢?下面简单介绍下。

通过jsonp跨域

什么是jsonp?维基百科的定义是:JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。 JSONP也叫填充式JSON,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON,例如:

callback({"name","trigkit4"});

JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。

在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 例如:

<script type="text/javascript">
    function dosomething(jsondata){
        //处理获得的json数据
    }
</script>
<script src="http://example.com/data.php?callback=dosomething"></script>...
发现更多