python一些有用小技巧

99 阅读4分钟

「这是我参与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

多种连接列表的方式

  1. 直接使用+
>>> 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]
  1. 使用列表推导式
>>> 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))
  1. 使用 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]