Whether you like it or not, you already use different languages each day: SQL, Javascript, Python, C++ & more. Wisdom goes that learning different programming languages will help you become a better programmer, but many programmers don't get this benefit & feel that it's a waste of time. After talking & working with many of them for many years, I found out that they learn the syntax of the language, maybe some libraries, but they don't learn the soul of the language.

Examples

# Bad: you need to read to the end to know the code intention
img.find('.jpg') != -1
img.find('.jpg') >= 0

# Good.Easier to read
'.jpg' in img
'.jpg' not in img
# Bad. Hard-coded number
img[-4:] == '.jpg'

# Good. Works with any string of any length
img.endswith('.jpg')
# Bad
(img.endswith('.jpg') or 
    img.endswith('.jpeg') or
    img.endswith('.png') or 
    img.endswith('.gif'))

# Good: uses python built-in capabilities to make code more compact
img.endswith((".jpg", ".jpeg", ".png", ".gif"))
# Bad
(path == 'js' or 
    path == 'css' or 
    path == 'img' or
    path == 'font' or
    path == 'fonts')

# Good. Compact code.
path in ('js', 'css', 'img', 'font', 'fonts')
# Bad
(os.path.exists(os.path.join(path, "space")) or 
    os.path.exists(os.path.join(path, "bucket")) or 
    os.path.exists(os.path.join(path, "actor")))

# Good. Compact code. Reads better. 
# The list can be moved to a different file
any(
    os.path.exists(os.path.join(path, item)) 
    for item in ["space", "bucket", "actor"])
# Bad
for i in range(len(lst)):
    elt = lst[i]
    print i, elt

# Good. Uses built-in python functions
for i, elt in enumerate(lst):
    print i, elt
# Bad
print 'Hello ', name, '. You are ', age, ' years old'

# Good. Reflects the structure of the intended output
print 'Hello {name}. You are {age} years old'.format(name=name, age=age)
# Bad
if not (key in dict):
    print 'Key missing'

# Good. Reads better
if key not in dict:
    print 'Key missing'
# Bad
s = names[0]
for name in names[1:]:
    s += ', ' + name

# Good. Doesn't have the off-by-one issues. Also faster
s = ', '.join(names)
# Bad
# Find if array1 is a subset of array2
is_subset = True
for x in array1:
    found = False
    for y in array2:
        if x == y:
            found = True
            break

    if not found:
        is_subset = False
        break

# Good. 2 lines instead of 10!
def subset_of(array1, array2):
    return set(array1).issubset(array2)
# Bad 
if case_sensitivity.lower() == 'sensitive':
    matcher = fnmatch.fnmatchcase
elif case_sensitivity.lower() == 'insensitive':
    def matcher(fname, pattern):
        return fnmatch.fnmatchcase(fname.lower(), pattern.lower())
else:
    matcher = fnmatch.fnmatch

# Good. The match code can be moved to a different file
matchers = {
'sensitive': fnmatch.fnmatchcase
'insensitive': lambda fname, pattern: fnmatch.fnmatchcase(fname.lower(), pattern.lower())
}.get(case_sensitivity.lower(), fnmatch.fnmatch)

Read more