1 2cimport cython 3 4## def range_tuple_genexp(int N): 5## """ 6## >>> range_tuple_genexp(5) 7## (0, 1, 2, 3, 4) 8## """ 9## return tuple(i for i in range(N)) 10 11 12@cython.test_assert_path_exists('//ForFromStatNode', 13 "//InlinedGeneratorExpressionNode") 14@cython.test_fail_if_path_exists('//SimpleCallNode', 15 '//ForInStatNode') 16def range_sum(int N): 17 """ 18 >>> sum(range(10)) 19 45 20 >>> range_sum(10) 21 45 22 """ 23 result = sum(i for i in range(N)) 24 return result 25 26 27@cython.test_assert_path_exists('//ForFromStatNode', 28 "//InlinedGeneratorExpressionNode") 29@cython.test_fail_if_path_exists('//SimpleCallNode', 30 '//CoerceFromPyTypeNode//InlinedGeneratorExpressionNode', 31 '//ForInStatNode') 32def range_sum_typed(int N): 33 """ 34 >>> sum(range(10)) 35 45 36 >>> range_sum_typed(10) 37 45 38 """ 39 cdef int result = sum(i for i in range(N)) 40 return result 41 42 43@cython.test_assert_path_exists('//ForFromStatNode', 44 "//InlinedGeneratorExpressionNode", 45 "//ReturnStatNode//InlinedGeneratorExpressionNode", 46 "//ReturnStatNode//CoerceToPyTypeNode//InlinedGeneratorExpressionNode") 47@cython.test_fail_if_path_exists('//SimpleCallNode', 48 '//CoerceFromPyTypeNode//InlinedGeneratorExpressionNode', 49 '//TypecastNode//InlinedGeneratorExpressionNode', 50 '//ForInStatNode') 51def return_range_sum_cast(int N): 52 """ 53 >>> sum(range(10)) 54 45 55 >>> return_range_sum_cast(10) 56 45 57 """ 58 return <int>sum(i for i in range(N)) 59 60 61@cython.test_assert_path_exists('//ForFromStatNode', 62 "//InlinedGeneratorExpressionNode") 63@cython.test_fail_if_path_exists('//SimpleCallNode', 64 '//ForInStatNode') 65def return_range_sum(int N): 66 """ 67 >>> sum(range(10)) 68 45 69 >>> return_range_sum(10) 70 45 71 """ 72 return sum(i for i in range(N)) 73 74 75@cython.test_assert_path_exists('//ForFromStatNode', 76 "//InlinedGeneratorExpressionNode") 77@cython.test_fail_if_path_exists('//SimpleCallNode', 78 '//ForInStatNode') 79def return_range_sum_squares(int N): 80 """ 81 >>> sum([i*i for i in range(10)]) 82 285 83 >>> return_range_sum_squares(10) 84 285 85 86 >>> print(sum([i*i for i in range(10000)])) 87 333283335000 88 >>> print(return_range_sum_squares(10000)) 89 333283335000 90 """ 91 return sum(i*i for i in range(N)) 92 93 94@cython.test_assert_path_exists('//ForInStatNode', 95 "//InlinedGeneratorExpressionNode") 96@cython.test_fail_if_path_exists('//SimpleCallNode') 97def return_sum_squares(seq): 98 """ 99 >>> sum([i*i for i in range(10)]) 100 285 101 >>> return_sum_squares(range(10)) 102 285 103 104 >>> print(sum([i*i for i in range(10000)])) 105 333283335000 106 >>> print(return_sum_squares(range(10000))) 107 333283335000 108 """ 109 return sum(i*i for i in seq) 110 111 112@cython.test_assert_path_exists('//ForInStatNode', 113 "//InlinedGeneratorExpressionNode") 114@cython.test_fail_if_path_exists('//SimpleCallNode') 115def return_sum_squares_start(seq, int start): 116 """ 117 >>> sum([i*i for i in range(10)], -1) 118 284 119 >>> return_sum_squares_start(range(10), -1) 120 284 121 122 >>> print(sum([i*i for i in range(10000)], 9)) 123 333283335009 124 >>> print(return_sum_squares_start(range(10000), 9)) 125 333283335009 126 """ 127 return sum((i*i for i in seq), start) 128 129 130@cython.test_assert_path_exists( 131 '//ForInStatNode', 132 "//InlinedGeneratorExpressionNode") 133@cython.test_fail_if_path_exists( 134 '//SimpleCallNode', 135 "//InlinedGeneratorExpressionNode//CoerceToPyTypeNode") 136def return_typed_sum_squares_start(seq, int start): 137 """ 138 >>> sum([i*i for i in range(10)], -1) 139 284 140 >>> return_typed_sum_squares_start(range(10), -1) 141 284 142 143 >>> print(sum([i*i for i in range(1000)], 9)) 144 332833509 145 >>> print(return_typed_sum_squares_start(range(1000), 9)) 146 332833509 147 """ 148 cdef int i 149 return <int>sum((i*i for i in seq), start) 150 151 152@cython.test_assert_path_exists('//ForInStatNode', 153 "//InlinedGeneratorExpressionNode") 154@cython.test_fail_if_path_exists('//SimpleCallNode') 155def return_sum_of_listcomp_consts_start(seq, int start): 156 """ 157 >>> sum([1 for i in range(10) if i > 3], -1) 158 5 159 >>> return_sum_of_listcomp_consts_start(range(10), -1) 160 5 161 162 >>> print(sum([1 for i in range(10000) if i > 3], 9)) 163 10005 164 >>> print(return_sum_of_listcomp_consts_start(range(10000), 9)) 165 10005 166 """ 167 return sum([1 for i in seq if i > 3], start) 168 169 170@cython.test_assert_path_exists('//ForInStatNode', 171 "//InlinedGeneratorExpressionNode", 172 # the next test is for a deficiency 173 # (see InlinedGeneratorExpressionNode.coerce_to()), 174 # hope this breaks one day 175 "//CoerceFromPyTypeNode//InlinedGeneratorExpressionNode") 176@cython.test_fail_if_path_exists('//SimpleCallNode') 177def return_typed_sum_of_listcomp_consts_start(seq, int start): 178 """ 179 >>> sum([1 for i in range(10) if i > 3], -1) 180 5 181 >>> return_typed_sum_of_listcomp_consts_start(range(10), -1) 182 5 183 184 >>> print(sum([1 for i in range(10000) if i > 3], 9)) 185 10005 186 >>> print(return_typed_sum_of_listcomp_consts_start(range(10000), 9)) 187 10005 188 """ 189 return <int>sum([1 for i in seq if i > 3], start) 190 191 192@cython.test_assert_path_exists( 193 '//ForInStatNode', 194 "//InlinedGeneratorExpressionNode") 195@cython.test_fail_if_path_exists( 196 '//SimpleCallNode', 197 "//InlinedGeneratorExpressionNode//CoerceToPyTypeNode") 198def return_typed_sum_cond_exp(seq): 199 """ 200 >>> return_typed_sum_cond_exp([1,2,3,4]) 201 2 202 """ 203 cdef int i 204 return <int>sum( 0 if i%2 else 1 205 for i in seq ) 206 207 208@cython.test_assert_path_exists( 209 '//ForInStatNode', 210 "//InlinedGeneratorExpressionNode") 211@cython.test_fail_if_path_exists( 212 '//SimpleCallNode', 213 "//InlinedGeneratorExpressionNode//CoerceToPyTypeNode") 214def return_typed_sum_cond_exp_in(seq): 215 """ 216 >>> return_typed_sum_cond_exp_in([1,2,3,4,5,6,7,8,9]) 217 3 218 """ 219 cdef int i 220 return <int>sum( 0 if i%3 in (0,1) else 1 221 for i in seq ) 222