疑问

模式描述
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.递归函数怎么立即停止,不再执行?

 

原文地址:https://www.cnblogs.com/jackfree/p/9635763.html