Python - Unsupported type(s) : range and range

前端 未结 4 1627
孤街浪徒
孤街浪徒 2021-01-18 01:55

I\'m getting this strange error trying to run a script, the code appears to be correct but it seems python (3) didn\'t liked this part:

        def function(         


        
相关标签:
4条回答
  • 2021-01-18 02:14

    In the middle of your expression you do range(-30,0) + range(1,30). This is causing the error because in Python 3 range() returns an iterator, not a list like in Python 2.x.

    One way to get this to work is to just convert each range to a list before adding:

    d = dict([(randrange(101), Racional(coeff(randrange(-20,20)),
                                    coeff(choice(list(range(-30,0))+
                                                 list(range(1,30))))))
             for k in range(non_nil)])
    

    Since it seems like you want to just exclude 0 from the range(-30, 30), you could also use filter(None, range(-30, 30)).

    Alternatively you could use choice((1, -1)) * choice(range(1, 30)), which is equivalent to choice(list(range(-30, 0)) + list(range(1, 30))). (edit: actually the prior expression will not include -30 in the possibilities, not sure whether or not that is an issue).

    0 讨论(0)
  • 2021-01-18 02:18

    This is because Python 3 range does not return a list, unlike Python 2. This code was written for Python 2.

    This code should be changed:

    range(-30,0) + range(1,30)
    

    It should be changed to:

    [*range(-30,0), *range(1,30)]
    

    Prior to Python 3.5 (2015, PEP 448 - Additional Unpacking Generalizations), you cannot use * inside lists, and must write it this way instead (or you may prefer this):

    list(range(-30,0)) + list(range(1,30))
    
    0 讨论(0)
  • 2021-01-18 02:19

    As others have pointed out the problem is that in Python 3, range() returns an iterator not a list like it does in Python 2.

    Here' one workaround: Add something like the following function:

    def non_zero_range(lower, upper):
        ret = list(range(lower, upper))
        ret.remove(0)
        return ret
    

    and then change the second Racional() call argument from:

    coeff(choice(range(-30,0)+range(1,30)))
    

    to simply:

    coeff(choice(non_zero_range(-30,30)))
    

    You will have something that would work in both Python 2 and 3.

    0 讨论(0)
  • 2021-01-18 02:26

    As other answers have said, range() being an iterator is your problem, however, a simpler (in my view) solution is to generate the list from -30 to 30 then remove 0, rather than avoiding it:

    choice([i for i in range(-30, 30) if i != 0])
    

    Naturally, if your ranges were more disparate, this might become unwieldy.

    0 讨论(0)
提交回复
热议问题