1

Python を勉強していますが、イテレータの使い方がわかりません。

コードを書く必要があります。C では次のようになります。

list_node *cp = list_of_chars;
char dp = '>'; int flag = 0;
while (cp != NULL)
{ if( isdigit(cp->val) ) 
  { printf("%c",cp->val);
    if( cp->val == '0' )
    { cp->prev->next = cp->next; cp->next->prev = cp->prev; }
    else cp->val--;
  }
  else if( (cp->val == '>') || (cp->val == '<') )
  { dp = cp->val; flag = 1; }

       if( dp == '>' ) cp = cp->next;
  else if( dp == '<' ) cp = cp->prev;
  else return ERR;

  if( flag && ( (cp->val == '>') || (cp->val == '<') ))
  { cp->prev->prev->next = cp;
    cp->prev = cp->prev->prev;
  }
}

このコードを Python に翻訳するのを手伝ってくれませんか? 私は書き始めましたが、いくつかのエラーがあり、ドキュメントを理解しているかどうかわかりません。

  ip = {'cp' : iter(program), 'dp' : '>'}
  flag = 0

  while ip['cp'] != []:

    if ('0' <= ip['cp']) & (ip['cp'] <= '9'):
      print ip['cp']
      if ip['cp'] == '0': ip['cp']  = []
      else:               ip['cp'] -= 1

    elif (ip['cp'] == '>') | (ip['cp'] == '<'):
      ip['dp'] = ip.['cp']
      flag = 1

    else: raise NameError('incorrect cp-value')

    if   ip['dp'] == '>': ip['cp'].next()
    elif ip['dp'] == '<': ip['cp'].prev()
    else: raise NameError('incorrect dp-value')

    if flag & ( (ip['cp'] == '>') | (ip['cp'] == '<') ):
      ip['cp'].prev()
      ip['cp'] = []

問題は、関数 next() なしでイテレータの値を取得する方法です。

イテレータを高度に使用した python-expert コードの例も見たいです。

4

2 に答える 2

3

さて、あなたのpythonコードにはたくさんの問題があります。

簡単なことから始めましょう

while ip['cp'] != []:

単純に書くことができます

while ip['cp']:

偽りの値ではない間、それは行いip['cp']ます。[], None, ''たとえば、誤った値です。

それ以外の:

if   ip['dp'] == '>': ip['cp'].next()
elif ip['dp'] == '<': ip['cp'].prev()
else: raise NameError('incorrect dp-value')

書きます

if ip['dp'] == '>': 
    ip['cp'].next()
elif ip['dp'] == '<':
    ip['cp'].prev()
else: 
    raise NameError('incorrect dp-value')

場合によっては、インライン コードを記述しても機能します。読みやすさを考えてください。インライン コードは、コードを読みやすくデバッグしやすくするための良い出発点になることはほとんどありません。また、構文エラーの 90% を簡単に修正できます。

ここから楽しみが始まります...

  if( cp->val == '0' )
  { cp->prev->next = cp->next; cp->next->prev = cp->prev; }
  else cp->val--;

  if ip['cp'] == '0': ip['cp']  = []
  else:               ip['cp'] -= 1

Python では '0' は string0です。Python では、文字列オブジェクトがある場合、文字列を操作しています。数字があるときは数字を扱っています... つまり、Python で記述しようとしているコードは、純粋に Python に変換することはできません。Python 文字列の最後の文字が '\0' ではありません。文字列の最後の文字です。つまり、C のように最後の文字を実際にテストできます。

それでは、イテレータについて話しましょう

とはいえ、コード内の他のすべての問題を無視して、イテレータを操作する方法を次に示します。

iter()イテレータを返す組み込み関数です。ほとんどの場合、自分で呼び出す必要はありません。あなたのためにそれを行う構造があります。

たとえば、次のように記述できます。

iterable = iter('string')
iterable.next() == 's'
iterable.next() == 't'
... Until StopIteration is raised

for i in iter('string'):

以下と同じです:

for i in 'string':

そうは言っても、イテレータは何かを反復処理するために使用されます。あなたが本当に探しているのはイテレータではありません。イテレータは一方向のものだからです。最後まで行くことができ、戻ることはできません。以前はありません。あなたのCコードは iterable で使用できるリンクリストを実装していますが、あなたのコードではいくつかのノードの位置を変更しています。

Python コードを書きたい場合は、Python で C コードを書かないでください。

于 2012-11-10T17:28:29.700 に答える