加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

C语言中的Python样式迭代器

发布时间:2020-12-16 23:30:04 所属栏目:Python 来源:网络整理
导读:python中的“yield”语句允许从过程进行简单迭代,这也意味着序列不需要预先计算并存储在“任意”大小的数组中. 是否有类似的方法从C过程迭代(带有yield)? 解决方法 下面是自我回答的社区维基副本,可以选择作为“答案”.请直接向上/向下指示实际的自我回答
python中的“yield”语句允许从过程进行简单迭代,这也意味着序列不需要预先计算并存储在“任意”大小的数组中.

是否有类似的方法从C过程迭代(带有yield)?

解决方法

下面是自我回答的社区维基副本,可以选择作为“答案”.请直接向上/向下指示实际的自我回答

这是我找到的方法:

/* Example calculates the sum of the prime factors of the first 32 Fibonacci numbers */
#include <stdio.h>

typedef enum{false=0,true=1}bool;

/* the following line is the only time I have ever required "auto" */
#define FOR(i,iterator) auto bool lambda(i); yield_init = (void *)&lambda; iterator; bool lambda(i)
#define DO {
#define     YIELD(x) if(!yield(x))return
#define     BREAK return false
#define     CONTINUE return true
#define OD CONTINUE; }
/* Warning: _Most_ FOR(,){ } loops _must_ have a CONTINUE as the last statement. 
 *  *   Otherwise the lambda will return random value from stack,and may terminate early */

typedef void iterator; /* hint at procedure purpose */
static volatile void *yield_init;
#define YIELDS(type) bool (*yield)(type) = yield_init

iterator fibonacci(int n){
   YIELDS(int);
   int i;
   int pair[2] = {0,1};
   YIELD(0); YIELD(1);
   for(i=2; i<n; i++){
      pair[i%2] = pair[0] + pair[1];
      YIELD(pair[i%2]);
   }
}

iterator factors(int n){
  YIELDS(int); 
  int i;
  for(i=2; i*i<=n; i++){
    while(n%i == 0 ){
      YIELD(i);
      n/=i;
    }
  }
  YIELD(n);
}

main(){
    FOR(int i,fibonacci(32)){
        printf("%d:",i);
        int sum = 0;
        FOR(int factor,factors(i)){
            sum += factor;
            printf(" %d",factor);
            CONTINUE;
        }
        printf(" - sum of factors: %dn",sum);
        CONTINUE;
    }
}

从http://rosettacode.org/wiki/Prime_decomposition#ALGOL_68获得了这个想法 – 但它在C中读得更好

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读