Python 练习册

最近在Github上发现一些挺不错的练习题,觉得挺有意思的,拿来练练手。会不间断更新。
Python 练习册,每天一个小程序

第 0000 题:

将你的 QQ 头像(或者微博头像)右上角加上红色的数字,类似于微信未读信息数量那种提示效果。 类似于图中效果
这里写图片描述

我用了PIL模块。PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。
我的编译环境为anaconda3 + pycharm

@requires_authorization
from PIL import Image, ImageDraw, ImageFont

def main():
    #打开图片
    im = Image.open('weixin.jpg')
    #查看图片大小、格式和模式
    print(im.size, im.format, im.mode)
    im_size = im.size
    #选择对应的字体大小
    font_size = int(0.3*im_size[0])
    #设置字体格式和字体大小,字体大小参数为整形
    ft = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', size=font_size)
    #(0.85*im_size[0],0)用来确定数字位置,'4'为要写入的数字
    ImageDraw.Draw(im).text((0.8*im_size[0], 0), u'4', font=ft, fill='red')
    #会直接调用Windows照片查看器来显示图片
    im.show()
    print('显示完成')
    im.save('new.jpg')
    print('新建并保存')

if __name__ == '__main__':
    main()

原图片
原图片
效果图
这里写图片描述

参考教程
http://blog.csdn.net/icamera0/article/details/50762050
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000

第 0001 题:

做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券),使用 Python 如何生成 200 个激活码(或者优惠券)?
开始用的是string模块生成大小写的字母加0到9数字的字符串,然后用random模块随机从改字符串中取数,后来发现有个叫uuid的模块,专门用来生产这个,uuid模块的介绍网上百度一大堆。
dis模块是用来看python变成汇编语言是怎么样的,毕竟学过单片机的汇编,挺感兴趣的。

@requires_authorization
import string
import random
import uuid
#import dis

def create_num(num, length=16):
    result = []
    while num > 0:
        uuid_id = uuid.uuid1()
        # 删去字符串中的'-',取出前length 个字符
        temp = str(uuid_id).replace('-', '')[:length]
        if temp not in result:
            result.append(temp)
            num -= 1
    return result


def generate_activation_code(n):
    a = string.ascii_letters + string.digits
    f = 0
    key_list = []
    while f<200:
        f += 1
        key = random.choice(a)
        for i in range(n-1):
            key += random.choice(a)
        key_list.append(key)
    return key_list


def main():
    n = int(input('请输入验证码位数:(12--24位)'))
    if n>=12 and n<=24:
        key_list = create_num(200,n)
    else:
        print('位数需要在12到24位之间!')
    for key in key_list:
        print(key)
    # print(dis.dis(main))

if __name__=='__main__':
    main()

第 0002 题:

将 0001 题生成的 200 个激活码(或者优惠券)保存到 MySQL 关系型数据库中。
这个就比较恶心了,先要安装mysql,我用的是win10系统,MySQL数据库安装与配置详解
然后要先设一个用户和密码,然后要创建一个数据库,再创建一个表和标题。这样才能用pymysql模块连接数据库,pymysql可以用conda install pymysql 命令安装。

    #连接到数据库
    connect = pymysql.connect(host='127.0.0.1',
                              user='你的主机名',
                              passwd='你的密码',
                              db='你的数据库名',
                              charset='utf8')

user和passwd是你的用户名和密码,db是你的数据库名

@requires_authorization
import uuid
import pymysql

def create_num(num, length=16):
    result = []
    while num > 0:
        uuid_id = uuid.uuid1()
        # 删去字符串中的'-',取出前length 个字符
        temp = str(uuid_id).replace('-', '')[:length]
        if temp not in result:
            result.append(temp)
            num -= 1
    return result

def main():
    n = int(input('请输入验证码位数:(12--24位)'))
    if n>=12 and n<=24:
        key_list = create_num(200,n)
    else:
        print('位数需要在12到24位之间!')

    #连接到数据库
    connect = pymysql.connect(host='127.0.0.1',
                              user='你的主机名',
                              passwd='你的密码',
                              db='你的数据库名',
                              charset='utf8')
    #创建游标
    cursor = connect.cursor()
    #全表删除
    cursor.execute('TRUNCATE TABLE activation_code')
    for i, key in enumerate(key_list):
        print(key)
        cursor.execute("""INSERT INTO activation_code VALUE(%s, %s)""", (i, key))
    connect.commit()
    cursor.execute('SELECT * from activation_code')
    lists = cursor.fetchall()
    for list in lists:
        print(list)

    connect.close()


