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題差不多,也不寫了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章