「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战」
上一篇 更新了python的坑爹机制,今天就更新一下python的有用的技巧(摸鱼写博客),但是有没有用这个见仁见智,起码我要是遇到了想起来才是有用,不然都是无用的。
1 python的整数池
众所周知python为了避免常用的整数频繁的创建和销毁,直接写到内存里面,这个整数范围是多少,一般人不知道(包括我)。后来查了一下是[-5,256]
最后一个例子为True,因为当你在同一行里,同时给两个变量赋同一值时,解释器知道这个对象已经生成,那么它就会引用到同一个对象。
>>> a = -6
>>> b = -6
>>> a is b
False
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 257; b = 257
>>> a is b
True
如果在py文件中,逻辑和上面一样。能引就引,不行在建
# test.py
a=-6
b=-6
print(id(a))
print(id(b))
print(a is b)
"""
2435573303056
2435573303056
True
"""
2 负负得正
很符合人类逻辑,敌人的敌人就是朋友,当然敌人的敌人的敌人是敌人,敌人的敌人的敌人的敌人是朋友......,只要你想,你可以套娃套下去。
a=3-1
# 2
a=3--1
# 4
a=3++1
# 4
a=3+-1
# 2
a=3------------1
# 4
a=3--------------------------1
4
finally 优先级高于return
python中并不是return就一定返回,finally才是优先级最高的,当然是在try中。
def func():
try:
return 'try'
finally:
return 'finally'
print(func())
# finally
看第二例子
def func():
try:
return 'try'
finally:
print('finally')
print(func())
# finally
# try
如果 finally 里有显式的 return,那么这个 return 会直接覆盖 try 里的 return,而 如果 finally 里没有 显式的 return,那么 try 里的 return 仍然有效。
大数表示法
这算是比较冷门的东西 比如 123456789,可以通过_来表示。有效避免数字位数看错。并且_隔多少位都不影响
num=123_456_789
print(num)
# 123456789
print(type(num))
# <class 'int'>
# 可以使用的
num=123_4_5_6_789
num=12_3456789
# 不可用
num=_123456789
num=123456789_
针对python不同版本安装包的操作
# python2 如果默认的python 是python3,下面是安装python3版本
python -m pip install requests
# python3
python3 -m pip install requests
# python3.8
python3.8 -m pip install requests
# python3.9
python3.9 -m pip install requests
多种连接列表的方式
- 直接使用
+
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> list1+list2+list3)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
2.itertools
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> list(chain(list1,list2,list3))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
3.使用*
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> [*list1, *list2,*list3]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
4.使用 extend
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> list1.extend(list2)
>>> list1.extend(list3)
>>> list1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
- 使用列表推导式
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> [x for l in (list1, list2, list3) for x in l]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
6.使用 heapq heapq.merge 不止合并列表,还会对列表进行排序
>>> list1=[1,2,3]
>>> list2=[4,5,6]
>>> list3=[7,8,9]
>>> from heapq import merge
>>> list(merge(list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list1 = [2,5,3]
>>> list2 = [1,4,6]
>>> list3 = [7,9,8]
>>>
>>> from heapq import merge
>>>
>>> list(merge(list1, list2, list3))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
7.借助魔法方法 有一个魔法方法叫 add ,当我们使用第一种方法 list01 + list02 的时候,内部实际上是作用在 add 这个魔法方法上的。所以以下两种方法其实是等价的
>>> list1 = [1,2,3]
>>> list2 = [4,5,6]
>>>
>>> list1 + list2
[1, 2, 3, 4, 5, 6]
>>> list1.__add__(list2)
[1, 2, 3, 4, 5, 6]
借用这个魔法特性,我们可以 reduce 这个方法来对多个列表进行合并,示例代码如下
>>> list1 = [1,2,3]
>>> list2 = [4,5,6]
>>> list3 = [7,8,9]
>>>
>>> from functools import reduce
>>> reduce(list.__add__, (list1, list2, list3))
- 使用 yield from 在 yield from 后可接一个可迭代对象,用于迭代并返回其中的每一个元素。 因此,我们可以像下面这样自定义一个合并列表的工具函数。
>>> list01 = [1,2,3]
>>> list02 = [4,5,6]
>>> list03 = [7,8,9]
>>>
>>> def merge(*lists):
... for l in lists:
... yield from l
...
>>> list(merge(list01, list02, list03))
[1, 2, 3, 4, 5, 6, 7, 8, 9]