- 生成器不保留迭代过后的结果
仔细看,发现(i for i in range(5))生成的是迭代器不是tuple哟。
In [12]: gen = (i for i in range(5))
In [13]: 2 in gen
Out[13]: True
In [14]: 3 in gen
Out[14]: True
In [15]: 1 in gen
Out[15]: False # 1为什么不在gen里面了? 因为调用1->2,这个时候1已经不在迭代器里面了,被按需生成过了
In [20]: gen = (i for i in range(5))
In [21]: a_list = list(gen) # 可以转化成列表,当然a_tuple = tuple(gen) 也可以
In [22]: 2 in a_list
Out[22]: True
In [24]: 1 in a_list # 就算循环过,值还在
Out[24]: True
- lambda在闭包中会保存局部变量
my_list = [lambda: i for i in range(5)]
for l in my_list:
print l()
4
...
4
其实就是当我赋值给my_list的时候,lambda表达式就执行了i会循环,直到 i =4,i会保留
但是可以用生成器,代码如下:
my_gen = (lambda: n for n in range(5))
for l in my_gen:
print(l())
0
1
2
3
4
也可以坚持用list,代码如下:
my_list = [lambda x=i: x for i in range(5)] # 看我给每个lambda表达式赋了默认值
for l in my_list:
print(l())
0
1
2
3
4
-重用全局变量
def foo():
# 函数作用域里定义了一个本地变量var(var = "local"),而这里是定义之前就使用了var,python解释器在这里会认为没有定义本地变量
# 注意这种情况下去调用print var时,不会把var看做全局变量了,因为python解释器是先查局部变量,找不到才使用全局变量,而这里局部变量是有的
print var
var = "local"
var = "global"
foo()
------------------------------------------------
UnboundLocalErrorTraceback (most recent call last)
<ipython-input-46-624891b0d01a> in <module>()
----> 1 foo()
<ipython-input-43-373dd100efad> in foo()
1 def foo():
----> 2 print var
3 var = 32
4
UnboundLocalError: local variable 'var' referenced before assignment
函数作用域里定义了一个本地变量var(var = "local"),而这里是定义之前就使用了var,python解释器在这里会认为没有定义本地变量
注意这种情况下去调用print var时,不会把var看做全局变量了,因为python解释器是先查局部变量,找不到才使用全局变量,而这里局部变量是有的
其实,可以在函数里用global关键字注明使用的是全局变量,不过这样一来函数内部就改变了全局变量了
def foo():
global var # 声明了是全局变量
print var
var = "local"
var = "global"
foo()
# output:
global
local
- 可变对象的*其实是引用传递
In [72]: my_list1 = [[1, 2, 3]] * 2
In [73]: my_list1
Out[73]: [[1, 2, 3], [1, 2, 3]]
In [74]: my_list1[1][0] = 'a' # 我只修改子列表中的一项
In [75]: my_list1
Out[75]: [['a', 2, 3], ['a', 2, 3]] # 但是都影响到了
In [76]: my_list2 = [[1, 2, 3] for i in range(2)] # 用这种循环生成不同对象的方法就不影响了
In [77]: my_list2[1][0] = 'a'
In [78]: my_list2
Out[78]: [[1, 2, 3], ['a', 2, 3]]
- datetime也有布尔值
In [34]: import datetime
In [35]: print('"datetime.time(0,0,0)" (Midnight) ->', bool(datetime.time(0,0,0)))
('"datetime.time(0,0,0)" (Midnight) ->', False)
In [36]: print('"datetime.time(1,0,0)" (1 am) ->', bool(datetime.time(1,0,0)))
('"datetime.time(1,0,0)" (1 am) ->', True)
- bool其实是int的子类
In [97]: isinstance(True, int)
Out[97]: True
In [98]: True + True
Out[98]: 2
In [99]: 3 * True + True
Out[99]: 4
In [100]: 3 * True - False
Out[100]: 3
In [104]: True << 10
Out[104]: 1024
dic = {1:"1"}
dic[True] = "True"
dic
# output:
{1: 'True'}
异常处理加else
In [150]: try:
.....: print('third element:', a_list[2])
.....: except IndexError:
.....: print('raised IndexError')
.....: else:
.....: print('no error in try-block') # 只有在try里面没有异常的时候才会执行else里面的表达式
.....:
raised IndexError # 抛异常了 没完全完成
In [153]: i = 0
In [154]: while i < 2:
.....: print(i)
.....: i += 1
.....: else:
.....: print('in else')
.....:
0
1
in else # while也支持哦~
In [155]: i = 0
In [156]: while i < 2:
.....: print(i)
.....: i += 1
.....: break
.....: else:
.....: print('completed while-loop')
.....:
0 # 被break了 没有完全执行完 就不执行else里面的了
In [158]: for i in range(2):
.....: print(i)
.....: else:
.....: print('completed for-loop')
.....:
0
1
completed for-loop
In [159]: for i in range(2):
.....: print(i)
.....: break
.....: else:
.....: print('completed for-loop')
.....:
0 # 也是因为break了