python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作

2023-06-25,,

一、匿名函数

递归:就是调用自己

 def func():
     num = int(input('num:'))
     if num % 2 ==0:
         print('是偶数')
         return
     else:
         func()
 func()  # 递归最多循环999次

匿名函数lambda

 # 匿名函数 lambda
 lambda x:x+1   # 冒号前面是:入参    冒号后面:返回值 (lambda用完一次就消失,f(x)会存在内存里)
 # 简化:==
 def f(x):
     return x+1
 f = lambda x,b:str(x+b)
 result = f(1,2)
 print(f)

二、读写excel

利用xlrd和xlwt进行excel读写(xlwt不支持xlsx)

pip3.5.exe install xlrd
2.1 写Excel

 book = xlwt.Workbook() # 建立excel
 sheet = book.add_sheet('sheet1') # 添加sheet1表
 sheet.write(0, 0, '名字') #(第1行,第1列)
 sheet.write(1, 0, '张三') # (第2行,第一列)
 sheet.write(2, 0, '李四') # ...
 sheet.write(3, 0, '王五')

 sheet.write(0, 1, '手机号')
 sheet.write(1, 1, ')
 sheet.write(2, 1, ')
 sheet.write(3, 1, ')

 book.save("students.xls") # 保存文件

 import xlwt  # 导入模块

 book = xlwt.Workbook() # 建立excel
 sheet = book.add_sheet('sheet1') # 添加sheet1表

 stus = [
     ["id","name","sex","age","addr","grade","phone","gold"],
     [314,",14405],
     [315,",100],
     [5985,",100]
 ]

 # enumerate() 枚举函数
 # 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
 # enumerate(sequence, [start=0])
 for row, stu in enumerate(stus):
     for col, field in enumerate(stu):
         sheet.write(row, col, field)
 book.save('students.xls')

2.2 读Excel

 import xlrd # 导入模块

 book = xlrd.open_workbook('student.xls') # 打开excel
 sheet = book.sheet_by_index(0)  # 获取第1张表
 # sheet = book.sheet_by_name('sheet1')

读取某个单元格内容

 result = sheet.cell(0,0).value # 获取某个单元格的内容
 print('某个单元格的内容',result)

读取整行内容

 row = sheet.row_values(0) # 获取整行的内容
 print('某一行的内容',row)

读取整列内容

col = sheet.col_values(0) # 获取整列的内容
print('某一列的内容',col)

获取行数列数

 print(sheet.nrows) # 总共多少行
 print(sheet.ncols) # 总共多少列
 for row_num in range(1,sheet.ncols): # 1:从第二行开始就避免显示第一行
     print(sheet.row_values(row_num)) # 读取所有列信息
[314.0, ', 14405.0]
[315.0, ', 100.0]
[5985.0, ', 100.0]

三、操作数据库mysql

3.1 安装pymysql

C:\Python35\Scripts\pip3.5.exe install pymysql
3.2操作步骤

"""1、连接本地数据库2、建立游标3、创建表4、插入表数据、查询表数据、更新表数据、删除表数据"""
 import pymysql  # 导入pymysql模块

 ip = "118.24.3.40"
 user = 'jxz'
 password = "
 db = 'jxz'
 port = 3306
 charset = 'utf8'

 # 连接数据库
 conn = pymysql.connect(
     host=ip,
     user=user,
     password=password,
     db=db,
     port=port,
     charset=charset)

 # 建立游标
 cur = conn.cursor() # 游标

 sql = 'select * from app_myuser limit 10;'
 cur.execute(sql) # 执行sql语句

 all=cur.fetchall() # 获取所有
 one=cur.fetchone() # 获取一条
 many=cur.fetchmany(2) #获取1条
 print(one)
 print(many)
 print(all)

 # 用完要关闭连接
 cur.close()  # 关连接
 conn.close()  # 关游标
None
()
((1, ', None, 0, None))

3.3创建表

autocommit=True 在执行sql语句后将会自动提交
cursorclass=pymysql.cursors.DictCursor 返回结果值以字典形式显示
 import pymysql  # 导入pymysql模块

 ip = "118.24.3.40"
 user = 'jxz'
 password = "
 db = 'jxz'
 port = 3306
 charset = 'utf8'

 # 连接数据库
 conn = pymysql.connect(
     host=ip,
     user=user,
     password=password,
     db=db,
     port=port,
     charset=charset,
     autocommit=True,
     cursorclass=pymysql.cursors.DictCursor)
 # autocommit=True 在执行sql语句后将会自动提交
 # cursorclass=pymysql.cursors.DictCursor 返回结果值以字典形式显示

 # 建立游标
 cur = conn.cursor()  # 游标

 sql = 'create table bzz(id int unique not null,name varchar(20) not null,phone varchar(11) unique not null);'
 sql1 = 'insert into bzz(id,name,phone) values(3,"老黄","13217054461");'
 sql2 = 'insert into bzz(id,name,phone) values(1,"小黄","18217057798");'
 sql3 = 'insert into bzz(id,name,phone) values(2,"小瓜","15217057087");'
 sql4 = 'select * from bzz;'

 # cur.execute(sql)  # 执行 insert语句、update语句、delete语句,必须commit才能执行
 # conn.commit()  # 提交
 # cur.execute(sql1)
 # conn.commit()  # 提交
 # cur.execute(sql2)
 # conn.commit()  # 提交
 # cur.execute(sql3)
 # conn.commit()  # 提交
 cur.execute(sql4)

 all = cur.fetchall()  # 获取所有
 print(all)

 # 用完要关闭连接
 cur.close()  # 关连接
 conn.close()  # 关游标
[{', 'id': 3}]

3.4 数据库封装成一个函数

封装数据库函数,方便以后调用

 import pymysql  # 导入pymysql模块

 def op_mysql(sql):
     info = {
         'user': 'jxz',
         ',
         'host': '118.24.3.40',
         'db': 'jxz',
         'port': 3306,
         'charset': 'utf8',
         'autocommit': 'True',
         'cursorclass': 'pymysql.cursors.DictCursor'}
     conn = pymysql.connect(info)  # 建立连接
     cur = conn.cursor()  # 游标
     cur.execute(sql)  # 执行sql语句
     result = cur.fetchall()
     cur.close()
     conn.close()
     return result

 op_mysql() #user=jxz,password=123456

四、MD5加密

4.1加密成MD5码

导入 hashlib模块  里面有MD5方法

首先要变成.encode() beyte类型

然后变成MD5码:.MD5(.encode())

.hexdigest() 获取加密后的结果

【MD5码加密后都是32位】

 import hashlib

 s='admin123'
 print(s.encode()) # .encode()变成beyte类型
 m = hashlib.md5(s.encode()) # 加密成MD5码  只能加密不能解密
 result = m.hexdigest() # 获取加密后的结果
 print(result)
b'admin123'
0192023a7bbd73250516f069df18b500

4.2 为了提高安全性,在密码后面“加盐” #salt

 salt = '2r23$@fds' # 盐

 password = input('password:')
 password += salt # 加盐

 m = hashlib.md5(password.encode())
 result = m.hexdigest() # 获取加密后的结果
 print(result)
password:5tgb^YHN
93523fbd41418707ddf37ecfe332b5a1

封装加盐MD5码方法

 def md5(s,salt=''):
     new_s = str(s) + salt
     m = hashlib.md5(new_s.encode())
     return m.hexdigest()

4.3 base64 加密方法  能加密,也能解密

base64 加密结果都是字母加数字形式

加密

 import base64 # base64加密法 能加密,也能解密

 s = '哈哈哈哈'
 b = base64.b64encode(s.encode())
 result = b.decode()
 print(result) # 加密base64
5ZOI5ZOI5ZOI5ZOI

解密

 import base64 # base64加密法 能加密,也能解密

 b = base64.b64decode('5ZOI5ZOI5ZOI5ZOI') # .b64decode() 解密
 result = b.decode()
 print(result)
哈哈哈哈

 将url编码成base64

后面带“=”的基本是base64加密

 # 想将字符串转编码成base64,要先将字符串转换成二进制数据
 url = "https://www.cnblogs.com/songzhixue/"
 bytes_url = url.encode("utf-8")
 str_url = base64.b64encode(bytes_url)  # 被编码的参数必须是二进制数据
 print(str_url)
b'aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8='

解密

 # 将base64解码成字符串
 import base64
 url = "aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8="
 str_url = base64.b64decode(url).decode("utf-8")
 print(str_url)
'https://www.cnblogs.com/songzhixue/'

五、redis操作

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

Redis 在 Java Web 主要有两个应用场景

存储 缓存 用的数据;
需要高速读/写的场合使用它快速读/写;

1>当第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;

2>当第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。

关系型数据库

mysql 、 oracle 、 sqlserver 、 sqlite

非关系型数据库

mongodb  、 redis

 关系型数据库

优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库

优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

5.1 首先导入redis

import redis

# redis 每秒钟达到10w次读写,存在内存里面# web 开发时用redis做缓存

redis只有ip、端口号、密码
118.24.3.40、
6379、
HK139bc&*
 import redis

 r = redis.Redis(
     host='118.24.3.40',
     password='HK139bc&*',
     port=6379,
     db=0,
     decode_responses=True)

 r.set('dabaobao', '{"msg":"hejfdsfdsaj dlajfwajofjdsa是范德萨范德萨"}')

 # 字符串
 # 传送数据
 r.set('name','小黄')  # set就是传送数据(k,v)

 # 获取数据
 r.get('name')

 # 删除数据
 r.delete('mjz_students')
 print(r.get('mjz_students').decode()) # 后面加 .decode()就把beyte类型变成字符串
 r.set('mjz_students', '{"msg":"sdfdgwsd"}', 20)  # 第三个参数设定过期时间:运行20秒后过期
 r.expire('dabaobao',30)  # 设置失效时间,给'dabaobao'这个key加30秒时间
 r = redis.Redis(
     host='118.24.3.40',
     password='HK139bc&*',
     port=6379,
     db=0,
     decode_responses=True) # decode_responses=True 可以自动将查出来的code变成字符串

5.2 哈希类型

第一个参数表示:传送Key是谁

第二个参数表示:传送小key

第三个参数表示:传送小key的value

 r.hset("students",'bzz','{"money":500,"addr":"北京"}')
 r.hset("students",'qdk','{"money":520,"addr":"上海"}')
 r.hset("students",'yrd','{"money":501,"addr":"北京"}')
 r.hset("students",'pld','{"money":502,"addr":"南京"}')

5.3 其他方法

 #其他方法
 r.flushall() # 清空所有数据库的所有内容
 r.flushdb()  # 清空当前数据库里面的数据
 r.exists('name') # 判断key是否存在
 r.keys()     # 获取单数数据库所有的key
 r.type('name')  # 获取key的类型

5.4 redis迁移

1、从redis里面获取所有的key2、判断key的类型3、根据key 的类型,使用set/hset4、set 到redis里
 import redis

 r = redis.Redis(
     host='118.24.3.40',
     password='HK139bc&*',
     port=6379,
     db=0,
     decode_responses=True) # decode_responses=True 可以自动将查出来的code变成字符串

 r2 = redis.Redis(
     host='118.24.3.40',
     password='HK139bc&*',
     port=6378,
     db=0,
     decode_responses=True)
 # 数据迁移
 # 1、从redis里面获取所有的key
 # 2、判断key的类型
 # 3、根据key 的类型,使用set/hset
 # 4、set 到redis里

 for k in r.keys():
     if r.type(k) == 'string':
         value = r.get(k)
         r2.set(k,value)
     if r.type(k) == 'hash':
         value = r.hgetall(k) # 获取所有的
         r2.hmset(k,value)

5.5 管道

1、 先把数据保存到pipeline里2、 执行管道,一次性把所有数据传过去优点:传送数据比较快(批量执行)
 pipeline = r.pipeline()  # 建立一个管道
 l = range(500)
 for i in l:
     pipeline.set("key%s" %i,str(i)) # 1、先把数据存到管道里
 pipeline.execute()  # 2、执行管道,一次性把所有数据传过去

python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作的相关教程结束。

《python语言(五)匿名函数、读写excel、操作数据库、加密、redis操作.doc》

下载本文的Word格式文档,以方便收藏与打印。