Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用对iter和while的调用时,如何作为python生成器删除字符串的最后x个字符?_Python_Loops_Iterator_Generator - Fatal编程技术网

在使用对iter和while的调用时,如何作为python生成器删除字符串的最后x个字符?

在使用对iter和while的调用时,如何作为python生成器删除字符串的最后x个字符?,python,loops,iterator,generator,Python,Loops,Iterator,Generator,我在编写一个生成器函数时遇到了问题,该函数包含一个iterable和一个以上的参数,即整数x。它输出除最后x个值以外的所有值。它不知道如何计算iterable输出的值 我不知道如何使用while循环以及iter来实现这一点。我还需要使用一个理解,创建一个列表来存储最多x个值 让我们称之为: for i in func_function(“abcdefghijk”,5): print(i,end =”) 它应该打印abcdef 以下是我尝试过的: def func_function(iterab

我在编写一个生成器函数时遇到了问题,该函数包含一个iterable和一个以上的参数,即整数x。它输出除最后x个值以外的所有值。它不知道如何计算iterable输出的值

我不知道如何使用while循环以及iter来实现这一点。我还需要使用一个理解,创建一个列表来存储最多x个值

让我们称之为:

for i in func_function(“abcdefghijk”,5):
print(i,end =”)
它应该打印
abcdef

以下是我尝试过的:

def func_function(iterable, x):
    while True:
        l = []
        for x in iter(iterable):
            if len(x) == x:
               yield x

诀窍是将此从向前看转变为向后看

我可以通过迭代输入并维护最近
n
元素的窗口来实现这一点:

def except_last_n(iterable, n):
  last_n = []
  for val in iterable:
    last_n.append(val)
    if len(last_n) > n:
      yield last_n.pop(0)

for val in except_last_n(range(10), 3):
  print(val)
将其重写为
,而
循环和
iter
留给读者作为练习

def except_last_n(iterable, n):
  last_n = [val for val in iterable]
  if len(last_n) > n:
      yield last_n.pop(0)
字符串是可切片的:

def func_function(iterable, x):
    yield from iterable[:-x]

print(func_function("asdfgkjbewqrfgkjb",8))

k = list(func_function("asdfgkjbewqrfgkjb",8))    
print(k) # ['a', 's', 'd', 'f', 'g', 'k', 'j', 'b', 'e']
不需要while循环、iter和
l=[]

from collections import deque

def drop_last_few(iterable, x=5):
    it = iter(iterable)
    data = deque(maxlen=x)
    data.extend([next(it) for i in range(x)])
    for val in it:
        yield data[0]
        data.append(val)
这使用一个双端队列作为存储,最多缓存
x
个元素。演示:

>>> print(*drop_last_few("abcdefghijk", 5))
a b c d e f

如何使用while循环和iter来实现这一点?我们是否可以重写以获得列表理解>?为什么要这样做?@sparkecode:欢迎使用堆栈溢出。这不是一个“请为我编码”的网站。我们很乐意为您提供帮助,但您也需要付出一些努力。您能做到最后吗?而不是PopRable,问题在于它假设iterable支持切片,而它可能支持也可能不支持slicing@NPE-OP askes用于字符串-字符串是可切片的。@SparkRecording字符串支持切片