pip

pip 是 python 的包管理器,属于勉强能用的水平,如果你在 linux 上,不建议用它,尤其是不要做 sudo pip 这样的操作,容易和本身的包管理器打架。

设置国内镜像

临时使用,以阿里云举例

pip install -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

永久配置

# Linux
mkdir -p ~/.pip
echo """
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
""" > ~/.pip/pip.conf
# Windows: C:\Users\username\pip\pip.ini
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com

venv

写大工程要隔离这是必须要注意的操作,虚拟环境保证了版本的正常维护

python -m venv /path/to/new/virtual/environment

注意点

in

如果涉及的数据很多,一定要用 set,因为 set 的 in 操作是 O(1) 的,用 list 是 O(n) 速度太慢

pow

注意内置的 pow 和 math 库里的 pow 接收的参数是不一样的,前者可以接受 3 个参数

小片段功能代码

  • 生成固定长度随机字符串密码

    import random
    import string
    def random_str(length=8):
        return "".join(random.sample(string.ascii_letters, length))
    
    from random import Random
    def random_str(randomlength=8):
        str = ''
        chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
        length = len(chars) - 1
        random = Random()
        for i in range(randomlength):
            str+=chars[random.randint(0, length)]
        return str
    
  • 二进制字符串转普通字符串

    每 8 个分成一组,用 int 转 10 进制,再用 chr 转为 ascii 字符

    s="0110001101111001"
    ans=""
    for i in range(0,len(s)//8):
        x = s[i*8:i*8+8]
        ans+=chr(int(x,2))
    

    利用 binascii,先用 int 转为 10 进制,然后转为 16 进制字符串,调用 unhexlify 执行翻译

    import binascii
    s="0110001101111001"
    ans=binascii.unhexlify('%x'%int(s,2)).decode()
    
  • 符号数与无符号数转换

    无符号 -> 有符号

    import ctypes
    ctypes.c_int64(17039472050328044269).value
    

    有符号 -> 无符号

    import ctypes
    ctypes.c_uint64(-1407272023381507347).value
    
  • 捕捉输入的 Ctrl+C

    很邪恶的屏蔽用户输入 Ctrl+C 的做法

    import signal
    
    def signal_handler(signum,data):
        if signum == signal.SIGINT:
            print("Ctrl+C is pressed!")
            # raise KeyboardInterrupt
    
    if __name__ == '__main__':
        signal.signal(signal.SIGINT, signal_handler)
        sleep(666)
    
  • AES 加密字符串

    加密

    plaintext = "hello world"
    
    import pyaes,base64
    aes = pyaes.AESModeOfOperationCTR(b"This_key_for_demo_purposes_only!")
    encrypted_text = base64.b64encode(aes.encrypt(plaintext.encode("utf-8")))
    
    print(encrypted_text) # ipkEJevbnsfbEm4=
    

    解密

    encrypted_text = "ipkEJevbnsfbEm4="
    
    import pyaes, base64
    aes = pyaes.AESModeOfOperationCTR(b"This_key_for_demo_purposes_only!")
    plaintext = aes.decrypt(base64.b64decode(encrypted_text)).decode()
    
    print(plaintext) # hello world