python中的函数

本文介绍了Python中的函数分类,包括内置函数、模块函数和自定义函数,并详细解释了可变与不可变变量的区别。此外,还深入探讨了Python中的加密解密技术,包括对称加密(如Base64、MD5、DES、3DES、AES)和非对称加密(如RSA)的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数分类

内置函数 直接通过函数名调用

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()  # 将加密结果转化回字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值