python中for语句的使用_如何在Python中使用C风格的for循环?

我想在Python中使用传统的C-style for loop.我想循环遍历字符串的字符,但也知道它是什么,并能够跳过字符(例如代码中的某处i = 5).

for for range并没有给我一个实际for循环的灵活性.

解决方法:

简单的答案是,Python中的C语句没有简单,精确的等价物.使用带有范围的Python for语句涵盖了其他答案.如果您希望能够在循环中修改循环变量(并使其影响后续迭代),则必须使用while循环:

i = 0

while i < 7:

if someCondition(i):

i = 5

i += 1

但是在该循环中,continue语句将不会具有与C for循环中的continue语句相同的效果.如果你想继续按照它在C中的方式工作,你必须抛出一个try / finally语句:

i = 0

while i < 7:

try:

if someCondition(i):

i = 5

elif otherCondition(i):

continue

print 'i = %d' % i

finally:

i += 1

如你所见,这非常难看.你应该寻找更多的Pythonic方式来编写你的循环.

UPDATE

这刚刚发生在我身上……有一个复杂的答案让你像C风格的循环一样使用普通的Python for循环,并允许通过编写自定义迭代器来更新循环变量.我不会为任何真正的程序推荐这个解决方案,但这是一个有趣的练习.

循环示例“C风格”:

for i in forrange(10):

print(i)

if i == 3:

i.update(7)

输出:

0

1

2

3

8

9

诀窍是forrange使用int的子类来添加更新方法. forrange的实现:

class forrange:

def __init__(self, startOrStop, stop=None, step=1):

if step == 0:

raise ValueError('forrange step argument must not be zero')

if not isinstance(startOrStop, int):

raise TypeError('forrange startOrStop argument must be an int')

if stop is not None and not isinstance(stop, int):

raise TypeError('forrange stop argument must be an int')

if stop is None:

self.start = 0

self.stop = startOrStop

self.step = step

else:

self.start = startOrStop

self.stop = stop

self.step = step

def __iter__(self):

return self.foriterator(self.start, self.stop, self.step)

class foriterator:

def __init__(self, start, stop, step):

self.currentValue = None

self.nextValue = start

self.stop = stop

self.step = step

def __iter__(self): return self

def next(self):

if self.step > 0 and self.nextValue >= self.stop:

raise StopIteration

if self.step < 0 and self.nextValue <= self.stop:

raise StopIteration

self.currentValue = forrange.forvalue(self.nextValue, self)

self.nextValue += self.step

return self.currentValue

class forvalue(int):

def __new__(cls, value, iterator):

value = super(forrange.forvalue, cls).__new__(cls, value)

value.iterator = iterator

return value

def update(self, value):

if not isinstance(self, int):

raise TypeError('forvalue.update value must be an int')

if self == self.iterator.currentValue:

self.iterator.nextValue = value + self.iterator.step

标签:python

来源: https://codeday.me/bug/20190926/1821969.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值