python

Python 3 Top 50 Tips & Tricks

2020-09-09  本文已影响0人  Python_Camp

'''
Python 3: Top 50 Tips & Tricks
Here is a list of python tips and tricks to help you write an elegant Python 3 code! This article is divided into different kinds of tricks:
Python iterable tricks.
Python comprehension tricks.
Python unpacking tricks.
Python itertools tricks.
Python collections tricks.
Python other tricks.
Python easter eggs.
Python tricks to understand the context.

'''

#1. Python Iterables tricks
#Creating a sequence of numbers (zero to ten with skips).
range(0 ,10 ,2)
#[0, 2, 4, 6, 8]

#Summing a sequence of numbers (calculating the sum of zero to ten with skips).
l = range(0 ,10 ,2)
sum(l)
#20
#Checking whether any element in the sequence is Truthful (checking whether any elements between zero and ten with skips are even).
any(a % 2== 0 for a in range(0, 10, 2))
#True
#Checking whether all elements in the sequence are Truthful(checking whether)
#all elements between zero and ten with skips are even).

all(a % 2 == 0 for a in range(0, 10, 2))
#True
#Cumulative summing a sequence of numbers(calculating the
#cumulative sum of zero to ten with skips).

import numpy as np
res = list(np.cumsum(range(0, 10, 2)))
print(res)
#[0, 2, 6, 12, 20]

#Given each iterable we construct a tuple by adding an index.
a = ['Hello', 'world', '!']
list(enumerate(a))
#[(0, 'Hello'), (1, 'world'), (2, '!')]

#Concatenating iterable to a single string.
a = ["python", "really", "rocks"]
" ".join(a)
'python really rocks'

#Combining two iterable of tuples or pivot nested iterables.
# Combining two iterables
a = [1, 2, 3]
b = ['a', 'b', 'c']
z = zip(a, b)
print(z)
#[(1, 'a'), (2, 'b'), (3, 'c')]

# Pivoting list of tuples
zip(*z)
#[(1, 2, 3), ('a', 'b', 'c')]

#Getting min / max
# from iterable (with/ without specific function).
# Getting maximum from iterable
a = [1, 2, -3]
max(a)
#2

# Getting maximum from iterable
min(a)
#1

# Bot min/max has key value to allow to get maximum by appliing function
max(a, key=abs)
#3

#Getting sorted iterable(can sort by compare function).
a = [1, 2, -3]
sorted(a)
#[-3, 1, 2]

sorted(a, key=abs)
#[1, 2, -3]

#Splitting a single string to list.
s = "a,b,c"
s.split(",")
#["a", "b", "c"]

#Initializing a list filled with some repetitive number.
print([1] * 10)
#[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

#Merging / Upserting two dictionaries.
a = {"a": 1, "b": 1}
b = {"b": 2, "c": 1}
a.update(b)
print(a)
#{"a": 1, "b": 2, "c": 1}

#Naming and saving slices of iterables.
# Naming slices (slice(start, end, step))
a = [0, 1, 2, 3, 4, 5]
LASTTHREE = slice(-3, None)
print(LASTTHREE)

slice(-3, None, None)
print(a[LASTTHREE])
#[3, 4, 5]

#Finding the index of an item in a list.
a = ["foo", "bar", "baz"]
a.index("bar")
#1

#Finding the index of the min / max item in an iterable.
a = [2, 3, 1]
min(enumerate(a), key=lambda x: x[1])[0]
#2

#Rotating iterable by k elements.
a = [1, 2, 3, 4]
k = 2
print(a[-2:] + a[:-2])
#[3, 4, 1, 2]

#Removing useless characters on the end/start/ both of your string.
name = "//George//"
name.strip("/")
'George'
name.rstrip("/")
'//George'
name.lstrip("/")
'George//'

#Reversing an iterable wit order(string, list etc).
# Reversing string
s = "abc"
print(s[::-1])
"cba"

# Reversing list
l = ["a", "b", "c"]
l[::-1]
#["c", "b", "a"]

#2.Python branching tricks Multiple predicates short - cut.
n = 10
print(1 < n < 20)
#True

#For - else construct useful when searched
# for something and find it.
# For example assume that I need to search through a list and process each item until a flag item is found and
# then stop processing. If the flag item is missing then an exception needs to be raised.
mylist = ['red','blue','yellow']
'''
for i in mylist:
    if i == theflag:
        break
    process(i)
else:
    raise ValueError("List argument missing terminal flag.")
'''

# operator.
# "Python ROCK" if True else " I AM GRUMPY"
"Python ROCK"

def foo(a,b):
    return a/b
#Try - catch - else construct.
try:
    foo(a,b)
except Exception:
    print("Exception occured")
else:
    print("Exception didnt occur")
finally:
    print("Always gets here")

#While - else construct.
i = 5
while i > 1:
    print("Whil-ing away!")
    i -= 1
    if i == 3:
        break
else:
    print("Finished up!")

#3. Python comprehensions tricks comprehension.
m = [x ** 2 for x in range(5)]
print(m)
#[0, 1, 4, 9, 16]

