当前位置:  开发笔记 > 编程语言 > 正文

简短(有用)的python片段

如何解决《简短(有用)的python片段》经验,为你挑选了12个好方法。

本着"你最有用的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的文章中了解到这种技术.



1> Jacob Gabrie..:

我喜欢使用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的文章中了解到这种技术.


还有all()来检查所有项目是否为True.
+1参考Norvig的数独文章.这是很不错的.

2> theycallmemo..:

我知道的唯一"技巧"在我学习它时真的让我惊叹的是枚举.它允许您访问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


无需在括号中输入索引值.此外,上述评论是天真/无知的.

3> Eli Bendersk..:

初始化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]]


更快的方式:http://stackoverflow.com/questions/2332919

4> AKX..:

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)]



5> Adam Lehenba..:

为当前目录中的文件启动一个简单的Web服务器:

python -m SimpleHTTPServer

用于共享文件.



6> Theodor..:

一个"进度条",看起来像:

|#############################---------------------|
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)


现在我们有了`tqdm`,`tqdm import tqdm`和`在tqdm([1,2,3])中为i:print i`

7> George V. Re..:

扁平化列表列表,例如

[['a', 'b'], ['c'], ['d', 'e', 'f']]

['a', 'b', 'c', 'd', 'e', 'f']

使用

[inner
    for outer in the_list
        for inner in outer]


或`sum(the_list,[])`。尽管我怀疑这会在某处(当然,除了发电机之外)出错。

8> vartec..:

嵌套列表和字典的巨大加速:

deepcopy = lambda x: cPickle.loads(cPickle.dumps(x))



9> Eli Bendersk..:

假设您有一个项目列表,并且您想要一个包含这些项目的字典作为键.使用fromkeys:

>>> items = ['a', 'b', 'c', 'd']
>>> idict = dict().fromkeys(items, 0)
>>> idict
{'a': 0, 'c': 0, 'b': 0, 'd': 0}
>>>

fromkeys的第二个参数是要授予所有新创建的键的值.



10> Eli Bendersk..:

要确定line是否为空(即大小为0或仅包含空格),请在条件中使用字符串方法条,如下所示:

if not line.strip():    # if line is empty
    continue            # skip it



11> John Feminel..:

我喜欢这个在目录中压缩所有内容.热键用于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()


zip -r my-archive.zip目录有什么问题?

12> vartec..:

对于需要最新的列表理解,下一步:

[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)

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有