• tyler@programming.dev
      link
      fedilink
      arrow-up
      14
      arrow-down
      3
      ·
      2 days ago

      List comprehensions are much stranger than tabs vs spaces. There are very very very few languages that use them, and python’s is by far the worst out of the popular ones.

        • tyler@programming.dev
          link
          fedilink
          arrow-up
          1
          ·
          17 hours ago

          I’m not saying I don’t understand them. I’m saying the syntax is terrible. Compare it to Ruby (or any other modern language) and it’s abundantly clear.

          python (uses syntax not available in any other top 25 language)

          print([j**2 for j in [2, 3, 4, 5]]) # => [4, 9, 16, 25]
          

          ruby (normal chain syntax with map)

          puts [2, 3, 4, 5].map{|j| j**2}
          

          even kotlin is more readable, even though you have to convert to a double and back kotlin

          val list = listOf(1,2,3,4)
          println(list.map{it.toDouble().pow(2.0).toInt()})
          

          For nested cases it’s even more apparent:

          python

          digits = [1, 2, 3]
          chars = ['a', 'b', 'c']    
          print([str(d)+ch for d in digits for ch in chars if d >= 2 if ch == 'a'])    
          # => ['2a', '3a']
          

          ruby

          digits = [1, 2, 3]
          chars = ['a', 'b', 'c']   
          digits.product(chars).select{ |d, ch| d >= 2 && ch == 'a' }.map(&:join)
          

          kotlin

          val digits = listOf(1, 2, 3)
          val chars = listOf('a', 'b', 'c')
          println(digits.flatMap { d ->
              chars.filter { ch -> d >= 2 && ch == 'a' }.map { ch -> "${d}${ch}" }})
          

          just from a base level, you have to read the middle of the comprehension first, then the end, then the beginning. It’s a completely backwards way to write and read code. unlike other languages that use a ‘functional’ approach, where it’s chained methods or pipes, etc. Even Elixir, which does have list comprehensions, reads and writes in the proper order:

          elixir

          for x <- 0..100, x * x > 3, do: x * 2
          
        • unit327@lemmy.zip
          link
          fedilink
          arrow-up
          10
          ·
          2 days ago

          The concept of a list comprehenshion is sinple but syntax is awful, as if Yoda was writing a for loop. “x for x in y it is, hmm yes”.

    • aloofPenguin@lemmy.world
      link
      fedilink
      arrow-up
      6
      arrow-down
      4
      ·
      2 days ago

      This is the one thing I hate about python, because the spacing would differ between editors. I used vim to create the files on one system, and geany to edit them on another. Via uses 8 spaces in a tab (at least for me), while geany uses 4. This makes python mad, and drives me crazy.

      Also, the rules for whitespace separation between things like loops, methods, and the rest of the code is annoying/ wierd (at least to me).

      • who@feddit.org
        link
        fedilink
        English
        arrow-up
        15
        ·
        2 days ago

        Via uses 8 spaces in a tab (at least for me), while geany uses 4.

        You know that editors let you change their defaults, right?

        • Eager Eagle@lemmy.world
          link
          fedilink
          English
          arrow-up
          4
          ·
          edit-2
          2 days ago

          and that indentation defaults in decent editors are usually language dependent. I’m not familiar with these editors, but… come on - if they use one default for all files, OP should use a better tool.

        • aloofPenguin@lemmy.world
          link
          fedilink
          arrow-up
          1
          ·
          2 days ago

          Yes, but I don’t normally program in python, so I never did. When I had to, I never thought of changing it (it wasn’t for long anyways and was less of a thought out decision to do programming in vim)