'''
l.sort() sort不带参数, 升序排序
reverse 布尔类型: true:降序排序, false: 升序排序, 默认值是false
key 比较函数, 默认是按照数据类型比较(整数,默认int)
'''
l = [10, 0, 1, 6, 12, 8]
l.sort(key=str)
print(l)
t = (10, 0, 1, 6, 12, 8)
nt = sorted(t, reverse=True, key=str)
print(nt)
print(t)
'''
sort是列表的方法, sorted是全局方法
sort会改变原有对象的数据, sorted不会改变原有数据而是返回一个新对象
sort只能排序列表, sorted可以排序列表/元组
sorted返回的数据类型是列表
reverse 布尔类型: true:降序排序, false: 升序排序, 默认值是false
key 比较函数, 默认是按照数据类型比较(整数,默认int)
'''
'''
10 0
int: 10 0
str: str(10),str(0),str(1),str(6),str(12),str(8) ==> ['10', '0', '1', '6', '12', '8'] 排序后: ['0','10']
'1a' '12'
'''
'''
ASCII表
参考地址: https://baike.baidu.com/item/ASCII/309296?fromtitle=ascii%E7%A0%81%E8%A1%A8&fromid=19660475&fr=aladdin
主要掌握知识点:
1. 0 a A 在ASCII中的编码
2. ASCII使用16进制的表示形式: 如\x01
'''
'''
集合的元素 只能是不可变类型, 不能是可变类型
字典的键 只能是不可变类型, 不能是可变类型
改变指的是内存中数据的改变
a-> 0x001(内存空间)
不可变类型: int/float/str/tuple/bool
可变类型: list/set/dict
'''
'''
map(映射) 将一个元素通过一种方法转换成另外一个元素
- 转换函数
- 待映射的数据
会对列表里的每个元素, 使用转换函数进行转换, 得到一个新的列表
map(st
# 定义一个列表来存储所有学生信息
import sqlite3
conn = sqlite3.connect('student.db')
conn.execute('''
create table if not exists student (
sid text primary key not null,
name text not null,
sex text not null,
phone text not null
)
''')
# 打印功能菜单
def print_menu():
print('=' * 30)
print('学生管理系统')
print('1.添加学生信息')
print('2.删除学生信息')
print('3.修改学生信息')
print('4.显示所有学生信息')
print('0.退出系统')
print('=' * 30)
# 添加学生信息
def add_stu_info():
sid = input('请输入新学生的学号:')
cursor = conn.execute("select * from student where sid=?", (sid,))
if len(cursor.fetchall()) > 0:
print('要添加的学生已存在')
else:
name = input('请输入新学生的姓名:')
sex = input('请输入新学生的性别:')
phone = input('请输入新学生的手机号码:')
conn.execute("insert into student(sid,name,sex,phone) values (?,?,?,?)", (sid, name, sex, phone))
conn.commit()
# 删除学生信息
def del_stu_info():
sid = input('请输入要删除的学号:')
cursor = conn.execute("select * from student where s
Python 3.x版安装完成后有内附SQLite数据库,这一章将以此为实例讲解,在使用此SQLite前需要导入此SQLite
import sqlite3
为了使用 sqlite3 模块,您首先必须创建一个表示数据库的连接对象,然后您可以有选择地创建光标对象,这将帮助您执行所有
的 SQL 语句。
操作数据库之前需要先连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
使用connect方法连接数据, 格式为:
sqlite3.connect(database [,timeout ,other optional arguments])
该 API 打开一个到 SQLite 数据库文件 database 的链接。您可以使用 “:memory:” 来在 RAM 中打开一个到 database 的数
据库连接,而不是在磁盘上打开。如果数据库成功打开,则返回一个连接对象。
当一个数据库被多个连接访问,且其中一个修改了数据库,此时 SQLite 数据库被锁定,直到事务提交。timeout 参数表示连接
等待锁定的持续时间,直到发生异常断开连接。timeout 参数默认是 5.0(5 秒)。
如果给定的数据库名称 filename 不存在,则该调用将创建一个数据库。如果您不想在当前目录中创建数据库,那么您可以指定
带有路径的文件名,这样您就能在任意地方创建数据库。
例如:
import sqlite3
conn = sqlite3.connect('test.db')
print ("数据库打开成功")
运行上面的程序,在当前目录中创建我们的数据库 test.db, 可以根据需要改变路径
在这里,您也可以把数据库名称复制为特定的名称 :memory: ,这样就会在 RAM 中创建一个数据库。
游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。每个游标区都有一个名字,用户可以用SQL语句
逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
使用cursor函数获取游标, 格式如下
--创建表 create table
create table 表名 (列名1 列类型,列名2 列类型, ..., 列名n 列类型);
-- 分号;用户分隔多条sql语句, 多个sql语句同时执行, 分号必不可少. 如果只执行一条sql, 分号可有可无
create table student_01 (student_no text, name text, birthday text, sex text);
--添加数据(插入数据)
insert into 表名 (列名1,列名2,...,列名n) values (数据1,数据2,...,数据n);
--sql中字符串必须只能用单引号, 不能用双引号
insert into student_01 (student_no, name, birthday, sex) values ('0001','张三','2000-10-11','男');
--当插入的字段是表里面所有字段时, 字段列表可以省略. 条件是数据的顺序必须和字段的顺序保持一致
insert into student_01 values ('0001','张三','2000-10-11','男');
insert into student_01 values ('张三','0001','2000-10-11','男');
-- 使用sql建一张成绩表 score_01
--查询数据
select 列名1,列名2,...,列名n from 表名;
select student_no,name,birthday,sex from student_01;
--当我们查一张表的所有字段时, 可以用*代替字段名
select * from student_01;
--条件查询, 列表=列值 (比较运算符) (相等: =) <><=>=!=
select * from student_01 where student_no='0001';
select * from student_01 where name='张三';
--sql同样支持逻辑运算符, and or
select * from student_01 where student_no='0001' and name='张三';
s
SQLite 数据类型是一个用来指定任何对象的数据类型的属性。SQLite 中的每一列,每个变量和表达式都有相关的数据类型。
您可以在创建表的同时使用这些数据类型。SQLite 使用一个更普遍的动态类型系统。在 SQLite 中,值的数据类型与值本身是
相关的,而不是与它的容器相关
每个存储在 SQLite 数据库中的值都具有以下存储类之一:
SQLite 的 CREATE TABLE 语句用于在任何给定的数据库创建一个新表。创建基本表,涉及到命名表、定义列及每一列的数据类
型。
CREATE TABLE 语句的基本语法如下:
CREATE TABLE database_name.table_name(
column1 datatype PRIMARY KEY(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
)
SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行
INSERT INTO 语句有两种基本语法,如下所示:
INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]
VALUES (value1, value2, value3,...valueN);
在这里,column1, column2,…columnN 是要插入数据的表中的列的名称
如果要为表中的所有列添加值,您也可以不需要在 SQLite 查询中指定列名称。但要确保值的顺序与列在表中的顺序一致。
SQLite 的 INSERT INTO 语法如下:
INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
SQLite 的 SELECT 语句用于从 SQLite 数据库表中获取数据,以结果表的形式返回数据。这些结果表也被称为结果集。
SQLite 的 SELECT 语句的基本语法如下:
S
每个人家里都会有冰箱,冰箱是用来干什么的?冰箱是用来存放食物的地方
同样的,数据库是存放数据的地方。正是因为有了数据库后,我们可以直接查找数据。
例如支付宝查看自己的账户收益,就是从数据库读取数据后给你的。
有人可能会问了:我的数据就存放在自己电脑的excel表里就可以了,为什么还要搞个数据库呢?
这是因为数据库比excel有更多的优势。数据库可以存放大量的数据,允许很多人同时使用里面的数据。
举个例子,excel好比是一个移动硬盘,我们使用了这个移动硬盘其他人就用不了了。数据库好比是网盘,很多人可以同时访问里面里的数据。而且网盘比移动硬盘能放更多的数据。
数据库有很多种类,这里我们重点学习使用最广泛的关系数据库。
关系数据库是由多个表组成的。就像Excel一样,Excel是一张一张的二维表。每个表都是由行和列组成的。
同样的,关系数据库里存放的也是一张一张的表,只不过各个表之间是有联系的。所以,简单来说:
关系数据库=多张表+各表之间的关系
对应的,学会关系数据库我们只要掌握两点就可以:
表的结构是指要了解关系数据库中每张表长什么样。
每个表由一个名字标识。表包含带有列名的列,和记录数据的行。我们举个具体的例子就一目了然了。
下面图片里的表名是:学生表,记录了每个学生的信息。
表中每一列都有一个名字来标识出该列,这个表里有4列,列名分别是学号,姓名,出生日期,性别。从列名上你也可以知道这一列对应记录的是什么数据。
表的每一行里记录着数据。这里的一行表示该名学生的信息,比如第2行是学号0002学生的信息,他的姓名是猴子,出生日期是1990-12-21,性别是女。
关系数据库是由多张表组成的,图片里是存放在学校数据库里的4张表。
你能发现下面这4张表之间有什么关系吗?
其实,数据之间也是有关系的。关系数据库里各个表之间如何建立起关系呢?
我们来看图中“学生表”,“成绩表”这两个表之前的关系。
这两张表通过”学号”关联起来,为了更清楚的看到这两个表的关系,PPT里我用相同
import smtplib
from email.header import Header
from email.mime.text import MIMEText
# 发送方的账号密码
sender = "lou_yj@163.com"
password = "EKKGWNSQKDPAIYWN"
receivers = ["super_leoning@163.com"]
subject = "测试邮件"
# 最简单的纯文本邮件->plain
# application/json, text/plain, text/xml
message = MIMEText("这是一封测试邮件", "plain", "utf-8") # 邮件正文, 邮件类型, 邮件编码
message["From"] = Header(sender, "utf-8") # 发件人信息
message["To"] = Header(';'.join(receivers), "utf-8") # 收件人
message["Subject"] = Header(subject, "utf-8") # 标题
smtpObj = smtplib.SMTP("smtp.163.com", 25) # 和服务器进行连接
smtpObj.login(sender, password) # 登录
smtpObj.sendmail(sender, receivers, message.as_string()) # 发邮件
smtpObj.quit() # 关闭
print("邮件发送成功")