Python

Python 是一个很好用的语言,拥有很多好用的库,对新手友好。


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