1. 不论是import还是from...import,初始化代码都会被执行
2. if __name__ == __main__下面的语句,不会在这个py文件导入的时候调用,只会在执行这个文件的时候调用,相当于程序的入口
3. 关于import 和 from ... import
(1)import 模块 可以
(2)import 包 不可以
(3)from 包 import 模块 可以
(4)from 包 import * (这里*指函数或者类) 可以,并且这里和__all__这个东西无关
(5)from 包 import 包 不可以,没有这种写法
(6)import 包 import * (这里的import后面接的包,包里面必须含有模块,不然也是不可以的) 如果是这种写法,那么在这个包对应的__init__.py下面,必须用__all__指明对外暴露的模块,不然搜不到
(7)__all__里面装的是模块,不是包
(8)from 包 import 函数 / 类 可以
4. 关于generator, next, send和yield
# !user/bin/python
# -*- coding: UTF-8 -*-
def f():
print('start...')
a = yield 5
print('a = ', a)
b = yield 6
print('b = ', b) # 永远不会被执行
ob = f() # 带有yield的函数就是一个生成器
res1 = next(ob) # 首次运行生成器不能传参,因为还没碰到yield,这里将执行第一个yield之前的程序,并且将yield的返回值传给res1,函数里面的a,因为没有传参进来,所以目前是None
print('res1:', res1) # 此时res1为5,程序此时停留在'a = yield 5'这一行,因为next遇到yield跳出来了
res2 = ob.send('msg') # 第二次运行生成器,此时停留在'a = yield 5'这一行,因此,a从None变成'msg',并且继续执行代码直至遇到下一个yield并停留在yield那一行然后退出
print('res2:', res2) # 此时res2返回6,然后跳出函数,b这个时候为None,可惜永远都输出不了了
# start...
# res1: 5
# a = msg
# res2: 6
new_ob = f()
for i in new_ob:
print(i)
# start...
# 5
# a = None
# 6
# b = None
5. 关于切片到底是深拷贝还是浅拷贝的问题
Python中:深拷贝,地址不同,修改不影响原来的值
Numpy中:浅拷贝,虽然地址不同,但是修改却会影响原来的值
也就是说,在Numpy中,要对Ndarray进行深拷贝的话,最好用copy函数,其他的都不好使
总结:
<