• LostXOR@fedia.io
    link
    fedilink
    arrow-up
    132
    ·
    3 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())))))) # 'ඞ'
    
      • takeda@lemm.ee
        link
        fedilink
        arrow-up
        22
        ·
        edit-2
        2 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.

    • Ziglin (it/they)@lemmy.world
      link
      fedilink
      English
      arrow-up
      11
      ·
      3 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
        23
        ·
        3 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
          7
          ·
          3 days ago

          Are you sure?

          I can’t test it now, but to me it looks like () is an empty tuple. Python behavior is that for logic operations empty set equals to false. Then we apply not to get True. Not having space between not operator and parentheses makes it look like it is a function.

        • Ziglin (it/they)@lemmy.world
          link
          fedilink
          English
          arrow-up
          5
          ·
          3 days ago

          Why is literally nothing equivalent to None? Is it because None is the default value of an optional parameter? (If so why oh why is it optional)

          • spooky2092@lemmy.blahaj.zone
            link
            fedilink
            English
            arrow-up
            5
            ·
            edit-2
            3 days ago

            Because nothing isn’t something, and something is true. It’s base Boolean logic where everything is either true or false. Null/nothing is false.

            It’s a weird way to think about conditionals, but it makes sense when you use them in real examples. In my case, I use them like this when I need to make sure that a variable has a value. So I can do something like

            If(variable){do things with the variable}else{do stuff when the variable doesn’t exist}

                • Ziglin (it/they)@lemmy.world
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  2 days ago

                  That makes a lot more sense, thanks I did see in the syntax highlighting that it was a keyword but forgot that none of them took parameters.

              • spooky2092@lemmy.blahaj.zone
                link
                fedilink
                English
                arrow-up
                1
                ·
                2 days ago

                No it’s not, “” (a null/empty string) is the parameter. Not every function needs a parameter to be valid, and negation is one of them. Negating nothing is something, so “not()” = “not(null)” = “not(false)” = “true”

          • Pup Biru@aussie.zone
            link
            fedilink
            English
            arrow-up
            3
            ·
            3 days ago
            a  = null
            if not a:
               
            

            if not a were null then an if that evaluates that would evaluate it as falsy… also if a would evaluate as falsy :/ that’s far weirder behaviour