1. ... 对象
没错,你没看错,就是 "..."
在Python中 ... 代表着一个名为 Ellipsis 的对象。根据官方说明,它是一个特殊值,通常可以作为 空函数的占位符 ,或是 用于Numpy中的切片操作 。
如:
def?my_awesome_function(): ????...
等同于:
def?my_awesome_function(): ????Ellipsis
当然,你也可以使用pass或者字符串作为占位符:
def?my_awesome_function(): ????pass
def?my_awesome_function(): ????"An empty, but also awesome function"
他们最终的效果都是相同的。
接下来讲讲...对象是如何在Numpy中体现出作用的,创建一个 3x3x3 的矩阵数组,然后获取所有最内层矩阵的第二列:
>>>?import?numpy?as?np >>>?array = np.arange(27).reshape(3,?3,?3) >>>?array array([[[?0,?1,?2], ????????[?3,?4,?5], ????????[?6,?7,?8]], ???????[[?9,?10,?11], ????????[12,?13,?14], ????????[15,?16,?17]], ???????[[18,?19,?20], ????????[21,?22,?23], ????????[24,?25,?26]]])
为了获取最层矩阵的第二列,传统方法可能是这样的:
>>>?array[:, :,?1] array([[?1,?4,?7], ???????[10,?13,?16], ???????[19,?22,?25]])
如果你会用...对象,则是这样的:
>>>?array[...,?1] array([[?1,?4,?7], ???????[10,?13,?16], ???????[19,?22,?25]])
不过请注意, ... 对象仅可用于Numpy,不适用于Python内置数组。
2.解压迭代对象
解压迭代对象是一个非常方便的特性:
>>>?a, *b, c = range(1,?11) >>>?a 1 >>>?c 10 >>>?b [2,?3,?4,?5,?6,?7,?8,?9]
或者是:
>>>?a, b, c = range(3) >>>?a 0 >>>?b 1 >>>?c 2
同理,与其写这样的代码:
>>>?lst = [1] >>>?a = lst[0] >>>?a 1 >>>?(a, ) = lst >>>?a 1
你不如跟解压迭代对象一样,进行更优雅的赋值操作:
>>>?lst = [1] >>>?[a] = lst >>>?a 1
虽然这看起来有点蠢,但就我个人来看,比前一种写法更优雅一些。
3.展开的艺术
数组展开有各种千奇百怪的姿势,比如说:
>>>?l = [[1,?2,?3], [4,?5,?6], [7,?8,?9]] >>>?flattened = [elem?for?sublist?in?l?for?elem?in?sublist] >>>?flattened [1,?2,?3,?4,?5,?6,?7,?8,?9]
如果你对reduce和lambda有一定了解,建议使用更优雅的方式:
>>>?from?functools?import?reduce >>>?reduce(lambda?x,y: x+y, l) [1,?2,?3,?4,?5,?6,?7,?8,?9]
reduce和lambda组合起来,就能针对 l 数组内的每个子数组做拼接操作。
当然,还有更神奇的方式:
>>>?sum(l, []) [1,?2,?3,?4,?5,?6,?7,?8,?9] >>>?# 其实相当于 [] + [1, 2, 3] + [4, 5, 6] + [7, 8, 9]
没错,这样对二维数组做sum操作,就能使二维数组内的每个元素做[加]法拼接起来。
同样的道理,如果你对三位数组做sum操作,就能使其变为二维数组,此时再对二维数组做sum操作,就能展开为一维数组。
虽然这个技巧很出色,但我并不推荐使用,因为可读性太差了。
4.下划线 _ 变量
每当你在Python解释器,IPython或Django Console中运行表达式时,Python都会将输出的值绑定到 _ 变量中:
>>>?nums = [1,?3,?7] >>>?sum(nums) 11 >>>?_ 11 >>>
由于它是一个变量,你可以随时覆盖它,或像普通变量一样操作它:
>>>?9?+ _ 20 >>>?a = _ >>>?a 20
5.多种用途的else
很多人都不知道,else 可以被用于许多地方,除了典型的 if else, 我们还可以在循环和异常处理里用到它。
循环
如果需要判断循环里是否处理了某个逻辑,通常情况下会这么做:
found =?False a =?0 while?a <?10: ????if?a ==?12: ????????found =?True ????a +=?1 if?not?found: ????print("a was never found")
如果引入else,我们可以少用一个变量:
a =?0 while?a <?10: ????if?a ==?12: ????????break ????a +=?1 else: ????print("a was never found")
异常处理
我们可以在 try ... except ... 中使用 else 编写未捕获到异常时的逻辑:
In [13]:?try: ????...: {}['lala'] ????...:?except?KeyError: ????...: print("Key is missing") ????...:?else: ????...: print("Else here") ????...: Key?is?missing
这样,如果程序没有异常,则会走else分支:
In [14]:?try: ????...: {'lala':?'bla'}['lala'] ????...:?except?KeyError: ????...: print("Key is missing") ????...:?else: ????...: print("Else here") ????...: Else here
如果你经常做异常处理,你就会知道这个技巧相当方便。
到此这篇关于Python中隐藏的五种实用技巧分享的文章就介绍到这了,更多相关Python实用技巧内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
查看更多关于Python中隐藏的五种实用技巧分享的详细内容...