python惯用方法整理(Pythonic 1)

EAFP VS LBYL

"Easier to ask for forgiveness than permission" (EAFP) rather than "look before you leap" (LBYL)
用:

try:
    doStuff(a.property)
except AttributeError:
    otherStuff()

舍弃:

if hasattr(a, 'property'):
    doStuff(a.property)
else:
    otherStuff()

检查python运行版本

>>> import sys
>>> print(sys.version)
3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)]

检查python使用的cpu数量

>>> import multiprocessing
>>> multiprocessing.cpu_count()
...

不运行脚本检查语法

python -m py_compile script.py

从指定路径加载module

For Python 3.5+ use:

import importlib.util

spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

For Python 3.3 and 3.4 use:

from importlib.machinery import SourceFileLoader

foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()

(Although this has been deprecated in Python 3.4.)

For Python 2 use:

import imp

foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()

main的写法

if __name__ == "__main__":
    pass
__name__ == "__main__" and main()

注:Without the main sentinel, the code would be executed even if the script was imported as a module.

递归

按层级输出一个文件夹下的文件结构

import os

_PATH = r"F:\MyDjango\mydjango\mysite\static"

def showdir(path, n):
    print((n-1) * "----" + path.replace(_PATH + "\\", ""))
    for d in os.listdir(path):
        subpath = os.path.join(path, d)
        if os.path.isdir(subpath):
            showdir(subpath, n + 1)
        else:
            print(n * "----" + subpath.replace(_PATH + "\\", ""))

if __name__ == "__main__":
    showdir(_PATH, 1)

设置递归深度,默认递归深度1000

import sys

print(sys.getrecursionlimit())
sys.setrecursionlimit(1234)
print(sys.getrecursionlimit())

运算符:is VS ==

stackoverflow原文
is is identity testing, == is equality testing. what happens in your code would be emulated in the interpreter like this:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

so, no wonder they're not the same, right?
In other words: 'is' is the id(a) == id(b)

True Or False

以下都是False(参见py说明文档

  • None
  • False
  • zero of any numeric type, for example, 0, 0.0, 0j.
    为0的数字类型,如整型、浮点型、复数。
  • any empty sequence, for example, '', (), [].
    空序列,如:'',(),[]。
  • any empty mapping, for example, {}.
    空映射,如:{}。
>>> if not (None or False or 0 or 0.0 or 0j or '' or () or [] or {}):
...     print('False')
False

list的index

从字符串看 list 的 index,(以下来自Python帮助文档)

/*******
+---+---+---+---+---+
 | H | e | l | p | A |
 +---+---+---+---+---+
 0   1   2   3   4   5
-5  -4  -3  -2  -1
************************/

简化创建list/tuple

# list or tuple
[ o.dosomething for o in objects if  True ]

或者

[ dosomething if x... else ... for x in Xs]

倒序list

>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
...     print i
>>> reversed(a)
<list_reverseiterator object at 0x...>

和[::-1]相比,上面方法没有创建新的list对象,仅生成了一个迭代器对象

>>>for i in a[::-1]:
...   pass

>>> mylist[::-1] 
>>> mylist[-2::-1]

转载于:https://my.oschina.net/Ashkandi/blog/750338

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值