学python学了一年,都做了啥东西

发布于:2023-01-03 ⋅ 阅读:(275) ⋅ 点赞:(0)

前言

在知乎上看到这么一句话,程序员其实就是吹牛,吹的是能够实现的牛,因为我们都能够实现。所以这篇博客对于会敲代码的人来说并没有什么,只是一个记录新手的历程,和提供一些可以实现的东西作为新手的阶段性小目标。在大一的时候参加了学校工作室的考核,选的是python方向,想来自己也是做了一些有点意思的东西,虽然现在依旧是API caller,但是相对于刚敲代码还是厉害了一些的,然后也借此机会把一些七零八碎的代码放上来,把那个放代码的文件夹删了(由于下了太多库,放代码的那个文件夹已经2.62G了)。python确实是一个相当有意思的语言,有一堆黑魔法库,还有很多神奇的魔术方法。。。但是毕竟不能只会写python,要大二了,还是得学习一些其他语言的(java,go啥的)。这个博客也算是记录了我的大一吧XD

做的东西

基础

1. 乘法表

这个就是数字规律了

for j in range(1, 10):
    for i in range(1, j+1):
        print(f"{i}x{j}={i*j}  ", end="")
    print()

在这里插入图片描述

2. 将列表中的数字加起来

给定一个列表:["dsf", "dfgg", 1515, "nb", "cf", 121, "sd", 15]将里面的数字加起来,字符串剔除掉
可以用以下两种方式来判断每一个元素的类型

  1. type(i) == int
  2. isinstance(i, int)

看了下原本写的代码,写了13行,确实离谱,是新建了一个列表,然后把数字放进去,再用循环将每个元素加起来,确实非常的不pythonic
改了下,这样还行

lst1 = ["dsf", "dfgg", 1515, "nb", "cf", 121, "sd", 15]
print(sum(i for i in lst1 if isinstance(i, int) is True))

3. 修改字符串

字符串中只出现一次"w2ol",将"w2ol"替换成"fzuw2ol"
原本傻傻的在字符串里面找"w",然后在"w"前面添加"fzu"

s = input()
print(s.replace('w2ol', 'fzuw2ol'))

4. 展示/修改货品的属性

使用类的相关知识完成,对一个货物的序号,名称,价格,总数量,剩余数量,售出收入进行封装

class Goods:
    def __init__(self, ordinal, name, price, total, remain):
        self.judge = None
        self.ordinal = ordinal
        self.name = name
        self.price = price
        self.total = total
        self.remain = remain
        self.income = price * (total - remain)

    def display(self):
        print("商品序号:", self.ordinal)
        print("商品名称:", self.name)
        print("单价:", self.price, "元/kg")
        print("总数量(kg):", self.total)
        print("剩余数量(kg):", self.remain)

    def setdata(self):
        self.judge = int(input("是否修改商品信息(输入1表示修改,输入0表示不修改):"))
        if self.judge == 1:
            print("-------------修改中------------")
            self.ordinal = input("修改商品序号为:")
            self.name = input("修改商品名称为:")
            self.price = float((input("修改单价为(元/kg):")))
            self.total = float(input("修改商品总数量(kg):"))
            self.remain = float(input("修改商品剩余量为(kg):"))
            self.income = self.price * (self.total - self.remain)
            print("------------修改后商品数据为:------------")
            self.display()
            print("已售出商品价值:", self.income, "元\n")


if __name__ == '__main__':
    g1 = Goods(1, "苹果", 20, 100, 15)
    g1.display()
    print("已售出商品价值:", g1.income, "元\n")
    g1.setdata()

在这里插入图片描述

5. 函数装饰器

实现两个装饰器

  1. 在函数开始时打印"hello",结束时打印"bye"
  2. 打印函数运行时间
import time


def dec01(func):
    def wrapper():
        print("hello")
        func()
        print('bye')
    return wrapper


def dec02(func):
    def wrapper():
        t1 = time.time()
        func()
        t2 = time.time()
        print("using time:", (t2 - t1) * 1000, "ms")

    return wrapper


@dec01
@dec02
def fun():
    print('sum:', sum(range(100000000)))


if __name__ == '__main__':
    fun()