#Set comprehension.
m = {x ** 2 for x in range(5)}
print(m)
#{0, 1, 4, 9, 16}

#Dict comprehension.
m = {x: x ** 2 for x in range(5)}
print(m)
#{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

#Generator comprehension.
# A generator comprehension is the lazy version of a list comprehension.
m = (x ** 2 for x in range(5))
print(m)
#< generator object < genexpr > at 0x108efe408 >
list(m)
#[0, 1, 4, 9, 16]

m = (x ** 2 for x in range(5))
next(m)
#0
list(m)
#[1, 4, 9, 16]

#List comprehension with the current and previous value.
a = [1, 2, 4, 2]
print([y - x for x, y in zip(a, a[1:])])
#[1, 2, -2]

#Note: all comprehension can use predicates with if statement.

#4. Python unpacking tricks Unpack variables from iterable.
# One can unpack all iterables (tuples, list etc)
a, b, c = 1, 2, 3
print(a, b, c)
#(1, 2, 3)

a, b, c = [1, 2, 3]
print(a, b, c)
#(1, 2, 3)

#Swap variables values.
a, b = 1, 2
a, b = b, a
print(a, b)
#(2, 1)

#Unpack variables from iterable without
#indicating all elements.
a, *b, c = [1, 2, 3, 4, 5]
print(a,b,c)
#[2, 3, 4]

#Unpack variables using the splat operator.

def test(x, y, z):
    print(x, y, z)

res = test(*[10, 20, 30])

res = test(**{'x': 1, 'y': 2, 'z': 3})


#5. Python Itertools tricks Flatten iterables.
from collections import Counter
import itertools
a = [[1, 2], [3, 4], [5, 6]]
list(itertools.chain.from_iterable(a))
#[1, 2, 3, 4, 5, 6]

#Creating cartesian products from iterables.

for p in itertools.product([1, 2, 3], [4, 5]):
    print(''.join(str(x) for x in p))
'''
(1, 4)
(1, 5)
(2, 4)
(2, 5)
(3, 4)
(3, 5)
'''
#Creating permutation from iterable.

for p in itertools.permutations([1, 2, 3, 4]):
    print(''.join(str(x) for x in p))
'''
123
132
213
231
312
321
'''
#Creating ngram from iterable.
from itertools import islice
def n_grams(a, n):
    ...
    z = (islice(a, i, None) for i in range(n))
    ...
    return zip(*z)

a = [1, 2, 3, 4, 5, 6]
print(n_grams(a, 3))
#[(1, 2, 3), (2, 3, 4), (3, 4, 5), (4, 5, 6)]

print(n_grams(a, 2))
#[(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]

print(n_grams(a, 4))
#[(1, 2, 3, 4), (2, 3, 4, 5), (3, 4, 5, 6)]

#Combining two iterables of tuples with padding or pivot nested iterable with padding.
import itertools as it
x = [1, 2, 3, 4, 5]
y = ['a', 'b', 'c']
list(zip(x, y))
#[(1, 'a'), (2, 'b'), (3, 'c')]

list(it.zip_longest(x, y))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, None), (5, None)]

#Creating a combination of k things from an iterable of n
import itertools

bills = [20, 20, 20, 10, 10, 10, 10, 10, 5, 5, 1, 1, 1, 1, 1]
list(itertools.combinations(bills, 3))
#[(20, 20, 20), (20, 20, 10), (20, 20, 10), ...]

#Creating accumulated results of iterable given a function
import itertools

list(itertools.accumulate([9, 21, 17, 5, 11, 12, 2, 6], min))
#[9, 9, 9, 5, 5, 5, 2, 2]

#Creating an iterator that returns elements from the iterable as long as the predicate is true
import itertools

itertools.takewhile(lambda x: x < 3, [0, 1, 2, 3, 4])
#[0, 1, 2]

it.dropwhile(lambda x: x < 3, [0, 1, 2, 3, 4])
#[3, 4]

#Creating an iterator that filters elements from iterable returning only those
#for which the predicate is_False_
import itertools

# keeping only false values
list(itertools.filterfalse(bool, [None, False, 1, 0, 10]))
#[None, False, 0]

#Creating an iterator that computes the function using arguments obtained from the iterable of iterables
import itertools
import operator

a = [(2, 6), (8, 4), (7, 3)]
list(itertools.starmap(operator.mul, a))
#[12, 32, 21]

#6. Python collections tricks Set basic operations.
A = {1, 2, 3, 3}
print(set(A))
#set([1, 2, 3])

B = {3, 4, 5, 6, 7}
print(set(B))
#set([3, 4, 5, 6, 7])

print(A | B)
#set([1, 2, 3, 4, 5, 6, 7])

print(A & B)
#set([3])
print(A - B)
#set([1, 2])

print(B - A)
#set([4, 5, 6, 7])

print(A ^ B)
#set([1, 2, 4, 5, 6, 7])

print((A ^ B) == ((A - B) | (B - A)))
#True


