关于python的一些笔记 2018-03-01 00:04:54

关于python的一些笔记 2018-03-01 00:04:54

以下是近期写python代码的时候遇到的一些常用的函数和方法,在此记录一下:

isinstance

可以用来判断某变量是否为某个类型,返回一个布尔值

a = 'sherlock'
>>> isinstance(a,str)
True
>>> isinstance(a,int)
False
>>> b = 18
>>> isinstance(b,str)
False
>>> isinstance(b,int)
True

list comprehension(列表生成式)

列表生成式是为了完成如下语句段的简写版:

LST = []
for SOMEITEM in SOMELIST:
    (if SOMECONDITION)
    RESULT = SOMEOPERATION(SOMEITEM)
    LST.append(RESULT)
LST

像这样的语句可以用列表生成式完成,比如:

>>> [x*x for x in range(5)]
[0, 1, 4, 9, 16]
>>> [x*x for x in range(5) if x%3 == 1]
[1, 16]
>>> [x+y for x in range(5) for y in range(1,6)]
[1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9]
>>> [x+y for x in 'ABC' for y in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

可以用for循环,后面跟if可以进行拣选,也可以多重循环,后面跟两个for相当于两重循环,即对两个列表的每两个元素分别操作一次。较为实用的功能。

generator

这个object一般称为生成器,上面说过的list comprehension在列表比较大的时候,比如我想range(9999999),很占内存,所以考虑用generator来避免这个缺点。用圆括号代替方括号就可以生成generator:

>>> (x*x for x in range(5))
<generator object <genexpr> at 0x7fa3d0014a50>
>>> sqr = (x*x for x in range(5))
>>> for i in sqr:
...     print i
... 
0
1
4
9
16

之所以generator可以避免内存占用问题,是因为generator每次只生成下一个需要迭代的元素,而不是直接都生成成为一个list。

yield

yield可以用来生成一个generator,比如在以下函数里,用yield返回一个generator

>>> def ShowYield():
...     for i in range(5):
...         yield i*i
... 
>>> sh = ShowYield()
>>> type(sh)
<type 'generator'>
>>> for i in sh:
...     print i
... 
0
1
4
9
16

用yield而不是return返回的函数,在执行sh = ShowYield()时没有调用这个函数,而是在for i in sh中每执行一次就运行一遍def中的循环,把下一个值返回出来。

with

with常常用在对资源的访问,用来应对异常的,即使访问出现异常,也会完成资源的释放,比如关闭文件f.close()或者线程的锁的释放。

常常用在打开文件的过程中:

f = open('sometxt.txt')
data = f.read()
f.close()
# 上述没有异常处理,比如文件打不开,而且需要手动close文件的handle,用with就好多了:
with open('sometxt.txt') as f:
    data = f.read()

其他

if CONDITION:
    VAL = V1
else:
    VAL = V2

可以写成:

VAL = V1 if CONDITION else V2

2018年03月01日00:04:47

posted @ 2018-03-01 00:05  毛利小九郎  阅读(93)  评论(0编辑  收藏  举报