1.map、filter
这两个方法都是帮你调用函数的
dir_names=['android','ios','tomcat','java','python','php','nginx']
res=map(makdir,dir_names) 第一个参数是方法名,第二个参数是可循环的值,作用是将可循环值中的每一个元素依次循环传入到方法执行
print(res) 此时不会打印出结果,因为map调用生成的结果放到生成器中,只有在使用时,才会生成数据放到内存,想要打印出来就把res转换成list,即list(res)
all=[i for i in range(5)] #结果放到list,占内存,空间换时间(一次得到数据放到内存)
all=(i for i in range(5)) #结果放到生成器,节省空间,增加了cpu的工作量(每次都要计算一下得到数据),rang()的实现也是一个生成器
def my(num):
if num%2==0:
return True
res=list(filter(my,range(10))) #返回列表中为真的数据,即range(10)中的数据
#只保留返回真的数据
res2=list(map(my,range(10)))
# 不管返回啥,都拿到
filter() 过滤,他把函数处理结果为假的数据给过滤掉了,生成结果也是放到生成器
2.写日志
import nnlog
my_log=nnlog.Logger('rizhi.log',level='debug',when='s',backCount=5) #when按什么时间单位生成日志,backcount最多保存几个日志,多余的删除掉。level日志的级别,可不写该参数,默认为bebug
my_log.debug('debug') 调试信息
my_log.info('info') 正常输出
my_log.warning('warning') 警告
my_log.error('error') 出错
debug、info、warning、error日志级别依次升高
3.发送邮件
import yagmail
# 账号 密码(只能用邮箱授权码) 邮件服务器(一般都用stmp协议) 收件人 抄送(非必填) 主题 正文 附件(非必填)
uesername='********@vip.qq.com'
passwd='zqdlhfeqdnbnbbbe'#授权码,不是邮箱密码
mail=yagmail.SMTP(user=uesername,password=passwd,host='smtp.qq.com',smtp_ssl=True)
# 安全协议,smtp_ssl=True如果是qq邮箱需要加这个参数,其他不需要
mail.send(to='*********@qq.com',cc='********@163.com',subject='qwer',contents='sdf',attachments=r'C:UsersAdministratorDesktop笔记.txt')
# to 收件人 cc 抄送人 subject 主题 contents 内容 attachments 附件内容 多个时都是用列表的形式写出
# 如果你发送的附件名,中文时乱码的话
# pip uninstall yagmail,卸载掉,换个新的装一下
4.操作mysql
# 1.连接数据库:需要 ip 账号 密码 端口号 数据库名称
# 2.执行sql
# 3.获取到结果
import pymysql
conn=pymysql.connect(host='***.***.***.***',user='***',password='123456',port=3306,db='***',charset='utf8',autocommit=True)#连接数据库,加上autocommit=True 可以直接对数据库进行修改,其中port是int类型,注意不要加引号
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)#建立游标,类似于仓库管理员。括号里指定了数据的返回类型,没有值时,默认返回二维元组
sql="insert into nhy(name,pwd) VALUE ('jc','123456')"
cur.execute(sql)
conn.commit() #对数据库修改操作时,需要进行commit
cur.execute("select * from nhy where name='jc'")
# cur.execute('select * from nhy;') #执行sql语句,只是帮你执行sql语句,不会帮你返回结果
print(cur.description) #获取表的信息
fileds=[filed[0] for filed in cur.description] #列表生成式,获取到所有的字段
print(cur.fetchall()) #获取所有结果,结果存放到二维元组当中
# print(cur.fetchone()) #只获取一条数据
# print(cur.fetchmany(2))#指定获取几条
# 前边结果被获取过了,后边结果就不能再被获取了
cur.close() #游标关闭
conn.close() #连接关闭
以下为操作mysql数据库的封装函数,可以直接拿来用
def my_db(ip,user,passwd,db,sql,port=3306,charset='utf8'):
coon=pymysql.connect(host=ip,user=user,password=passwd,db=db,port=port,charset=charset,autocommit=True)
cur=coon.cursor()
sql=sql.strip()
cur.execute(sql)
sql_start=sql[:6].lower() #取sql的开头,然后转化成小写的
if sql_start.startswith('select') or sql_start.startswith('show'):
data=cur.fetchall()
else:
data='ok'
cur.close()
coon.close()
return data
5.操作redis
#传统的关系型数据库
# mysql oracle sql server sqllie db2
# id name passwd cratetime stu
# score
#数据存在磁盘上
# 使用sql语句来操作数据
# 表与表之间有关系
#非关系型数据库 nosql
# {'name':'xxx',''}
# mongodb 数据存在磁盘上的
# redis 数据都是存在内存里面
import redis
#连接redis
r = redis.Redis(host='***.***.***.***',port=6379,password='****',db=10)
#增删改查
#操作string类型
# r.set('nhy_info','age 18 sex nan sdfsdfsdfsd') #增加、修改数据,传入第三个参数时,表示key的失效时间,不设置或者为-1时,代表永久生效
# res = r.get('nhy_info') #获取数据,得到bytes类型的数据,key不存在的话,不报错,返回none
# bytes#二进制
# r.delete('nhy_info') #指定一个key删除他,key不存在的话,不报错
# print( res.decode() ) #编码,bytes就变成了字符串
# print(r.keys('*info')) #获取到所有的key
# print(r.exists('dashu_name')) #判断这个key是否存在
# r.flushdb()#可以清空当前数据库里面所有的key
# r.expire('session_crm',600)#指定key的失效时间
# print(r.ttl('session_crm'))#用来这个key的失效时间
# print(r.type('session_crm'))#看key的类型
#hash 哈希类的key
#哈希类型你理解为一个字典嵌套字典
# redis的命令行里面select 8 就是切换数据库
# 操作hash类型的
#增删改查
r.hset('fdfds','sasa','trtrsasae')
r.hset('fdfds','cxcx','hghghg')
r.hset('fdfds','fdfdf','trtre')
# 修改也是hset
# r.hdel('fdfds','sasa') #删除指定的小key
# r.delete('fdfds') #直接删除大key
# print(r.hget('fdfds','cxcx'))#获取指定小key里面的数据
res = r.hgetall('fdfds')#获取到hash类型里面所有的数据,存在字典里,但k和v都是bytes类型的,需要转换为字符串类型,这里就需要用.decode()方法
a = {}
for k,v in res.items():
a[k.decode()] = v.decode()
print(a)
以下是封装好的redis操作模块,以后可以直接拿来用:
import redis
def op_str(k,v=None,t=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
r=redis.Redis(host=ip, port=port, password=passwd, db=db)
if v:
r.set(k, v)
data='ok'
else:
if r.exists(k):
res=r.get(k)
data=res.decode()
else:
data='结果不存在'
return data
def op_hash(k1,k2=None,v=None,ip='118.24.3.40', port=6379, passwd='HK139bc&*', db=10):
r=redis.Redis(host=ip, port=port, password=passwd, db=db)
if k2:
if v:
r.hset(k1, k2, v)
res='ok'
else:
if r.hget(k1, k2):
res = r.hget(k1, k2).decode()
else:
res='结果不存在'
else:
if r.exists(k1):
a = r.hgetall(k1)
res = {}
for k, v in a.items():
res[k.decode()] = v.decode()
else:
res='结果不存在'
return res
6.MD5加密
import hashlib
s='123456'
m=hashlib.md5(s.encode()) #必须传一个btyes类型的,后边加.encode()
print(m.hexdigest()) #获取到加密之后的结果
#MD5不可逆,不可解密
# 所有一样的字符串,MD5加密之后的结果都是一样的
# 撞库来实现MD5解密的
以下是封装好的MD5加密模块,以后可以直接拿来用:
def myMd5(s):
s = str(s)
m = hashlib.md5(s.encode()) #必须得传一个bytes类型的
return m.hexdigest()
加盐:当密码很容易被破解时,可以使用加盐方法,即在密码前后加上固定字符串,加上用户名之类的值,作为密码,再进行MD5加密,这样更加安全
7.写excel
import xlwt
book=xlwt.Workbook() #创建excel
sheet=book.add_sheet('1') #加一个sheet页
sheet.write(0,0,'学生编号') #行,列
book.save('ss.xls') #一定要以xls结尾
8.读excel
xlwt #只能写excel
import xlrd #只能读
book = xlrd.open_workbook('nhy.xls') 打开指定的excel
print(book.nsheets)#获取到excel里面总共有多少个sheet页
sheet = book.sheet_by_index(0) 指定操作第几个sheet页
book.sheet_by_name('sheet1') 指定操作那个sheet页
# print(sheet.cell(0,0).value) #指定行和列,获取某个单元格里面的内容
# print(sheet.cell(1,0).value)
print(sheet.row_values(0))#获取某一行的数据
print(sheet.row_values(1))#获取某一行的数据
print(sheet.nrows)#这个就是excel里面总共有多少行
print(sheet.col_values(0))#某一列的数据
print(sheet.col_values(1))#某一列的数据
print(sheet.ncols)#总共有多少列
9.修改excel
import xlrd
from xlutils import copy
book1=xlrd.open_workbook('shuipingzuo.xls')
# 打开原来的excel
new_book=copy.copy(book1)
# 拷贝一个新的excel
sheet=new_book.get_sheet(0)
# 获取第一个sheet页
sheet.write(1,3,18)
new_book.save('shuipingzuo.xls')