#Counter data structure(an unordered collection where elements are stored as dictionary
# keys and their counts are stored as dictionary values).
import collections
A = collections.Counter([1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 6, 7])
print(A)
Counter({3: 4, 1: 2, 2: 2, 4: 1, 5: 1, 6: 1, 7: 1})
print(A.most_common(1))
#[(3, 4)]

print(A.most_common(3))
#[(3, 4), (1, 2), (2, 2)]

#Default dictionary structure(a subclass of dictionary that retrieves default value
#when non - existing key getting accessed).
import collections
m = collections.defaultdict(int)
print(m['a'])
#0

m = collections.defaultdict(str)
print(m['a'])

m['b'] += 'a'
print(m['b'])
'a'

m = collections.defaultdict(lambda: '[default value]')
print(m['a']) #'[default value]'
print(m['b']) #'[default value]'

m = collections.defaultdict(list)
print(m['a'])
#[]

#Ordered dict structure(a subclass of dictionary that keeps order).
from collections import OrderedDict

d = OrderedDict.fromkeys('abcde')
d.move_to_end('b')
''.join(d.keys())
'acdeb'

d.move_to_end('b', last=False)
''.join(d.keys())
'bacde'

#Deques structure(_Deques are a generalization of stacks and queues)._
#import collection

Q = collections.deque()
Q.append(1)
Q.appendleft(2)
Q.extend([3, 4])
Q.extendleft([5, 6])
print(Q)
#deque([6, 5, 2, 1, 3, 4])

print(Q.pop())
#4

print(Q.popleft())
#6

print(Q)
#deque([5, 2, 1, 3])

Q.rotate(3)
print(Q)
#deque([2, 1, 3, 5])

Q.rotate(-3)
print(Q)
#deque([5, 2, 1, 3])

last_three = collections.deque(maxlen=3)
for i in range(4):
    ...
    last_three.append(i)
...
print(', '.join(str(x) for x in last_three))
'''
...
0
0, 1
0, 1, 2
1, 2, 3
2, 3, 4
'''

#Named tuples structure(create tuple - like objects that have fields accessible
#by attribute lookup as well as being indexable and iterable).
import collections
Point = collections.namedtuple('Point', ['x', 'y'])
p = Point(x=1.0, y=2.0)
print(p)
Point(x=1.0, y=2.0)
'''
p.x
1.0
p.y
2.0
'''
'''
解释器提示如:SyntaxError: invalid character in identifier, 
但又一直找不到问题点的话,请确保代码行内没有夹杂中文的空格,tab等,非文字字符.
例如 for x in range(10): #这是个注释
    print(x)  #下一个注释
这样的代码就会出现 以上错误因为在注释 # 之前夹杂了中文输入法的空格,print缩进里也是如此错误.
'''
#Use A Dictionary To Store A Switch.

func_dict = {'sum': lambda x, y: x + y,
             'subtract': lambda x, y: x - y}
func_dict['sum'](9, 3)
#12
func_dict['subtract'](9, 3)
#6

#Data classes structure
from dataclasses import dataclass

@dataclass
class DataClassCard:
    rank: str
    suit: str

queen_of_hearts = DataClassCard('Q', 'Hearts')
print(queen_of_hearts.rank)
#'Q'
#queen_of_hearts

DataClassCard(rank='Q', suit='Hearts')
print(queen_of_hearts == DataClassCard('Q', 'Hearts'))
#True

#7. Other Python tricks Generating uuid.
# This creates a randomized 128-bit number that will almost certainly be unique.
# In fact, there are over 2¹²² possible UUIDs that can be generated. That’s over five undecillion (or 5,000,000,000,000,000,000,000,000,000,000,000,000).

import uuid

user_id = uuid.uuid4()
print(user_id)
#UUID('7c2faedd-805a-478e-bd6a-7b26210425c7')

#Memoization using LRU cache.
import functools
@functools.lru_cache(maxsize=128)
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    return fibonacci(n - 1) + fibonacci(n - 2)

# Suppression of expressions
from contextlib import suppress
with contextlib.suppress(ZeroDivisionError):
 "10 / 0"
# No exception raised

#An elegant way to deal
#with a file path (3.4≥)
from pathlib import Path

data_folder = Path("source_data/text_files/")

# Path calculation and metadata
file_to_open = data_folder / "raw_data.txt"
print(file_to_open.name)
"raw_data.txt"
print(file_to_open.suffix)
"txt"
print(file_to_open.stem)
"raw_data"

# Files functions
f = open(file_to_open)
f.read()
# content of the file
file_to_open.exists()
#True

#Creating decorator to separate concerns
from functools import wraps
def add_sandwich(wrapped):
    @wraps(wrapped)
    def wrapper(*args, **kwargs):
        return wrapped(*args, **kwargs) + ' sandwich'

    return wrapper


@add_sandwich
def ham():
    return 'ham'

ham()
'ham sandwich'

#Using yield to create a simple iterator

def foo(lst):
    for x in lst:
        yield x
        yield x * 2


a = [1, 3]
list(foo(a))
#[1, 2, 3, 6]

#8.Python easter eggs Anti - gravity
import antigravity
antigravity.fly()


#The Zen of Python
import this

上一篇 下一篇

猜你喜欢

热点阅读