40个 python 奇技淫巧
Python网络爬虫与数据挖掘
共 7747字,需浏览 16分钟
·
2021-02-26 16:57
转自公众号【python之禅】
Python的优雅不言而喻,能用一行代码解决的问题绝不用两行代码,这里我给你总结40个地道的Python代码技巧。如果你是从其它语言转过来的,你一定会大呼,Python 牛逼,还有这种操作。如果你是刚学编程,你会感觉,这是编程语言该有的样子。
0、两个变量值互换
>>> a=1
>>> b=2
>>> a,b=b,a
>>> a
2
>>> b
1
1、连续赋值
a = b = c = 50
2、自动解包
>>> a,b,c = [1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>>
>>>
>>> a, *others = [1,2,3,4]
>>> a
1
>>> others
[2, 3, 4]
>>>
4、链式比较
a = 15
if (10 < a < 20):
print("Hi")
等价于
a = 15
if (a>10 and a<20):
print("Hi")
5、重复列表
>>> [5,2]*4
[5, 2, 5, 2, 5, 2, 5, 2]
6、重复字符串
>>> "hello"*3
'hellohellohello'
7、三目运算
age = 30
slogon = "牛逼" if age == 30 else "niubility"
等价于
if age = 30:
slogon = "牛逼"
else:
slogon = "niubility"
8、字典合并
>>> a= {"a":1}
>>> b= {"b":2}
>>> {**a, **b}
{'a': 1, 'b': 2}
>>>
9、字符串反转
>>> s = "i love python"
>>> s[::-1]
'nohtyp evol i'
>>>
10、列表转字符串
>>> s = ["i", "love", "pyton"]
>>> " ".join(s)
'i love pyton'
>>>
11、for else 语句
检查列表foo是否有0,有就提前结束查找,没有就是打印“未发现”
found = False
for i in foo:
if i == 0:
found = True
break
if not found:
print("未发现")
如果用 for else 语法来写可以省几行代码
for i in foo:
if i == 0:
break
else:
print("未发现")
11、字典推导式
>>> m = {x: x**2 for x in range(5)}
>>> m
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>>
12、用Counter查找列表中出现最多的元素
>>> content = ["a", "b", "c", "a", "d", "c", "a"]
>>> from collections import Counter
>>> c = Counter(content)
>>> c.most_common(1)
[('a', 3)]
>>>
出现第1多的元素是a,一共出现3次, 你也可以用类似的方法找出第二多或者第三多的
13、默认值字典
给字典中的value设置为列表,普通方法
>>> d = dict()
if 'a' not in d:
d['a'] = []
d['a'].append(1)
使用defaultdict
默认字典构建一个初始值为空列表的字典
from collections import defaultdict
d = defaultdict(list)
d['a'].append(1)
14、赋值表达式
这是3.8的新特性,赋值表达式又成为海象运算符:=, 可以将变量赋值和表达式放在一行,什么意思?看代码就明白
>>> import re
>>> data = "hello123world"
>>> match = re.search("(\d+)", data) # 3
>>> if match: # 4
... num = match.group(1)
... else:
... num = None
>>> num
'123'
第3、4行 可以合并成一行代码
>>> if match:=re.search("(\d+)", data):
... num = match.group(1)
... else:
... num = None
...
>>> num
'123'
15、isinstance
isinstance
函数可用于判断实例的类型,其实第二个参数可以是多个数据类型组成的元组。例如:
isinstance(x, (int, float))
# 等价于
isinstance(x, int) or isinstance(x, float)
类似的函数还有字符串的startswith,endswith,例如:
s.startswith(('"""', "'''"))
# 等价于
s.startswith("'''") or s.startswith('"""')
16、用 http.server 共享文件
# python3
python3 -m http.server
# python2
python -m SimpleHTTPServer 8000
效果如下,可以在浏览器共享文件目录,方便在局域网共享文件
17、zip 函数实现字典键值对互换
>>> lang = {"python":".py", "java":".java"}
>>> dict(zip(lang.values(), lang.keys()))
{'.java': 'java', '.py': 'python'}
18、查找列表中出现次数最多的数字
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4, 5]
>>> max(set(test), key=test.count)
4
19、使用 slots 节省内存
class MyClass(object):
def __init__(self, name, identifier):
self.name = name
self.identifier = identifier
self.set_up()
print(sys.getsizeof(MyClass))
class MyClass(object):
__slots__ = ['name', 'identifier']
def __init__(self, name, identifier):
self.name = name
self.identifier = identifier
self.set_up()
print(sys.getsizeof(MyClass))
# In Python 3.5
# 1-> 1016
# 2-> 888
20、扩展列表
>>> i = ['a','b','c']
>>> i.extend(['e','f','g'])
>>> i
['a', 'b', 'c', 'e', 'f', 'g']
>>>
21、列表负数索引
>>> a = [ 1, 2, 3]
>>> a[-1]
3
22、列表切片
>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> a[3:6] # 第3个到第6个之间的元素
[3, 4, 5]
>>> a[:5] # 前5个元素
[0, 1, 2, 3, 4]
>>> a[5:] # 后5个元素
[5, 6, 7, 8, 9]
>>> a[::] # 所有元素(拷贝列表)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[::2] # 偶数项
[0, 2, 4, 6, 8]
>>> a[1::2] # 奇数项
[1, 3, 5, 7, 9]
>>> a[::-1] # 反转列表
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
23、二维数组变一维数组
import itertools
>>> a = [[1, 2], [3, 4], [5, 6]]
>>> i = itertools.chain(*a)
>>> list(i)
[1, 2, 3, 4, 5, 6]
24、有索引的迭代
>>> a = ['Merry', 'Christmas ', 'Day']
>>> for i, x in enumerate(a):
... print '{}: {}'.format(i, x)
...
0: Merry
1: Christmas
2: Day
25、列表推导式
>>> le = [x*2 for x in range(10)]
>>> le # 每个数乘以2
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> le = [x for x in range(10) if x%2 == 0]
>>> le # 获取偶数项
[0, 2, 4, 6, 8]
26、生成器表达式
>>> ge = (x*2 for x in range(10))
>>> ge
<generator object <genexpr> at 0x01948A50>
>>> next(ge)
0
>>> next(ge)
2
>>> next(ge)
4
...
>>> next(ge)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
27、集合推导式
Python
>>> nums = {n**2 for n in range(10)}
>>> nums
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}
28、判断key是否存在字典中
>>> d = {"1":"a"}
>>> d['2']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: '2'
>>> '1' in d
True
>>> d['1']
'a'
>>> d.get("1")
'a'
>>> d.get("2")
>>>
29、装饰器
from functools import wraps
def tags(tag_name):
def tags_decorator(func):
@wraps(func)
def func_wrapper(name):
return "<{0}>{1}</{0}>".format(tag_name, func(name))
return func_wrapper
return tags_decorator
@tags("p")
def get_text(name):
"""returns some text"""
return "Hello " + name
print(get_text("Python"))
>>><p>Hello Python</p>
30、字典子集
>>> def sub_dicts(d, keys):
... return {k:v for k, v in d.items() if k in keys}
...
>>> sub_dicts({1:"a", 2:"b", 3:"c"}, [1,2])
{1: 'a', 2: 'b'}
31、反转字典
>>> d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>>
>>> zip(d.values(), d.keys())
<zip object at 0x019136E8>
>>> z = zip(d.values(), d.keys())
>>> dict(z)
{1: 'a', 2: 'b', 3: 'c', 4: 'd'}
32、具名元组
>>> from collections import namedtuple
>>> Point = namedtuple("Point", "x,y")
>>> p = Point(x=1, y=2)
>>> p.x
1
>>> p[0]
1
>>> p.y
2
>>> p[1]
2
33、设置字典默认值
>>> d = dict()
>>> if 'a' not in d:
... d['a'] = []
...
>>> d['a'].append(1)
>>> d
{'a': [1]}
>>> d.setdefault('b',[]).append(2)
>>> d
{'a': [1], 'b': [2]}
>>>
34、有序字典
>>> d = dict((str(x), x) for x in range(10))
>>> d.keys() # key 无序
dict_keys(['0', '1', '5', '9', '4', '6', '7', '8', '2', '3'])
>>> from collections import OrderedDict
>>> m = OrderedDict((str(x), x) for x in range(10))
>>> m.keys() # key 按照插入的顺序排列
odict_keys(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
35、列表中最大最小的前n个数
>>> import heapq
a = [51, 95, 14, 65, 86, 35, 85, 32, 8, 98]
>>> heapq.nlargest(5,a)
[98, 95, 86, 85, 65]
>>> heapq.nsmallest(5,a)
[8, 14, 32, 35, 51]
>>>
36、打开文件
>>> with open('foo.txt', 'w') as f:
... f.write("hello")
...
37、两个列表组合成字典
list_1 = ["One","Two","Three"]
list_2 = [1,2,3]
dictionary = dict(zip(list_1, list_2))
print(dictionary)
38、去除列表中重复元素
my_list = [1,4,1,8,2,8,4,5]
my_list = list(set(my_list))
print(my_list)
39、打印日历
import calendar
>>> print(calendar.month(2021, 1))
January 2021
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
40、匿名函数
def add(a, b):
return a+b
等价于
>>> add = lambda a,b:a+b
>>> add(1,2)
3
还有哪些你认为是奇技淫巧的代码,欢迎补充!
回复关键字“简明python ”,立即获取入门必备书籍《简明python教程》电子版
回复关键字“爬虫”,立即获取爬虫学习资料
python入门与进阶 每天与你一起成长 推荐阅读
评论