疑问
模式 | 描述 |
---|---|
r | 打开一个文件为只读。文件指针置于该文件的开头。这是默认模式。 |
rb | 打开一个文件只能以二进制格式读取。文件指针置于该文件的开头。这是默认模式。 |
r+ | 打开用于读取和写入文件。文件指针将会在文件的开头。 |
rb+ | 打开用于读取和写入二进制格式的文件。文件指针将会在文件的开头。 |
w | 打开一个文件只写。覆盖该文件,如果该文件存在。如果该文件不存在,则创建用于写入一个新的文件。 |
wb | 打开一个文件只能以二进制格式写入。覆盖该文件,如果该文件存在。如果该文件不存在,则创建用于写入一个新的文件。 |
w+ | 打开用于写入和读取的文件。覆盖现有的文件,如果文件存在。如果该文件不存在,则创建读取和写入新的文件。 |
wb+ | 打开用于写入和读取的二进制格式的文件。覆盖现有的文件,如果文件存在。如果该文件不存在,则创建读取和写入新的文件。 |
a | 将打开追加文件。文件指针是在文件的结尾。也就是说,该文件是在附加模式。如果该文件不存在,它创造了写入一个新的文件。 |
ab | 将打开追加的二进制格式的文件。文件指针在该文件的结束。也就是说,该文件为追加模式。如果该文件不存在,它创建并写入一个新的文件。 |
a+ | 打开为追加和读取文件。文件指针在该文件的结束。该文件将为追加模式。如果该文件不存在,它创建并读取和写入的新文件。 |
ab+ |
打开两个追加和读取的二进制格式的文件。文件指针在该文件的结束。该文件将在追加模式。如果该文件不存在,它创建并读取和写入的新文件。 |
1.ab+说打开2个文件,这里是写错还是一次性打开2个文件?
2.模块,验证密码登录的装饰器函数,返回值执行顺序是从内到外,还是从外到内?
3.为什么把生成器赋值一个变量,就会执行下去?(range(10)如果说是调用函数,变成变量重复调用,也就是说range(10)被放在一个内存地址重复调用?)
def range1(x):
n = 0
while n < x:
# print(n)
n += 1
yield n
new_range = range1(10)
print(next(range1(10)))
print(next(range1(10))) # 为什么这里会重复开始,而换成新变量却会继续执行下去
print(next(new_range))
print(next(new_range))
结果
1
1
2
查看每个生成器的id地址
print(id(range(10)))
print(next(range1(10)))
print(id(next(range1(10))))
print(next(range1(10))) # 为什么这里会重复开始,而换成新变量却会继续执行下去
print(id(next(range1(10))))
print(next(new_range))
print(id(next(new_range)))
print(next(new_range))
print(id(next(new_range)))
结果
39438544 # 这个是range(10)的内存地址,每次执行都会改变
1
8791508898848
1
8791508898848 # 这个是next(range(10)的地址,执行不会改变,但是执行了2次next,内存地址都没变,意思是2次执行了同一个命令?(相当于每次range(0,10),重新生成一个生成器)
1 range(10)是生成器,next(生成器)为什么没起作用?也就是说next(n),n不是指生成器?
8791508898880
3 # 这里为什么返回的是3,按照顺序应该是2才对,发现是print(id(next(new_range)))这里占了一位
8791508898944 # 但是把range(10)赋值给new_range后能正确执行,而new_range也是生成器类型,new_range,range(10)都是生成器,差别在哪里?(用变量把一个生成器指定下来)---range(10)是生成器对象,a = range(10)是生成器,next(生成器对象)不会循环,生成器会,为什么?a = range(10)就变成生成器了?
4.pycharm里需要输入变量的代码怎么debug?debug怎么只看print的结果,不看中间的变量变化?
5.pycharm 断点是怎么用的?
6.def func1(): # 生成器函数
while True:
print('ok1')
x = 10 # 函数内局部变量x赋值为10
print(x)
x = yield 1 # 这里就是send函数的关键
# 之前我们创建的生成器,yield左边都是没有值(我现在不是很确定这里是不是应该叫做返回值,那就先用值代替)。
# 现在我们的x会接收到一个值,这个值是什么,从哪里来的?我们继续看下去
print('is that: ',x)
yield x # 这里试第二个断点
f1 = func1() # 获取生成器对象
ret1 = next(f1) # 运行到第一个yield
# ret1 = f1.send(None) #(这一句语句需要全部看完回头再看)当第一次执行生成器的时候,他并没有执行到yield这个位置,所以你一点传值,就会出现问题
# 谁去接收?没有对象接收就会报错,所以第一次如果一定要用send去调用,那就传一个None
print(ret1) # 打印第一个yield返回的值
#########################################
# 关键点来了
# 我们现在有两个问题,x = yield 1,这个x的值是什么,从哪里来
# 当下面这条语句运行后,他会将x的值赋值为send方法的参数,并且继续执行到下一个yield
ret2 = f1.send('eee')
print(ret2)
结果
ok1
10
1
is that: eee
eee
如果一个函数有多个yield,每遇到一个yield就停止,返回值?
7.递归函数怎么立即停止,不再执行?