问题遇到的现象和发生背景
我想要写一个用来抽取的代码工具(python),读取文件,写入文件等功能
我的计划是写好了CSV之后用python写入和输出,并且代码编写过程中遇到了随机排序的需求,但是我想要减少内存,最简单的方法当然是yield
问题相关代码,请勿粘贴截图
代码如下:
1:
def check(iterable):
for e in iterable:
q = choice(iterable)
iterable.remove(q)
yield q
print (iterable)
iterable.remove(q)
#这串代码由于本人阅历的原因看上去好像没什么问题,但他的抽取是放回式的,这与我的设计不符。所以这里有一处问题
以上只是一个辅助的函数,而正式函数在编写到刚开始时调试时就发现了问题
2:
def r(PL_num):
PL_num = int(PL_num)
if PL_num < 2:
return False
elif PL_num == 2:
for __Count in range(2):
print(next(check([1,2])))
运行之后出现了:
1
1
或
2
2
的情况。很明显不是不放回抽取,但是我认为list.remove应该是没问题的,而调试却发现了其他问题:
3:
s = 1
iterable = [1,2,3]
for e in iterable:
q = choice(iterable)
iterable.remove(q)
print(s,":")
print(q)
print (iterable)
s += 1
#输出是
"""
1 :
2
[1, 3]
2 :
3
[1]
"""
#当调整循环次数为10时,输出为:
1 :
2
[1, 3, 4, 5, 6, 7, 8, 9, 10]
2 :
3
[1, 4, 5, 6, 7, 8, 9, 10]
3 :
10
[1, 4, 5, 6, 7, 8, 9]
4 :
8
[1, 4, 5, 6, 7, 9]
5 :
9
[1, 4, 5, 6, 7]
问题3目前找到了替代方案(虽然原方案的原因未知)因而我继续编写
#对原代码进行如下修改:
def check(iterable):
for e in range(len(iterable)):
q = choice(iterable)
iterable.remove(q)
yield q
print (iterable)
iterable.remove(q)
#但是仍然会出现重复的情况
运行结果及报错内容
在上一版块中已经写明
我的解答思路和尝试过的方法
#好消息是问题三我已经得到了解决,只需要稍微改动就可实现
s = 1
iterable = [1,2,3,4,5,6,7,8,9,10]
for e in range(len(iterable)):
q = choice(iterable)
iterable.remove(q)
print(s,":")
print(q)
print (iterable)
s += 1
#此时输出就会出现循环正确次数而不是(正确)//2,但是之前的代码的 错误原因还需要讲解
我想要达到的结果
实现不放回抽取(使用yield),因为待读取文件较大导致用return比较占内存