Please don't use these one liners in any interview, or in any production based code. The article is just for fun seeing the replacement of some programs/code block in one line. Some like list comprehension is a must know as well.
Hi folks, I am Yash Makan and in today's blog, we are going to talk about one-liners in python. I clearly remember when I chose to learn python it was just because of the simplicity and readability. But you know what you can make the python code even more easy with less lines of code. Yup! thats right my friend. These one-liner code can save you a lot of time, memory and can impress your friends...
what is a one-liner code?
You can think of one-liner code as a block of code compressed together so that it fits inside one line. It is the concise, useful programs packed in just one single line.
why do I need them?
So if you are not a big fan of writing one-liners or you are just curious that why do I have to know these then below are some pretty convincing topics.
- Understanding One-liners will make a python expert as you will get a much better understanding of the language.
- This will help you to write the code faster. You can write the piece of code much faster than others which will help you in competitive programming.
- On-liners will improve your basics and roots of programming as they strengthen your basics.
- You will write the code more in a pythonic way. Generally, people who come from different languages often write code in an un-pythonic way in python for example they don't use list comprehension, multiple assignments, and slicing etc.
- You can impress your friends, colleagues and you can give a good impression in your interview if you have a good grasp of one-liners.
But also it can be a little hard as well. Imagine programming as chess. You know the basics is like knowing what is variables, loops, conditions, data structures, classes but learning the master movies and creating your own strategy is like one-liners. In the beginning, it can be hard and quite overwhelming but once you get to know them. You can achieve greatness and win matches faster than a lot of other players. Everything has a price to pay my friend...
Basics
1. If-else
Before
if 3 < 2:
var=21
else:
var=42
After
var = 21 if 3<2 else 42
2. Elif
Before
>>> x = 42
>>> if x > 42:
>>> print("no")
>>> elif x == 42:
>>> print("yes")
>>> else:
>>> print("maybe")
yes
After
>>> print("no") if x > 42 else print("yes") if x == 42 else print("maybe")
yes
3. If without else
Before
condition = True
if condition:
print('hi')
After
if condition: print('hello')
print('hello') if condition else None
4. Function
Before
def f(x):
return "hello "+ x
After
f = lambda x: "hello "+ x
f = exec("def f(x):\n return 'hello '+ x")
5. Loop(list comprehension)
Before
squares = []
for i in range(10):
squares.append(i**2)
After
squares=[i**2 for i in range(10)]
6. Loop with If
Before
squares = []
for i in range(10):
if i%2==0:
squares.append(i**2)
After
squares = [i**2 for i in range(10) if i%2==0]
7. Loop with if else
Before
squares = []
for i in range(10):
if i%2==0:
squares.append(i**2)
else:
squares.append(False)
After
squares = [i**2 if i%2==0 else False for i in range(10)]
8. While Loop with if else
Before
c=0
while c < 10:
if c!=5:
print(c)
else:
print("FIVE")
c+=1
After
while c < 10: c+=1; print(c) if c!=5 else print("FIVE")
9. swap variables
Before
>>> def swap(x,y):
x = x ^ y
y = x ^ y
x = x ^ y
return x, y
>>> swap(10,20)
(20,10)
After
>>> x, y = 10, 20
>>> x, y = y, x
(20, 10)
10. Multiple Assignment
Before
a="ONE"
b=2
c=3.001
After
a, b, c = "One", 2, 3.001
11. Write String In File
Before
text = "Helllloooooo"
fileName = "hello.txt"
f=open(fileName, "a")
f.write(text)
f.close()
After
text = "Helllloooooo"
fileName = "hello.txt"
print(text, file=open(fileName, 'a'))
12.Quicksort
Before
# Source - https://stackabuse.com/quicksort-in-python/
def partition(array, start, end):
pivot = array[start]
low = start + 1
high = end
while True:
while low <= high and array[high] >= pivot:
high = high - 1
while low <= high and array[low] <= pivot:
low = low + 1
if low <= high:
array[low], array[high] = array[high], array[low]
else:
break
array[start], array[high] = array[high], array[start]
return high
def quick_sort(array, start, end):
if start >= end:
return
p = partition(array, start, end)
quick_sort(array, start, p-1)
quick_sort(array, p+1, end)
array = [29,99,27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21,44]
quick_sort(array, 0, len(array) - 1)
print(array)
After
array = [29,99,27,41,66,28,44,78,87,19,31,76,58,88,83,97,12,21,44]
q = lambda l: q([x for x in l[1:] if x <= l[0]]) + [l[0]] + q([x for x in l if x > l[0]]) if l else []
print(q(array))
13. Fibonacci
Before
def fib(x):
if x <= 2:
return 1
return fib(x - 1) + fib(x - 2)
After
fib=lambda x: x if x<=1 else fib(x-1) + fib(x-2)
14. HTTP Server
Before
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
After
python -m http.server 8000
15. Nested For Loops
Before
iter1 = [1, 2, 3, 4]
iter2 = ['a', 'b', 'c']
for x in iter1:
for y in iter2:
print(x, y)
After
[print(x, y) for x in iter1 for y in iter2]
16. Print Without Newline
Before
for i in range(1,5):
print(i, end=" ")
After
print(*range(1,5))
17. Class
Before
class School():
fun = {}
After
School = type('School', (object,), {'fun':{}})
18. Walrus:= (Python 3.8)
Before
command = input("> ")
while command != "quit":
print("You entered:", command)
After
while (command := input("> ")) != "quit": print("You entered:", command)
Conclusion
So now you have some understanding of python one-liners and this will help to speed up your coding process. I hope that you've learnt something new from this article as I myself get to know some cool tricks and one-liners that I didn't know earlier. If this is the case with you as well then do click the heart button when increases my motivation(1 like = 1 good karma). Also, share the post with your friends so that they too can learn something new(don't be selfish...). Hope to be in your mind again, till then b-bye!
Other Articles
- 4 Free hosting platforms for python web app with step-by-step process
- AI bot that could answer your questions
- Generate your own favourite TV episode using python
Top comments (27)
Any programmer that is mainly limited by their typing speed should seriously consider a career change.
In competitive programming, every second matters. But, yes, in production these fragments are not acceptable. Readability of a codebase is much more important.
Great idea for an article. 11 and 14 seem quite interesting. However:
At least 2,4,8,12,13 and 17 are absolute no-go for an interview. You can impress your friends with them, but never ever use them again.
You should consider removing them from the article or mark them somehow. Experienced developer will just laugh at it, begginer may learn a bad habit.
Yeh, pretty much anything here that has a colon is an unreadable, worthless one liner, except maybe for helping copy/paste to run it with
python -c "bad_one_liner; some_other_function()
And anything that tries to take advantage of a list comprehension or conditional/ternary assignment for the side effects, like 2 and 15, makes me cringe hard.
Though these can arguably fixed and can even be useful for long expressions, especially when used to the extra whitespace of the
black
formatter. Interestingly with things like this, it is often only readable with long variable names that force line splits. Each proposed alternative will be copied as a one-liner at the end.2. Honestly chaining conditional assignments just looks bad, but at least this actually uses expressions and doesn't rely on side effects.
And for good measure, here is an interesting yet even less readable way. You don't even need the inner parens, but then its even worse.
15. Thinking about which is the outer and inner loop makes anything like this a bit awkward
Alternatively, using "".join()
In this case you can use itertools.product which might make it clear that youre iterating over the cartesian product, instead of having to mentally unwrap a nested for loop
As promised, each as a one-liner. Im not sure I did anything to improve readability.
2.
15.
Thanks for reading!
Do not assign a lambda expression, use a def (E731). Most of these one-liners will be flagged by code quality tools.
The thing with clever code is: Most of the time you have to be twice as clever to debug it than to write it.
So don't be too clever when writing it and give yourself a chance of debugging it in the future.
Worse: everybody coming after you has to be. Of course, OP warned us in the introduction :).
I have added a note on the top of the Article to not use these one liner in any production based projects as the code becomes less readable. The article is just for exploring different ways of reducing the code size and for fun... If anybody is offended by the article then I am sorry and will take care of this in my future articles
Thanks
The article isn't offensive, Yash. Much of it just doesn't represent good coding practices so I'm glad you added the note at the top. As professional developers we need to be careful what advice we give to those with less experience. Keep sharing!
Yes! I agree with you. Thanks
It breaks the first few lines of the Zen of Python - PEP20
Interesting post! At work, I'm often just looking for quick ways to parse a one-off dataset or other small things like that, and it doesn't have to be readable or maintained by anyone but myself, so I use several of these (admittedly non-Pythonic) schemes. Writing for a team is different. This is still quite useful, especially to learn the extent of some of the nuanced features that this language has. Cheers.
print(*range(1,5)) didn't work for me (running Python 3.10), but Walrus:= taught me a new trick and I will definitely be using it.
Glad I could help. Thanks for reading
As someone who used these in the past during her studies, I personally would say that while they make the code more compact, depending on the situation they may also potentially compromise debugging and overall readability, especially if one uses a lot of them (I got a lot of complaints from teachers about my code being hard to follow when I was using a lot of one-line loops and had to rewrite them on spot). So I think at least a few of these are pretty situational IMO.
If you're going to toy with one-liners like this and justify it on the basis of learning (as most of these are not good practice as others have noted) then I'd suggest you add a little explanatory commentary to the one-liners. I mean for example a few of them are just standard list comprehensions but you don't mention that anywhere and that's a useful piece of vocabulary for a wannabe Python coder and you could group those under an embracing heading of "list comprehensions".
Just a thought.
Thanks for the note advice. Added the quote on top.