Python 字符串 Intern 机制


s3 = "hello!"
s4 = "hello!"
s3 is s4
False
id(s3)
80325968L
id(s4)
80326048L

s3 和 s4 虽然值是一样的,但确确实实是两个不同的字符串对象,Python 会为它们俩各自分配一段内存空间,假设程序中存在大量值相同的字符串,系统就不得不为每个字符串重复地分配内存空间,显然对系统来说是一种无谓的资源浪费。为了解决这种问题,Python 引入了 intern 机制。

s3 = intern('hello!')
s4 = intern('hello!')
s3 is s4
True
id(s3)
80325968L
id(s4)
80325968L

intern 是 Python 中的一个内建函数,该函数的作用就是对字符串进行 intern 机制处理,处理后返回字符串对象。我们发现但凡是值相同的字符串经过 intern 机制处理之后,返回的都是同一个字符串对象,这种方式在处理大数据的时候无疑能节省更多的内存空间,系统无需为相同的字符串重复分配内存,对于值相同的字符串共用一个对象即可。
在主流面向对象的编程语言中intern 机制对于处理字符串已经成为一种标配,通过 intern 机制可以提高字符串的处理效率,当然,解释器内部很对 intern 机制的使用策略是有考究的,有些场景会自动使用 intern,有些地方需要通过手动方式才能启动。

s1 = "hello"
s2 = "hello"
s1 is s2
True
id(s1)
72320704L
id(s2)
72320704L
阅读全文

Python 判断文件、文件夹是否存在


判断文件是否存在

import os  
os.path.isfile('./file.txt')
# True
os.path.isfile('./fake.txt')
# False

判断文件夹是否存在

import os  
os.path.isdir('./dir')
# True
os.path.isdir('./foo')
# False

判断文件或文件夹是否存在

import os  
os.path.exists('./file.txt')
# True
os.path.exists('./fake.txt')
# False
os.path.exists('./dir')
# True
os.path.exists('./foo')
# False
阅读全文

一道关于 Python 字符类型面试题


a = u'China'
b = 'China'
c = u'中国'
d = '中国'
# 1
print '%s %s' % (a, b)
# 2
print '%s' % c
# 3
print '%s' % d
# 4
print '%s %s' % (c, d)

先说正确答案,只有最后一行会报错。

Python2,默认的字符类型是 str,这个 str 和 Python3 的 str 完全不同,Python2 的 str 类型是 8 位的 ascii 序列。
Python2 在处理 str 类型转换时遵循这样的规则:如果被处理的 str 型变量值小于 7 位,就可以和 unicode 类型混用。可以做 + 连接,格式化等操作,同 unicode 享受同样的待遇。Python2 在格式化字符时,会把 str 格式化为 str,如果字符串里混入了 unicode,就会把其他字符都转化为 unicode。
所以这道题里 1 处的 a,b 两个值混合后的字符就是一个 unicode 字符串,c 和 d 单独格式化后仍保留了自己的格式。但是 Python2 在格式化代码位置 4 时,发现 c 是 unicode 而 d 不是,就会尝试按照上面的混用规则,格式化 d 为 unicode 类型,但是 d 的值'中国'显然是一个大于 7 位的 str,因此 Python2 抛出 UnicodeDecodeError。
Python3 里,str 类型则变成了一个纯 unicode 字符,也就是说 Python3 里的 str 等价于 Python2 里的 unicode 类型。Python3 里为了清晰明了,使用 bytes 代表 8 位 ascii 序列。除此之外,Python3 严格禁止混用两种类型。
使用 Python2 处理字符串,尤其是中文字符串,最好前边加上 u。Python2 里不要混用 str 和 unicode,如果处理文本时,先将全部数据格式化成 unicode。

阅读全文

Python list去重


基础方法

ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
    if id not in news_ids:
        news_ids.append(id)
print news_ids

set 容器

ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)

itertools.grouby

ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)
for k, g in it:
    print k

reduce

ids = [1,4,3,3,4,2,3,4,5,6,1]
func = lambda x,y:x if y in x else x + [y]
reduce(func, [[], ] + ids)
[1, 4, 3, 2, 5, 6]
阅读全文

让你的 Python 代码更 Pythonic


变量交换

a, b = b, a

循环遍历

for i in xrange(6):
    print i

带有索引位置的集合遍历

colors = ['red', 'green', 'blue', 'yellow']
for i, color in enumerate(colors):
    print i, color

字符串拼接

names = ['raymond', 'rachel', 'matthew', 'roger', 'betty', 'melissa', 'judith', 'charlie']
print ', '.join(names)

打开文件

with open('data.txt') as f:
    data = f.read()

列表推导式

[j for i in xrange(10)]

遍历字典

for k, v in d.iteritems():
    print k, v
for i, v in enumerate(l):
    pass

构建字典

names = ['raymond', 'rachel', 'matthew']
colors = ['red', 'green', 'blue']
d = dict(izip(names, colors))

阅读全文

Python 如何处理 ImmutableMultiDict 中的数据


Flask 与前端数据交互的时候,经常会使用 ImmutableMultiDict、MultiDict 类型。

combined = CombinedMultiDict([self])
getData = combined['endDate']

self 是一组 ImmutableMultiDict 类型,endDate 是一个 key。
下面是官方的样例:

>>> from werkzeug.datastructures import CombinedMultiDict, MultiDict
>>> post = MultiDict([('foo', 'bar')])
>>> get = MultiDict([('blub', 'blah')])
>>> combined = CombinedMultiDict([get, post])
>>> combined['foo']
'bar'
>>> combined['blub']
'blah'
阅读全文

Flask 时快时慢的问题


app.run(host="0.0.0.0", port=8080)

当 app.run 设置成这样的时候,有时候页面加载会时快时慢。
原来默认 Flask 是单线程的,需要更改参数。

app.run(host="0.0.0.0", port=8080, threaded=True)

官方文档原文:

werkzeug.serving.run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, extra_files=None, reloader_interval=1, reloader_type='auto', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None)

threaded – should the process handle each request in a separate thread?
processes – if greater than 1 then handle each request in a new process up to this maximum number of concurrent processes.
阅读全文