前言
文的文字及图片来源于网络,仅供学习、交流使用,不具备任何商业用途,版权归原做者全部,若有问题请及时联系咱们以做处理。python
做者: Rocky0429编程
在学习 Python 的过程当中,我为它的简洁优雅而痴迷,但它又是如此的调皮,在提供了不少舒服的功能特性以外,又悄悄挖了不少带有迷惑性的坑,使人防不胜防…markdown
人不能两次踏入同一条河流,在无数次踩进一样的坑里以后,我以为我有必要整理一下,一为自警,二为给你们提个醒,但愿你不要和我犯相同的错误。网络
首先咱们先来看这么一个例子:编程语言
e = 429 try: raise Exception() except Exception as e: pass print(e)
PS:except Exception as e 能够捕获除了与程序退出(sys.exit())相关以外的全部异常。函数
PS:若是你缺少最新python实战教程,能够去小编的Python技术.裙 :一久五其二二流一思(数字的谐音)转换下能够找到了学习
在继续向下看以前,你能够先思考一下上述例子可能出现的结果是什么,也能够本身尝试着在编译器里输入一下。思考完了请继续往下看。ui
出现的结果以下:atom
Traceback (most recent call last): File "test.py", line 8, in <module> print(e) NameError: name 'e' is not defined
其实这是由于在 Python3 中使用 as 分配异常的时候,在 except 的末尾将会把这个异常清除掉(在 Python2 中则不会出现这样的状况)。这就好像将上面的示例变成下面的样子:spa
e = 429 try: raise Exception() except Exception as e: try: pass finally: del e print(e)
这样看来,是变量 e 执行了 except 子句而被删除,可是为何 e 会去执行 except 子句呢?仅仅是由于 e 和 as 后面的 e 长的一毛同样?
答案是否认的,其实这个是由于子句在 Python 中没有独立的做用域,因此上述示例中的全部内容都处于同一个做用域里,因此变量 e 会由于执行了 except 子句而被删除。
首先咱们先来看第一个例子:
>>> a = [1,2,3] >>> b = a >>> a = a + [4,5,6]
一个很简单的例子,你知道此时的 a 和 b 分别是多少么?请先本身思考一下再继续向下看:
>>> a [1, 2, 3, 4, 5, 6] >>> b [1, 2, 3]
明白了上面的例子,咱们接下来再看一个稍微有点区别的例子:
>>> a = [1,2,3] >>> b = a >>> a += [4,5,6]
>>> a [1, 2, 3, 4, 5, 6] >>> b [1, 2, 3, 4, 5, 6]
经过上面咱们就能够看出 a = a + b 和 a += b 并不老是表现相同,起码在列表上就是这么表现的。在这里的 a += [4,5,6] 实际上使用的是 extend 函数,因此 a 和 b 仍然指向已被修改的同一列表。
既然在这里说到了 + 和 +=,索性再多补充一点:在使用「加」的概念来链接字符串的时候,+= 其实比 + 的速度更快。
下面咱们来实际的演示一下用 + 链接三个字符串:
>>> import timeit >>> timeit.timeit("a = a + b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100) 0.07921688999340404 >>> timeit.timeit("a += b + c", setup="a='a'*10000;b='b'*10000;c='c'*10000",number=100) 0.002059974998701364
不少学过别的编程语言的同窗,很容易会忽略小括号 “()” 在 Python 中的一个重要表现,那就是小括号还能表示“元组” 这一不可变数据类型。
>>> type(()) <class 'tuple'> >>> tur = (1, 2) >>> type(tur) <class 'tuple'>
>>> tur = (1) >>> type(tur) <class 'int'>
那么若是想要表示一个元素的元组咋整呢?要像下面这样:
>>> tur = (1, ) >>> type(tur) <class 'tuple'>
>>> lst = [1, 2, 3, 4, 5] >>> for i in lst: ... lst.remove(i)
>>> lst [2, 4]
这是为啥子呢?是由于在 for 循环中,若是咱们删除了 index = 0 (即 1)的值,本来 index = 1 及其以后的值会向前补位,因此当前 index = 1 的值为以前 index = 2 的值。
列表的删除操做咱们常常要用,因此你们要打起十二分的精神来对它。
is not 在 Python 中是一伙的,用的时候要靠在一块儿,分开之后就是两个东西,结果会不同…
>>> [1, 2, 3] is not None True >>> [1, 2, 3] is (not None) False