6. 静态属性和静态方法

静态属性和静态方法根属于这个类

  1. 静态属性
    如下代码,在每一次都能够输出这个类有多少个实例,是因为这个cnt是属于这个类,而不是实例
    就算是改变了a.cnt,MyOperation.cnt也不会改变
  2. 静态方法
    静态方法本质上跟普通的函数是一样的,但是这个方法根属于这个类。这样写的话,算是提供了更好的封 装,让我们知道,这个函数是属于这个类的
class MyOperation:
    cnt = 0

    def __init__(self):
        MyOperation.cnt = MyOperation.cnt + 1
        print(MyOperation.cnt)

    @staticmethod
    def add(n1, n2):
        return n1 + n2


a = MyOperation()
b = MyOperation()
c = MyOperation()
d = MyOperation()
answer = MyOperation.add(1, 5)
print(answer)

在之后的项目中,也使用到了静态方法的封装,这些方法就都是记录日志的方法
使用:Log.error()Log.warning()Log.exception()
在这里插入图片描述

7. 一些魔术方法的使用

__eq__ : 设置相等的比较
__getattr____setattr____delattr__:这三个就是在对对象的属性进行操作的时候,会调用这些方法,例如print(a.hh)这样使用.来调用
__getitem__
__setitem
__delitem__:这三个就是在对对象使用获取字典属性的方式时调用,例如print(a[‘hh’])这样
__call__:让实例对象可以被调用
__enter____exit__:这两个是设置上下文管理的方法,相信大家一定用过 with open('hh.txt', 'r') as f:这样的操作,那了解一下这两个魔术方法,就能知道文件的with是怎么实现的啦

有意思的脚本

1. 消息轰炸

这个就算是纯纯抄代码了XD,大概就是调用了windows的接口,从os层面发送qq消息

import win32gui
import win32con
import win32clipboard as w


def qq(message):
    name = "2k"
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT, message)
    w.CloseClipboard()
    handle = win32gui.FindWindow(None, name)
    win32gui.SendMessage(handle, 770, 0, 0)
    win32gui.SendMessage(handle, win32con.WM_KEYDOWN, win32con.VK_RETURN, 0)


for i in range(100):
    qq('wyx 快来上号')

2. 爬取教务处通知

害怕教务处来敲我的宿舍门,我就不展示太多信息了,具体步骤差不多就是,通过requests来访问每一页通知目录,获取每一个通知的url。在逐个访问每一篇通知。
在这里插入图片描述

3. 爬b站评论

这个具体步骤还是挺多的,想看具体思路的话,可以点击这里,有评论说跑不出来,我也没再去试了,但是思路应该还是可以康康的

4. 打字吧刷成绩

原本的思路是通过requests获取文章,然后使用selenium进行输入,但是发现send_key是不行的,所以就通过os层面来解决,使用pyautogui来进行输入。
感觉有点不太。。。额,不太好吧,我也只刷了一两篇文章,这里也就不把代码发到这上面了,有兴趣的童鞋可以自己琢磨一下。
在这里插入图片描述
在这里插入图片描述

5. 爬正本小说

是通过requests发送请求获得html,然后使用正则解析html获取小说

import requests
import re

f = open(r'诛仙.txt', mode='a', encoding="utf-8")
for n in range(2, 256):
    print(n - 1)
    url = f'https://www.biquge7.com/book/4233/{n}.html'
    r = requests.get(url)
    r.encoding = 'utf-8'
    # print(r.text)
    obj = re.compile(
        r'<div id="chaptercontent" class="Readarea ReadAjax_content">(?P<content>.*?)<p class="readinline">', re.S)
    obj1 = re.compile(r'<h1 class="wap_none">(?P<title>.*?)</h1>')
    ret = obj.finditer(r.text)
    title = obj1.search(r.text)

    for i in ret:
        f.write(f'{n - 1}.')
        f.write('\n' + title.group('title') + '\n')
        f.write(i.group('content').replace('<br /><br />  ', '\n').strip())
        f.write('\n')
    r.close()
f.close()

在这里插入图片描述

6. 一些数据可视化

使用了matplotlib,让数据以图标的形式展现出来
原数据是各个高校每年的排名,希望以曲线图的方式展示出武汉大学的历年名次变化
在这里插入图片描述