if __name__=='__main__':
    main()

第 0010 题:

使用 Python 生成类似于下图中的字母验证码图片
这里写图片描述
廖雪峰老师在讲PIL的时候顺便把第十题做了,链接是第0000题的第二个。
代码已经在anaconda3+pycharm环境下试过了

@requires_authorization
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import random

# 随机字母:
def rndChar():
    return chr(random.randint(65, 90))

# 随机颜色1:
def rndColor():
    return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))

# 随机颜色2:
def rndColor2():
    return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))

def main():
    # 240 x 60:
    width = 60 * 4
    height = 60
    image = Image.new('RGB', (width, height), (255, 255, 255))
    # 创建Font对象:
    font = ImageFont.truetype('C:\Windows\Fonts\Arial.ttf', 40)
    # 创建Draw对象:
    draw = ImageDraw.Draw(image)
    # 填充每个像素:
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor())
    # 输出文字:
    for t in range(4):
        draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
    # 模糊:
    image = image.filter(ImageFilter.BLUR)
    image.show()
    image.save('010-code.jpg')

if __name__=='__main__':
    main()

第 0013 题:

用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-)

使用的时候要在代码文件目录下创建一个img文件夹,不然会报错。

@requires_authorization
import requests
from bs4 import BeautifulSoup

def get_image(url):
    '''
        获得链接里的图片并且保存
    '''
    r = requests.get(url, timeout = 5)
    soup = BeautifulSoup(r.text, 'lxml')
    pic_link = soup.find_all('img',{'pic_type':'0'})

    for i,image in enumerate(pic_link):
        image_link = image['src']
        image = requests.get(image_link,timeout = 10)
        if image.status_code == 200:
            with open('img/'+str(i)+'.jpg','wb') as f:
                f.write(image.content)
        print(image_link)

def main():
    url = 'http://tieba.baidu.com/p/2166231880'
    get_image(url)


if __name__=='__main__':
    main()

第 0014 题:

纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示:

{
    "1":["张三",150,120,100],
    "2":["李四",90,99,95],
    "3":["王五",60,66,68]
}

请将上述内容写到 student.xls 文件中
因为是2017年了,我准备把它写到 014.xlsx 文件中,用的是openpyxl模块。

@requires_authorization
import openpyxl

def getdata():
    '''
        从文件中读取信息,这里我在程序目录下新建了一个‘014.txt’
        f.read()返回一个str类型,因为文件里有冒号,我把它转化为
        字典,便于写入。
    '''
    with open('014.txt','r') as f:
        r = f.read()
        d = eval(r)
        #print(type(r),r,type(d),d)
    return d

def sace_into_xlsx(d):
    '''
        将文件存到excle中
    '''
    #新建一个excle表
    wb = openpyxl.Workbook()
    #获得一个活动的sheet
    sheet = wb.active
    #行号
    row = 1
    for key, value in d.items():
        #写每行,第一列和第二列对应的单元格
        sheet.cell(row=row, column=1, value=row)
        sheet.cell(row=row, column=2, value=key)
        #写每行对应列的单元格
        for i in range(len(value)):
            sheet.cell(row=row, column=i+2, value=value[i])
        row += 1
    #保存excle文件
    wb.save('014.xlsx')

def main():
    info = getdata()
    sace_into_xlsx(info)

if __name__=='__main__':
    main()

第 0015 题:

纯文本文件 city.txt为城市信息, 里面的内容(包括花括号)如下所示:

{
    "1" : "上海",
    "2" : "北京",
    "3" : "成都"
}

请将上述内容写到 city.xls 文件中,这个题和14题差不多,就不写了。

第 0016 题:

纯文本文件 numbers.txt, 里面的内容(包括方括号)如下所示:

[
    [1, 82, 65535],
    [20, 90, 13],
    [26, 809, 1024]
]

请将上述内容写到 numbers.xls 文件中,这个题和14题差不多,也不写了。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值