Python每日一练(1)
这两天在做Python的每日一练,感觉收获颇丰,所以来记录分享一下,一共做了三个,涉及socket,PIL,pymysql三个库,另外终于开始了Flask框架的学习,后续也会做出一些分析
第一个是一个简单的socket练习,主要就是实现两个终端之间的交互,此次原本想是服务端脚本放在虚拟机里,然后主机当作客户端实现交互,可是,所有端口都放行,防火墙也设置通过之后,还是无法实现交互,总是被拒绝连接,之后只好在一台机子上进行测试,遂成功。
下面简单记录一下这次的socket(安全套接字)的基本步骤:
首先就是要有两个端的脚本,一个server端的,一个client端的。
server端主要有以下功能:
1、设置服务端口,并与主机绑定(突然想到可能由于没有设置地址的原因导致主机无法ip访问)
2、反馈信息,当客户端访问时
client端主要是以下功能:
1、向服务端发送请求访问信息
2、获取服务端反馈信息
代码仍需改善这次就不贴出了丢人了,大致实现效果如下
第二个是实现在图片的右上角添加文字,主要涉及到PIL库的一些相关模块,首先PIL是专门用于对图片进行操作的库,所以加强对其掌握还是很有必要的,闲话不多说,来看一下这个题目:
1、想要实现在图片上写文字,主要是这样一个思路,实例化一个图片对象,然后选择填充文字的字体和颜色进行填充即可
注:对于定位到右上角这样的问题,我的理解是这样的,首先一个图片的坐标,从左上角开始定位是(0,0),而偏移符合我们高中数学函数平移的规则,即左加右减原则,所以移到右上角只要在宽度的基础上减去一个值即可
下面是代码示例和最终效果截图:
1 # -*- coding:utf-8 -*- 2 # 每日一练:将你的 QQ 头像(或者微博头像)右上角加上红色的数字 3 # 类似于微信未读信息数量那种提示效果。 4 # Author : Konmu 5 6 from PIL import Image,ImageFont,ImageDraw 7 8 def Image_fill(im_file,num): 9 im=Image.open(im_file) 10 width,height=im.size 11 font_type=ImageFont.truetype('C:/Windows/fonts/字酷堂海藏楷体.ttf',50) 12 fill_color='steelblue' 13 draw=ImageDraw.ImageDraw(im) 14 draw.text((width-50,0),str(num),fill=fill_color,font=font_type) 15 #图片坐标左上角开始为原点,平移符合了左加右减原则 16 #故到达右上角即减去一个偏移量即可 17 save_file='C:/Users/xxx/Desktop/output.jpg' 18 im.save(save_file) 19 20 if __name__=='__main__': 21 Image_fill('C:/Users/xxx/Desktop/少天.jpg',21)
最终效果:
第三个是实现生成20个随机激活码并保存至关联性数据库mysql中,对于python对数据库的操作俗说君也是第一次接触故而这次也是简单的学习了一下,后续还需加强练习。
分析一下这个问题,首先生成激活码这种事并不难,我们平时玩游戏时领取礼包的一些激活码可以发现大多都是一些字母和数字的组合,所以我们只要生成一些类似这样形式的字符串即可模拟出激活码的效果。剩下来就是解决他的存储问题,python中提供了pymysql库帮助我们和mysql数据库进行连接,我们这里也采用这个库来实现我们的目标。
下面先来看几个本次会用到的基本的mysql语句,其他详细的语法请自行查阅:
1 create database test; #创建数据库 2 create table gencode(id int auto_increment primary key,value varchar(20)); #创建数据表,id 是采用的自增长型 3 insert into gencode(id,value) values (1,'GB0XRF2boYF2BPEp46l5') #向表中插入数据,这里要注意数据的类型 4 drop table if exists test; #删除已存在的表
接下来看看pymysql的相关语句:
1 db=pymysql.connect('localhost','user','password','table') #连接本地数据库,其中用户,密码和数据库填写自己的信息即可 2 cursor=db.cursor() #创建cursor对象 3 cursor.execute(sql) #执行相关sql语句 4 db.commit() #提交数据到数据库 5 db.close() #关闭数据库
下面来看看完整代码和最终效果:
1 #!/user/bin/python3 2 #-*-coding:utf-8 *-* 3 #Author:konmu 4 #生成激活码(或者优惠券),使用 Python 如何生成20个激活码(或者优惠券)?将生成的激活码(或者优惠券)保存到 MySQL 关系型数据库中。 5 6 import pymysql 7 import random,string 8 9 def genkey(): 10 getChars = string.ascii_letters+string.digits 11 generate = "".join([random.choice(getChars)for i in range(20)]) 12 return(generate) 13 14 def table_insert(cursor, db): 15 for i in range(20): 16 sql = "insert into gencode (id,value) values ({0},'{1}')".format("null", genkey())#向表中插入数据 17 cursor.execute(sql) 18 db.commit() 19 20 if __name__=='__main__': 21 db = pymysql.connect("localhost", "root", "123456", "test")#本次测试使用的数据库是test 22 cursor = db.cursor()#创建cursor对象 23 cursor.execute("drop table if exists gencode")#删除gencode表如果已存在的话 24 sql = "create table generateCodes(id int auto_increment primary key, value varchar(50))"#创建表 25 try: 26 cursor.execute(sql) 27 db.commit() 28 except: 29 db.rollback() 30 genkey() 31 table_insert(cursor, db) 32 db.close()
最终效果: