前言
文章有点标题党,主要是分享一些Python好用的语法糖,用更少的代码实现同样的功能,而且还很优雅。
兵器谱
- ifpython没有三目运算符,我挺苦恼的,比如把两个整数较大的那个复制给一个变量,有三目运算符的语言会这样写:
123a = 1b = 2c = a > b ? a : b
后来发现Python的if语句可以写成一行完成上述功能:
1c = a if a > b else b - with我们通常以如下形式操作文件:
12345try: f = open('/path/to/file', 'r')print f.read()finally:if f:f.close()
每次这样写太繁琐,来试试with的威力:
12with open('/path/to/file', 'r') as f:print f.read()
代码更佳简洁,并且不必调用f.close()方法。
with利用了上下文管理协议,这玩意说起来太复杂,直接上代码。
自定义一个支持上下文管理协议的类, 类中实现enter方法和exit方法。
12345678910111213141516171819202122class MyWith(object):def __enter__(self):print "Enter with"return self # 返回对象给as后的变量def __exit__(self, exc_type, exc_value, exc_traceback):#关闭资源等if exc_traceback is None:print "Exited without Exception"return Trueelse:print "Exited with Exception"return Falsedef test_with():with MyWith() as my_with:print "running my_with"print "------分割线-----"with MyWith() as my_with:print "running before Exception"raise Exceptionprint "running after Exception"if __name__ == '__main__':test_with()
输出:
1234567Enter withrunning my_withExited without Exception------分割线-----Enter withrunning before ExceptionExited with Exception - map大多数的for循环可以用map来代替,用法是:
map(func,seq)
,对seq中的每个元素进行操作,具体什么操作在func里定义。
我们以前是这么写for循环的:
1܌有三目运算符的语言会这样写:
123a = 1b = 2c = a > b ? a : b
后来发现Python的if语句可以写成一行完成上述功能:
1c = a if a > b else b- with我们通常以如下形式操作文件:
12345try: f = open('/path/to/file', 'r')print f.read()finally:if f:f.close()
每次这样写太繁琐,来试试with的威力:
12with open('/path/to/file', 'r') as f:print f.read()
代码更佳简洁,并且不必调用f.close()方法。
with利用了上下文管理协议,这玩意说起来太复杂,直接上代码。
自定义一个支持上下文管理协议的类, 类中实现enter方法和exit方法。
12345678910111213141516171819202122class MyWith(object):def __enter__(self):print "Enter with"return self # 返回对象给as后的变量def __exit__(self, exc_type, exc_value, exc_traceback):#关闭资源等if exc_traceback is None:print "Exited without Exception"return Trueelse:print "Exited with Exception"return Falsedef test_with():with MyWith() as my_with:print "running my_with"print "------分割线-----"with MyWith() as my_with:print "running before Exception"raise Exceptionprint "running after Exception"if __name__ == '__main__':test_with()
输出:
1234567Enter withrunning my_withExited without Exception------分割线-----Enter withrunning before ExceptionExited with Exception- map大多数的for循环可以用map来代替,用法是:
map(func,seq)
,对seq中的每个元素进行操作,具体什么操作在func里定义。
我们以前是这么写for循环的:
1pan> f:f.close() - with我们通常以如下形式操作文件: