函数分类
内置函数 直接通过函数名调用
help()
len()
type()
id()
isinstance()
abs()
min()
max()
pow()
int() .....
dir()
range()
callable() # 判断函数可否被调用
模块函数 通过模块名才能调用
import math
import math as mt
from math import cos
自定义函数
def my_func(x1,*x2,x3,x4=5):
print(x1)
可变变量:地址传递
不可变变量: 值传递
强制命名参数,出现在*之后的参数 调用时必须指定参数名
特殊函数
lambda
lambda x: x+3
map,reduce,filter,sorted
a=map(f,b)#将f函数作用在b这个iterable上,返回iterable
a=reduce(f,[x1,x2,x3])=f(f(x1,x2),x3)#f必须接受两个参量,其实就是reduce(多个——》一个)
a=filter(f,b)#f一次作用到b元素上,根据TRUE or false 来决定保留还是丢弃该元素,返回iterable
a=sorted(b,key=f,reverse=True)#f可以是abs,str.lower
装饰器(decorator)
import functools
def log(text):#定义装饰器
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('execute')
def now():#给函数装饰
print('2015-3-25')
now()#调用
偏函数(将默认参数改变变成一个新函数)
import functools
int2 = functools.partial(int, base=2)
迭代器与生成器
迭代器可用next()不断返回下一个值
可迭代对象不一定是迭代器(list是可迭代对象但不是迭代器,用iter()将可迭代对象转换成迭代器)
生成器用yield而不是return返回一个迭代器
实用函数
import random
a='abcdefg'
random.choice(a) #随机挑选一个
random.sample(a,3) #随机挑选3个,也可以是0个,返回list
b=['a','e','f']
random.shuffle(b) # 对b的顺序进行随机,没有返回值,结果体现在b中
python中的加密解密
加密方法分为两类:对称加密:加密和解密是同一个密码;非对称加密:加密和解密是不同的密码。对称加密速度快但是传输过程不安全,非对称加密速度慢,但是安全。可以用非对称加密来加密对称加密的密码进行传输。
只能对二进制数据进行加密,ascii码可以通过b’'直接输入,其他字符通过encode()来转换。
对称加密
1)bse64
Base64是一种用64个字符(A-Z a-z 0-9 + / )来表示任意二进制数据的方法。下面是加密算法,加密后字符长度会比原来长度长大约1/3。
1:将所有字符转化为ASCII码。
2:将ASCII码转化为8位二进制 。
3:将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位。
4:统一在6位二进制前补两个0凑足8位。
5:将补0后的二进制转为十进制。
6:从Base64编码表获取十进制对应的Base64编码。
import base64
base64.b64encode(b'abc') #加密
base64.b64encode('微信'.encode()) #加密
base64.b64decode() #解密
2) MD5 (SHA1)
message-digest algorithm 5(信息-摘要算法)。将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。从名字我们可以知道原文与摘要不是一一对应的。所以没有反向解密的方法。SHA1方法和MD5很像,都不能反向解密。
import hashlib
h1 = hashlib.md5()
h1.update(b'abc')
h1.hexdigest() # '900150983cd24fb0d6963f7d28e17f72' 长度为32的16进制数据
3) DES
DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。
DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),分组后的明文组和56位的密钥按位替代或交换的方法形成密文组。生成的密钥长度是原文的2倍
linux:
pip install pycryptodome
import Crypto
windows # 需要提前安装Microsoft Visual c++ 2015
pip install pycryptodomex
import Cryptodome
import binascii
from Cryptodome.Cipher import DES
des=DES.new(b'abcdefgh', DES.MODE_ECB)#key的长度必须为8
text='python spider'
text=text+(8-(len(text)%8))*'='
encrypto_text = des.encrypt(text.encode())
binascii.b2a_hex(encrypto_text) # b'084725d8f5ffafc68b7ddb6887c46c02'
4) 3DES
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。
5)AES
AES为分组密码,在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。一般常用的是128位
from Cryptodome.Cipher import AES
from Cryptodome import Random
from binascii import b2a_hex
text='微信' # 要加密的内容
key = b'this is a 16 key' #密钥key长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.
iv = Random.new().read(AES.block_size) # 生成长度等于AES块大小的不可重复的密钥向量
mycipher = AES.new(key, AES.MODE_CFB, iv) # 使用key和iv初始化AES对象, 使用MODE_CFB模式
ciphertext = iv + mycipher.encrypt(data.encode()) # 加密的明文长度必须为16的倍数,如果长度不为16的倍数,则需要补足为16的倍数。将iv(密钥向量)加到加密的密文开头,一起传输
mydecrypt = AES.new(key, AES.MODE_CFB, ciphertext[:16]) # 解密的话要用key和iv生成新的AES对象
decrypttext = mydecrypt.decrypt(ciphertext[16:]) # 使用新生成的AES对象,将加密的密文解密
print('密钥k为:', key)
print('iv为:', b2a_hex(ciphertext)[:16])
print('加密后数据为:', b2a_hex(ciphertext)[16:])
print('解密后数据为:', decrypttext.decode())
非对称加密
1)RSA
该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。而且,因为RSA加密算法的特性,RSA的公钥私钥都是10进制的,但公钥的值常常保存为16进制的格式,所以需要将其用int()方法转换为10进制格式。
pip install rsa
import rsa
import binascii
pubkey_n = '8d7e6949d411ce14d7d233d7160f5b2cc753930caba4d5ad24f923a505253b9c39b09a059732250e56c594d735077cfcb0c3508e9f544f101bdf7e97fe1b0d97f273468264b8b24caaa2a90cd9708a417c51cf8ba35444d37c514a0490441a773ccb121034f29748763c6c4f76eb0303559c57071fd89234d140c8bb965f9725' # RSA的公钥有两个值n和e。n常常为长度为256的十六进制字符串
pubkey_e = '10001' # e常常为十六进制‘10001'
rsa_n = int(pubkey_n, 16) # 将十六进制转换成十进制
rsa_e = int(pubkey_e, 16)
key = rsa.PublicKey(rsa_n, rsa_e) # 用n值和e值生成公钥
text= '今天天气真好' # 要加密的内容
message = rsa.encrypt(message.encode(), key) # 用公钥把明文加密
message = binascii.b2a_hex(message) # 转化成常用的可读性高的十六进制
message.decode() # 将加密结果转化回字符串