本着"你最有用的C/C++代码片段"的精神- 线程:
你们有没有(通常)使用的简短的单功能Python片段,并希望与StackOverlow社区分享?请保持条目较小(可能在25行以下?)并且每个帖子只提供一个示例.
我将从一个简短的片段开始,我不时使用它来计算python项目中的sloc(源代码行):
# prints recursive count of lines of python source code from current directory # includes an ignore_list. also prints total sloc import os cur_path = os.getcwd() ignore_set = set(["__init__.py", "count_sourcelines.py"]) loclist = [] for pydir, _, pyfiles in os.walk(cur_path): for pyfile in pyfiles: if pyfile.endswith(".py") and pyfile not in ignore_set: totalpath = os.path.join(pydir, pyfile) loclist.append( ( len(open(totalpath, "r").read().splitlines()), totalpath.split(cur_path)[1]) ) for linenumbercount, filename in loclist: print "%05d lines in %s" % (linenumbercount, filename) print "\nTotal: %s lines (%s)" %(sum([x[0] for x in loclist]), cur_path)
Jacob Gabrie.. 34
我喜欢使用any
和生成器:
if any(pred(x.item) for x in sequence): ...
而不是像这样写的代码:
found = False for x in sequence: if pred(x.n): found = True if found: ...
我首先从Peter Norvig的文章中了解到这种技术.
我喜欢使用any
和生成器:
if any(pred(x.item) for x in sequence): ...
而不是像这样写的代码:
found = False for x in sequence: if pred(x.n): found = True if found: ...
我首先从Peter Norvig的文章中了解到这种技术.
我知道的唯一"技巧"在我学习它时真的让我惊叹的是枚举.它允许您访问for循环中元素的索引.
>>> l = ['a','b','c','d','e','f'] >>> for (index,value) in enumerate(l): ... print index, value ... 0 a 1 b 2 c 3 d 4 e 5 f
初始化2D列表
虽然这可以安全地完成以初始化列表:
lst = [0] * 3
同样的技巧不适用于2D列表(列表列表):
>>> lst_2d = [[0] * 3] * 3 >>> lst_2d [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> lst_2d[0][0] = 5 >>> lst_2d [[5, 0, 0], [5, 0, 0], [5, 0, 0]]
运算符*复制其操作数,并且使用[]构造的重复列表指向同一列表.正确的方法是:
>>> lst_2d = [[0] * 3 for i in xrange(3)] >>> lst_2d [[0, 0, 0], [0, 0, 0], [0, 0, 0]] >>> lst_2d[0][0] = 5 >>> lst_2d [[5, 0, 0], [0, 0, 0], [0, 0, 0]]
zip(*iterable)
转换一个可迭代的.
>>> a=[[1,2,3],[4,5,6]] >>> zip(*a) [(1, 4), (2, 5), (3, 6)]
它对dicts也很有用.
>>> d={"a":1,"b":2,"c":3} >>> zip(*d.iteritems()) [('a', 'c', 'b'), (1, 3, 2)]
为当前目录中的文件启动一个简单的Web服务器:
python -m SimpleHTTPServer
用于共享文件.
一个"进度条",看起来像:
|#############################---------------------| 59 percent done
码:
class ProgressBar(): def __init__(self, width=50): self.pointer = 0 self.width = width def __call__(self,x): # x in percent self.pointer = int(self.width*(x/100.0)) return "|" + "#"*self.pointer + "-"*(self.width-self.pointer)+\ "|\n %d percent done" % int(x)
测试功能(对于Windows系统,将"清除"更改为"CLS"):
if __name__ == '__main__': import time, os pb = ProgressBar() for i in range(101): os.system('clear') print pb(i) time.sleep(0.1)
扁平化列表列表,例如
[['a', 'b'], ['c'], ['d', 'e', 'f']]
成
['a', 'b', 'c', 'd', 'e', 'f']
使用
[inner for outer in the_list for inner in outer]
嵌套列表和字典的巨大加速:
deepcopy = lambda x: cPickle.loads(cPickle.dumps(x))
假设您有一个项目列表,并且您想要一个包含这些项目的字典作为键.使用fromkeys:
>>> items = ['a', 'b', 'c', 'd'] >>> idict = dict().fromkeys(items, 0) >>> idict {'a': 0, 'c': 0, 'b': 0, 'd': 0} >>>
fromkeys的第二个参数是要授予所有新创建的键的值.
要确定line是否为空(即大小为0或仅包含空格),请在条件中使用字符串方法条,如下所示:
if not line.strip(): # if line is empty continue # skip it
我喜欢这个在目录中压缩所有内容.热键用于instabackups!
import zipfile z = zipfile.ZipFile('my-archive.zip', 'w', zipfile.ZIP_DEFLATED) startdir = "/home/johnf" for dirpath, dirnames, filenames in os.walk(startdir): for filename in filenames: z.write(os.path.join(dirpath, filename)) z.close()
对于需要最新的列表理解,下一步:
[fun(curr,next) for curr,next in zip(list,list[1:].append(None)) if condition(curr,next)]
用于通告清单zip(list,list[1:].append(list[0]))
。
对于以前的版本,当前:zip([None].extend(list[:-1]),list)
通报:zip([list[-1]].extend(list[:-1]),list)