0%

python每日进步

一些关于python的想法。

动态类型

注意python是动态类型而不是弱类型,简单来说python中‘asdf’+1是会报错的,而弱类型如js就可以

urllib2.urlopen和requests.get对比:

  1. 功能一样。urllib2.urlopen是异步调用,requests.get是同步调用,一旦有一个url阻塞住就无法继续往下了。grequests是异步的requests,但是无法取法取得响应信息。
  2. 自定义404界面requests.get可以正常返回页面信息,status_code属性是404等,而urllib2抛出HTTPError异常

打开文件

不要轻易用”w”打开文件,即使你什么也没做,文件也会被清空

性能测试

工具

ipython,原谅我的愚昧无知,我一度以为ipython早就过时了,没想到功能很强大

列表推导和map

老生常谈,sf链接,最好自己运行一遍,毕竟python更新之后性能也许会改变?Windows下如果python -mtimeit -s'xs=range(10)' 'map(hex, xs)'如果报SyntaxError: EOL while scanning string literal的错误的话,多半是因为单引号,改成
python -mtimeit -s"xs=range(10)" "map(hex, xs)"或者python -mtimeit -s'xs=range(10)' 'map(hex,xs)',原因大概是map(hex, xs)中间的空格把这个字符串“截断成为两个参数map(hex,xs)”了。
注意python3中map返回的是一个迭代器,返回列表需要list(map)。参考
答案版本3.5.2和我版本3.6.1很接近就没有重复试验了
可以看出map相对于列表推导有着非常明显的优势,可能是python3对map做了特别的优化(妈蛋我怎么记得map是depricated建议用列表推导和zip替代?)

1
2
3
4
5
6
7
8
9
10
11
%timeit list(map(sum, x_list))
10000 loops, best of 3: 161 µs per loop

%timeit [sum(x) for x in x_list]
1000 loops, best of 3: 212 µs per loop

%timeit list(map(sum, x_list))
10000 loops, best of 3: 161 µs per loop

%timeit [sum(x) for x in x_list]
1000 loops, best of 3: 213 µs per loop
1
2
3
4
5
6
7
8
9
10
11
%timeit list(map(lambda i: i+1, i_list))
10000 loops, best of 3: 126 µs per loop

%timeit [i+1 for i in i_list]
10000 loops, best of 3: 53.9 µs per loop

%timeit list(map(lambda i: i+1, i_list))
10000 loops, best of 3: 125 µs per loop

%timeit [i+1 for i in i_list]
10000 loops, best of 3: 53.9 µs per loop

sf诚不我欺!

函数式编程

简单来说减少中间变量,尽量使用不可变的集合
推荐博文

闭包

简明介绍简单来说就是防止随意更改变量,只允许部分函数更改

那么,如果想要利用reduce_找出列表中的最大值,应该怎么做呢?请自行思考:)

reduce_(lambda x,y:x if x>y else y,[1,2,3],1)

使用函数替代循环是函数式风格区别于指令式风格的最显而易见的特征。

利于并行?

装饰器

有没有办法将上下文管理作为装饰器?将sql语句传入函数后装饰器取出结果后将result传入原函数,这样就改变了原函数的参数列表,调用者在使用函数时可能会感到疑惑?docstring也不好写

gui

Tkinter只适合做最简单的应用,但凡复杂一点还是用wxpython或者pyQt吧
任何耗时的操作(io等)均会造成GUI卡死,请把它们放在单独的进程中执行。
少用pack(),我根本不知道怎么用pack()对齐