• LostXOR@fedia.io
    link
    fedilink
    arrow-up
    6
    ·
    4 days ago

    In case anyone’s curious:

    not() # True
    str(not()) # 'True'
    min(str(not())) # 'T'
    ord(min(str(not()))) # 84
    range(ord(min(str(not())))) # range(0, 84)
    sum(range(ord(min(str(not()))))) # 3486
    chr(sum(range(ord(min(str(not())))))) # 'ඞ'
    
    • Ziglin (it/they)@lemmy.world
      link
      fedilink
      English
      arrow-up
      0
      ·
      4 days ago

      Why does not without a parameter return True? I’m starting to like the fact that I haven’t touched python in a while.

      • LostXOR@fedia.io
        link
        fedilink
        arrow-up
        1
        ·
        4 days ago

        I think it’s because not() is equivalent to not(None), and since None is falsy not(None) returns True.

      • takeda@lemm.ee
        link
        fedilink
        arrow-up
        3
        ·
        edit-2
        3 days ago

        Python, but this is actually defined and documented behavior.

        Edit: to illustrate what I mean:

        not() # True
        

        this actually is not () (the lack of space makes it look like a function), () is a tuple, in python an empty collection returns False, this is to make checks simpler. You can type:

        if my_list:
          do something
        

        instead of

        if len(my_list) > 0:
          do something
        

        not negates it so you get True

        str(not()) # 'True'
        

        converts resulting bool type into a string representation

        min(str(not())) # 'T'
        

        This might feel odd, but that’s also documented. min() not only allows to compare two numbers like it is in most languages, but you can also provide a sequence of values and it will return the smallest one.

        String is a sequence of letters.

        Letters are comparable according to ASCII (so you can do sorting). In ASCII table capital letters are first, so the ‘T’ is the smallest value.

        ord(min(str(not()))) # 84
        

        this just converts ‘T’ to Unicode value which is 84

        range(ord(min(str(not())))) # range(0, 84)
        

        This creates a sequence of numbers from 0 to 83

        sum(range(ord(min(str(not()))))) # 3486
        

        This works like min() except adds up all the numbers in the sequence together, so in our case 0+1+2+3+…+83 = 3486

        chr(sum(range(ord(min(str(not())))))) # 'ඞ'
        

        reverse of ord(), converts Unicode value to a character.