import csv
import matplotlib.pyplot as plt
import matplotlib

font = {'family': 'SimHei', "size": 10}
matplotlib.rc('font', **font)


def get_info():
    u = []
    f = open('pySchoolRank.csv', 'r', encoding='utf8')
    reader = csv.DictReader(f)
    print(reader)
    for line in reader:
        ave = (int(line['2017']) + int(line['2018']) + int(line['2019']) + int(line['2020']) + int(line['2021'])) / 5
        print(line['\ufeff学校名称'], int(ave))
        u.append({'学校名称': line['\ufeff学校名称'], '2017': line['2017'], '2018': line['2018'],
                  '2019': line['2019'], '2020': line['2020'], '2021': line['2021']})
    return u


def draw(info):
    uname = info[0]['学校名称']
    y = [info[0]['2017'], info[0]['2018'], info[0]['2019'], info[0]['2020'], info[0]['2021']]
    y = list(map(int, y))
    x = range(2017, 2022)
    plt.plot(x, y, label=f'{uname}2017--2021排名走势图')
    plt.gca().invert_yaxis()
    plt.legend()
    plt.show()


draw(get_info())

在这里插入图片描述

一些项目

TODO LIST

这是一个相当相当简陋的todo清单了,丑陋的ui,杂乱的flask代码,现在看来确实不堪回首。在这里插入图片描述
完成这个项目
前端:需要看一点html,css(不必须),的知识
后端:服务方面需要会一点flask,存储方面如果不会使用数据库的话可以使用文件存储。我使用的是mysql数据库,当时也只学习了简单的一些sql语句。

这里就不放上代码了,也没有分文件,总共只有一个文件,两百多行

帅团外卖

代码在https://github.com/cgynb/a-flask-project
这是一个前后端不分离的项目
前端:jquery
后端:flask, mysql
需求:
用户可以进行登录、注册、修改用户信息。(通过这个,可以大概了解登录是个啥东西,怎么来保持登录状态【cookie-session】/ 【token】)
其余的点单,点赞,收藏店铺,这些操作其实都是通过数据库的crud来实现的,当然不会使用数据库的话,自己设计格式,用文件来储存也行。。。
聊天功能的话,需要看一看websocket的知识,然后在flask中直接使用websocket的话有flask-sock,封装的比较好用的是flask-socketio,我使用的是flask-socketio

请添加图片描述
请添加图片描述

匿名聊天室(小QQ)

关于这个匿名聊天室的桌面应用我也写了好几篇文章,其实还有一篇【客户端:四 通信功能】没有写,但是代码是在没法优化,太丑了,无奈,写了文章到一半,放弃了,现在还烂在那里。但是前几篇文章还是可以看看的。
基于python实现的聊天室(客户端:一)窗口设置
基于python实现的聊天室(客户端:二)tkinter的美化ttkbootstrap的滚动文本框ScrollText自动滚动到底部
基于python实现的聊天室(客户端:三)发送表情实现
基于python实现的聊天室(服务端)
在这里插入图片描述

毕业生转圈圈

这个也是我们工作室的最后一轮考核了,我负责的是后端部分。
项目地址:https://github.com/cgynb/jobs
在这个项目里面,有提高代码的可读性,项目文件结构较明确。然后实现的功能也更多了,更复杂了。比如说使用了refresh-token来保持登录态,私聊有显示在线状态、消息提醒、未读消息提醒等功能。也尝试使用了mongodb。
由于整个项目太大了,也不容易讲,所以如果感兴趣的话,可以阅读下源码,然后有什么技术问题可以私信我,我会看看并且尝试解决的。

给个账号,大家可以访问看看呀。地址:http://47.112.108.202/
账号:cgy
密码:123456

再上两张图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

结语

其实大一过得真的很快,对我的大一也能打个85分吧,参加了很多活动,认识了了形形色色的人。大一在工作室的考核下度过了,大二我也想加入实验室,或者做些什么来充实自己了。整个大一当然不止写了这点代码,但是这些也是我自己认为,自己在一年学习中学习到的相当重要的东西了。也是通过博客的形式,分享记录下自己的大一。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到