There are some chances to smooth out some warts. I like typed languages like TypeScript, though I find Python's type system not very natural comparatively.
My biggest gripe though is that it's not possible to write functional code where you can read the operations in order. For a contrived example, if you wanted to know the total length of all strings in a list that start with the letter 'a', you would do the following in C#:
strings
.Where(s => s.StartsWith('a'))
.Select(s => s.Length)
.Sum()
Each step follows the last: first you filter the list, then you get the lengths, then you add the lengths together.The equivalent in Python is this (I broke it out into multiple lines for a better 1:1 comparison):
sum(
len(s)
for s in strings
if s.startswith("a"))
Okay, maybe in this example the only difference is the location of the if, but in more complex example I really lose the flow by using list comprehensions.And before anyone says I can use `map` and `filter` assign each step to a variable and write it in an "imperative-ish" style, I find it difficult to come up with descriptive names for each intermediary variable, and don't want to call them `l1`, `l2`, etc.
Gripe over, hopefully I conveyed my message.