文章目录
前言
在知乎上看到这么一句话,程序员其实就是吹牛,吹的是能够实现的牛,因为我们都能够实现。所以这篇博客对于会敲代码的人来说并没有什么,只是一个记录新手的历程,和提供一些可以实现的东西作为新手的阶段性小目标。在大一的时候参加了学校工作室的考核,选的是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]
将里面的数字加起来,字符串剔除掉
可以用以下两种方式来判断每一个元素的类型
- type(i) == int
- 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. 函数装饰器
实现两个装饰器
- 在函数开始时打印"hello",结束时打印"bye"
- 打印函数运行时间
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. 静态属性和静态方法
静态属性和静态方法根属于这个类
- 静态属性
如下代码,在每一次都能够输出这个类有多少个实例,是因为这个cnt是属于这个类,而不是实例
就算是改变了a.cnt,MyOperation.cnt也不会改变 - 静态方法
静态方法本质上跟普通的函数是一样的,但是这个方法根属于这个类。这样写的话,算是提供了更好的封 装,让我们知道,这个函数是属于这个类的
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分吧,参加了很多活动,认识了了形形色色的人。大一在工作室的考核下度过了,大二我也想加入实验室,或者做些什么来充实自己了。整个大一当然不止写了这点代码,但是这些也是我自己认为,自己在一年学习中学习到的相当重要的东西了。也是通过博客的形式,分享记录下自己的大一。