python小记

refer:https://mp.weixin.qq.com/s?__biz=MzA4NjA4MTkzMw==&mid=2651987776&idx=3&sn=cb7c00da586a69d42ec0e4c66f500ec2&scene=0#wechat_redirect

  • 生成器不保留迭代过后的结果

仔细看,发现(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了
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容