From 8e861a8ad1fbac2daf57df3e6c9686338b18399b Mon Sep 17 00:00:00 2001 From: jackfrued Date: Sun, 3 Jun 2018 20:14:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E7=88=AC=E8=99=AB?= =?UTF-8?q?=E9=98=B6=E6=AE=B5=E7=9A=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Day01-15/Day01/peppa_pig.py | 193 ++++++++++++++ ...30\345\202\250\346\225\260\346\215\256.md" | 249 +++++++++++++++++- 2 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 Day01-15/Day01/peppa_pig.py diff --git a/Day01-15/Day01/peppa_pig.py b/Day01-15/Day01/peppa_pig.py new file mode 100644 index 0000000..d33858a --- /dev/null +++ b/Day01-15/Day01/peppa_pig.py @@ -0,0 +1,193 @@ +from turtle import* + + +def nose(x,y):#鼻子 + penup()#提起笔 + goto(x,y)#定位 + pendown()#落笔,开始画 + setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南) + begin_fill()#准备开始填充图形 + a=0.4 + for i in range(120): + if 0<=i<30 or 60<=i<90: + a=a+0.08 + left(3) #向左转3度 + forward(a) #向前走a的步长 + else: + a=a-0.08 + left(3) + forward(a) + end_fill()#填充完成 + + penup() + setheading(90) + forward(25) + setheading(0) + forward(10) + pendown() + pencolor(255,155,192)#画笔颜色 + setheading(10) + begin_fill() + circle(5) + color(160,82,45)#返回或设置pencolor和fillcolor + end_fill() + + penup() + setheading(0) + forward(20) + pendown() + pencolor(255,155,192) + setheading(10) + begin_fill() + circle(5) + color(160,82,45) + end_fill() + + +def head(x,y):#头 + color((255,155,192),"pink") + penup() + goto(x,y) + setheading(0) + pendown() + begin_fill() + setheading(180) + circle(300,-30) + circle(100,-60) + circle(80,-100) + circle(150,-20) + circle(60,-95) + setheading(161) + circle(-300,15) + penup() + goto(-100,100) + pendown() + setheading(-30) + a=0.4 + for i in range(60): + if 0<=i<30 or 60<=i<90: + a=a+0.08 + lt(3) #向左转3度 + fd(a) #向前走a的步长 + else: + a=a-0.08 + lt(3) + fd(a) + end_fill() + + +def ears(x,y): #耳朵 + color((255,155,192),"pink") + penup() + goto(x,y) + pendown() + begin_fill() + setheading(100) + circle(-50,50) + circle(-10,120) + circle(-50,54) + end_fill() + + penup() + setheading(90) + forward(-12) + setheading(0) + forward(30) + pendown() + begin_fill() + setheading(100) + circle(-50,50) + circle(-10,120) + circle(-50,56) + end_fill() + + +def eyes(x,y):#眼睛 + color((255,155,192),"white") + penup() + setheading(90) + forward(-20) + setheading(0) + forward(-95) + pendown() + begin_fill() + circle(15) + end_fill() + + color("black") + penup() + setheading(90) + forward(12) + setheading(0) + forward(-3) + pendown() + begin_fill() + circle(3) + end_fill() + + color((255,155,192),"white") + penup() + seth(90) + forward(-25) + seth(0) + forward(40) + pendown() + begin_fill() + circle(15) + end_fill() + + color("black") + penup() + setheading(90) + forward(12) + setheading(0) + forward(-3) + pendown() + begin_fill() + circle(3) + end_fill() + + +def cheek(x,y):#腮 + color((255,155,192)) + penup() + goto(x,y) + pendown() + setheading(0) + begin_fill() + circle(30) + end_fill() + + +def mouth(x,y): #嘴 + color(239,69,19) + penup() + goto(x,y) + pendown() + setheading(-80) + circle(30,40) + circle(40,80) + + +def setting(): #参数设置 + pensize(4) + hideturtle() #使乌龟无形(隐藏) + colormode(255) #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内 + color((255,155,192),"pink") + setup(840,500) + speed(10) + + +def main(): + setting() #画布、画笔设置 + nose(-100,100) #鼻子 + head(-69,167) #头 + ears(0,160) #耳朵 + eyes(0,140) #眼睛 + cheek(80,10) #腮 + mouth(-20,30) #嘴 + done() + + +if __name__ == '__main__': + main() diff --git "a/Day66-75/03.\345\255\230\345\202\250\346\225\260\346\215\256.md" "b/Day66-75/03.\345\255\230\345\202\250\346\225\260\346\215\256.md" index b491130..6bd205a 100644 --- "a/Day66-75/03.\345\255\230\345\202\250\346\225\260\346\215\256.md" +++ "b/Day66-75/03.\345\255\230\345\202\250\346\225\260\346\215\256.md" @@ -193,15 +193,260 @@ b'admin' MongoDB是2009年问世的一个面向文档的数据库管理系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。虽然在划分类别的时候后,MongoDB被认为是NoSQL的产品,但是它更像一个介于关系数据库和非关系数据库之间的产品,在非关系数据库中它功能最丰富,最像关系数据库。 -MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象。目前,MongoDB已经提供了对Windows、MacOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。 +MongoDB将数据存储为一个文档,一个文档由一系列的“键值对”组成,其文档类似于JSON对象,但是MongoDB对JSON进行了二进制处理(能够更快的定位key和value),因此其文档的存储格式称为BSON。关于JSON和BSON的差别大家可以看看MongoDB官方网站的文章[《JSON and BSON》](https://www.mongodb.com/json-and-bson)。 + +目前,MongoDB已经提供了对Windows、MacOS、Linux、Solaris等多个平台的支持,而且也提供了多种开发语言的驱动程序,Python当然是其中之一。 #### MongoDB的安装和配置 +可以从MongoDB的[官方下载链接](https://www.mongodb.com/download-center#community)下载MongoDB,官方为Windows系统提供了一个Installer程序,而Linux和MacOS则提供了压缩文件。下面简单说一下Linux系统如何安装和配置MongoDB。 + +```Shell + +# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.6.5.tgz +# gunzip mongodb-linux-x86_64-amazon-3.6.5.tgz +# mkdir mongodb-3.6.5 +# tar -xvf mongodb-linux-x86_64-amazon-3.6.5.tar --strip-components 1 -C mongodb-3.6.5/ +# export PATH=$PATH:~/mongodb-3.6.5/bin +# mkdir -p /data/db +# mongod --bind_ip 172.18.61.250 +2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] MongoDB starting : pid=1163 port=27017 dbpath=/data/db 64-bit host=iZwz97tbgo9lkabnat2lo8Z +2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] db version v3.6.5 +2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] git version: a20ecd3e3a174162052ff99913bc2ca9a839d618 +2018-06-03T18:03:28.232+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.0-fips29 Mar 2010 +... +2018-06-03T18:03:28.945+0800 I NETWORK [initandlisten] waiting for connections on port 27017 +``` + +> 说明:上面的操作中,export命令是设置PATH环境变量,这样可以在任意路径下执行mongod来启动MongoDB服务器。MongoDB默认保存数据的路径是/data/db目录,为此要提前创建该目录。此外,在使用mongod启动MongoDB服务器时,—bind_ip参数用来将服务绑定到指定的IP地址,也可以用—port参数来指定端口,默认端口为27017。 + +#### MongoDB基本概念 + +我们通过与关系型数据库进行对照的方式来说明MongoDB中的一些概念。 + +| SQL | MongoDB | 解释(SQL/MongoDB) | +| ----------- | ----------- | ---------------------- | +| database | database | 数据库/数据库 | +| table | collection | 二维表/集合 | +| row | document | 记录(行)/文档 | +| column | field | 字段(列)/域 | +| index | index | 索引/索引 | +| table joins | --- | 表连接/嵌套文档 | +| primary key | primary key | 主键/主键(`_id`字段) | + +#### 通过Shell操作MongoDB +启动服务器后可以使用交互式环境跟服务器通信,如下所示。 -#### 使用MongoDB实现CRUD操作 +```shell +# mongo --host 172.18.61.250 +MongoDB shell version v3.6.5 +connecting to: mongodb://172.18.61.250:27017/ +... +> +``` + +1. 查看、创建和删除数据库。 + + ```JavaScript + + > // 显示所有数据库 + > show dbs + admin 0.000GB + config 0.000GB + local 0.000GB + > // 创建并切换到school数据库 + > use school + switched to db school + > // 删除当前数据库 + > db.dropDatabase() + { "ok" : 1 } + > + ``` + +2. 创建、删除和查看集合。 + + ```JavaScript + + > // 创建并切换到school数据库 + > use school + switched to db school + > // 创建colleges集合 + > db.createCollection('colleges') + { "ok" : 1 } + > // 创建students集合 + > db.createCollection('students') + { "ok" : 1 } + > // 查看所有集合 + > show collections + colleges + students + > // 删除colleges集合 + > db.colleges.drop() + true + > + ``` + + > 说明:在MongoDB中插入文档时如果集合不存在会自动创建集合,所以也可以按照下面的方式通过创建文档来创建集合。 + +3. 文档的CRUD操作。 + + ```JavaScript + + > // 向students集合插入文档 + > db.students.insert({stuid: 1001, name: '骆昊', age: 38}) + WriteResult({ "nInserted" : 1 }) + > // 向students集合插入文档 + > db.students.save({stuid: 1002, name: '王大锤', tel: '13012345678', gender: '男'}) + WriteResult({ "nInserted" : 1 }) + > // 查看所有文档 + > db.students.find() + { "_id" : ObjectId("5b13c72e006ad854460ee70b"), "stuid" : 1001, "name" : "骆昊", "age" : 38 } + { "_id" : ObjectId("5b13c790006ad854460ee70c"), "stuid" : 1002, "name" : "王大锤", "tel" : "13012345678", "gender" : "男" } + > // 更新stuid为1001的文档 + > db.students.update({stuid: 1001}, {'$set': {tel: '13566778899', gender: '男'}}) + WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) + > // 插入或更新stuid为1003的文档 + > db.students.update({stuid: 1003}, {'$set': {name: '白元芳', tel: '13022223333', gender: '男'}}, upsert=true) + WriteResult({ + "nMatched" : 0, + "nUpserted" : 1, + "nModified" : 0, + "_id" : ObjectId("5b13c92dd185894d7283efab") + }) + > // 查询所有文档 + > db.students.find().pretty() + { + "_id" : ObjectId("5b13c72e006ad854460ee70b"), + "stuid" : 1001, + "name" : "骆昊", + "age" : 38, + "gender" : "男", + "tel" : "13566778899" + } + { + "_id" : ObjectId("5b13c790006ad854460ee70c"), + "stuid" : 1002, + "name" : "王大锤", + "tel" : "13012345678", + "gender" : "男" + } + { + "_id" : ObjectId("5b13c92dd185894d7283efab"), + "stuid" : 1003, + "gender" : "男", + "name" : "白元芳", + "tel" : "13022223333" + } + > // 查询stuid大于1001的文档 + > db.students.find({stuid: {'$gt': 1001}}).pretty() + { + "_id" : ObjectId("5b13c790006ad854460ee70c"), + "stuid" : 1002, + "name" : "王大锤", + "tel" : "13012345678", + "gender" : "男" + } + { + "_id" : ObjectId("5b13c92dd185894d7283efab"), + "stuid" : 1003, + "gender" : "男", + "name" : "白元芳", + "tel" : "13022223333" + } + > // 查询stuid大于1001的文档只显示name和tel字段 + > db.students.find({stuid: {'$gt': 1001}}, {_id: 0, name: 1, tel: 1}).pretty() + { "name" : "王大锤", "tel" : "13012345678" } + { "name" : "白元芳", "tel" : "13022223333" } + > // 查询name为“骆昊”或者tel为“13022223333”的文档 + > db.students.find({'$or': [{name: '骆昊'}, {tel: '13022223333'}]}, {_id: 0, name: 1, tel: 1}).pretty() + { "name" : "骆昊", "tel" : "13566778899" } + { "name" : "白元芳", "tel" : "13022223333" } + > // 查询学生文档跳过第1条文档只查1条文档 + > db.students.find().skip(1).limit(1).pretty() + { + "_id" : ObjectId("5b13c790006ad854460ee70c"), + "stuid" : 1002, + "name" : "王大锤", + "tel" : "13012345678", + "gender" : "男" + } + > // 对查询结果进行排序(1表示升序,-1表示降序) + > db.students.find({}, {_id: 0, stuid: 1, name: 1}).sort({stuid: -1}) + { "stuid" : 1003, "name" : "白元芳" } + { "stuid" : 1002, "name" : "王大锤" } + { "stuid" : 1001, "name" : "骆昊" } + > // 在指定的一个或多个字段上创建索引 + > db.students.ensureIndex({name: 1}) + { + "createdCollectionAutomatically" : false, + "numIndexesBefore" : 1, + "numIndexesAfter" : 2, + "ok" : 1 + } + > + ``` + +使用MongoDB可以非常方便的配置数据复制,通过冗余数据来实现数据的高可用以及灾难恢复,也可以通过数据分片来应对数据量迅速增长的需求。关于MongoDB更多的操作可以查阅[官方文档](https://mongodb-documentation.readthedocs.io/en/latest/) ,同时推荐大家阅读Kristina Chodorow写的[《MongoDB权威指南》](http://www.ituring.com.cn/book/1172)。 + +####在Python程序中操作MongoDB + +可以通过pip安装pymongo来实现对MongoDB的操作。 + +```Shell + +$ pip3 install pymongo +$ python3 +``` +```Python + +>>> from pymongo import MongoClient +>>> client = MongoClient('mongodb://120.77.222.217:27017') +>>> db = client.school +>>> for student in db.students.find(): +... print('学号:', student['stuid']) +... print('姓名:', student['name']) +... print('电话:', student['tel']) +... +学号: 1001.0 +姓名: 骆昊 +电话: 13566778899 +学号: 1002.0 +姓名: 王大锤 +电话: 13012345678 +学号: 1003.0 +姓名: 白元芳 +电话: 13022223333 +>>> db.students.find().count() +3 +>>> db.students.remove() +{'n': 3, 'ok': 1.0} +>>> db.students.find().count() +0 +>>> coll = db.students +>>> from pymongo import ASCENDING +>>> coll.create_index([('name', ASCENDING)], unique=True) +'name_1' +>>> coll.insert_one({'stuid': int(1001), 'name': '骆昊', 'gender': True}) + +>>> coll.insert_many([{'stuid': int(1002), 'name': '王大锤', 'gender': False}, {'stuid': int(1003), 'name': '白元芳', 'gender': True}]) + +>>> for student in coll.find({'gender': True}): +... print('学号:', student['stuid']) +... print('姓名:', student['name']) +... print('性别:', '男' if student['gender'] else '女') +... +学号: 1001 +姓名: 骆昊 +性别: 男 +学号: 1003 +姓名: 白元芳 +性别: 男 +>>> +``` +关于PyMongo更多的知识可以通过它的[官方文档](https://api.mongodb.com/python/current/tutorial.html)进行了解。 ### 实例 - 缓存知乎发现上的链接和页面代码 -- GitLab