Python3学习进度

 

简介:Python3学习-由工作中遇到Android/iOS自动化测试调研使用(网易Airtest) 引入Python学习

学习路径

  • 2021年02月04日

    • web开发(了解)
      • HTTP协议简介
      • HTML简介
      • WSGI接口
      • 使用Web框架
      • 使用模板
    • 异步IO(暂未深入)
      • 协程
      • asyncio
      • async/wait
      • aiohttp
    • 使用MicroPython(了解)
      • 搭建开发环境
      • 控制小车
      • 遥控小车
      • 遥控转向
    • 实战-web实战-待实践。。。
  • 2021年02月03日

    • 正则表达式
    • 常用内建模块
      • datetime
      • collections
      • base64
      • struct
      • hashlib
      • hmac
      • itertools
      • contextlib
      • urllib
      • XML
      • HTMLParser
    • 常用第三方模块
      • Pillow
      • requests
      • chardet
      • psutil
    • virtualenv
    • 图形界面
      • 海龟绘图
    • 网络编程
      • TCP/IP简介
      • TCP编程
      • UDP编程
      • 小结:UDP的使用与TCP类似,但是不需要建立连接。此外,服务器绑定UDP端口和TCP端口互不冲突,也就是说,UDP的9999端口与TCP的9999端口可以各自绑定。
    • 电子邮件
      • SMTP发送邮件
      • POP3收取邮件
    • 访问数据库
      • 使用SQLite
      • 使用MySQL
        • pymysql连接docker里mysql
      • 使用SQLAlchemy
        • 用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:
        • 这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。是不是很简单?
        • 但是由谁来做这个转换呢?所以ORM框架应运而生。
        • 在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。
  • 2021年02月02日

    • 进程和线程
      • 多进程
      • 多线程
      • ThreadLocal
      • 进程 VS. 线程
      • 分布式进程
    • IO编程
      • 文件读写
      • StringIO 和 BytesIO
      • 操作文件和目录
      • 序列化
    • 错误、调试和测试
      • 错误处理
      • 调试
      • 单元测试
      • 文档测试
  • 2021年02月02日

    昨天看到W3CSchool的教程也还可以-这个可以复习使用

    • 面向对象高级编程
      • 使用__slots__
        • 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义class:
        • 尝试给实例绑定一个属性
        • 尝试给实例绑定一个方法
          • 注:给一个实例绑定的方法,对另外一个实例是不起作用的
        • 为了给所有实例都绑定方法,可以给class绑定方法:
        • 给class绑定方法后,所有实例均可调用:
        • 通常情况下,上面的set_score方法可以直接定义在class中,但动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现。
      • 使用@property
      • 多重继承
        • 由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。
        • 只允许单一继承的语言(如Java)不能使用MixIn的设计。
      • 定制类
      • 使用枚举
      • 使用元类
        • 类比Object-C动态方法交换
  • 2021年02月01日

    • 面向对象编程
      • (***)面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
      • 类和实例
      • 访问限制
      • 继承和多态
      • 获取对象信息
      • 实例属性和类属性
        • 小结:
          • 实例属性属于各个实例所有,互不干扰;
          • 类属性属于类所有,所有实例共享一个属性;
          • 不要对实例属性和类属性使用相同的名字,否则将产生难以发现的错误。
  • 2021年02月01日

    • 模块
      • 模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。
      • 创建自己的模块时,要注意:
        • 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
        • 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。
      • 使用模块
      • 使用第三方模块
        • 在Python中,安装第三方模块,是通过包管理工具pip完成的。
        •  
  • 2021年02月01日

  • 2021年01月29日

    • 函数式编程
      • 高阶函数
        • map/reduce
          • map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把这个list所有数字转为字符串:
          • 注:map转为tuple或list只能转一次如果转后再转其他类型会异常

          • map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator,Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
          • 再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
        • filter
          • filter()的作用是从一个序列中筛出符合条件的元素。由于filter()使用了惰性计算,所以只有在取filter()结果的时候,才会真正筛选并每次返回下一个筛出的元素。
        • sorted
          • sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。
      • 返回函数
        • 闭包
      • 匿名函数
        • 关键字lambda表示匿名函数,冒号前面的x表示函数参数(匿名函数lambda x: x * x)
        • 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
      • 装饰器
        • 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
      • 偏函数
        • Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。
        • 所以,简单总结functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
        • 小结:当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
# 测试filter
def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
# 测试map/reduce
def f(x):
    return x * x

L = [1, 2, 3, 4, 5, 6, 7, 8, 9]
r = map(Function.f, L)
print(f'map打印:{r}')

# 注:map转为tuple或list只能转一次如果转后再转其他类型会异常
L = tuple(r)
print(f'map转为元组{L}')
for i, item in enumerate(L):
    print(f'tuple - [i,item]=[{i},{item}]')

# L = list(r)
# print(f'map转为list{L}')
# for i, item in enumerate(L):
#     print(f'list - [i,item]=[{i},{item}]')
2021年01月29日
  • 针对昨天学习记录复习总结
  • Python教程
    • Python简介
  • 安装Python
    • Python解释器(VSCode/PyCharm-可以断点调试)
  • 第一个Python程序
    • 使用文本编辑器
    • Python代码运行助手
    • 输入和输出
  • Python基础
    • 数据类型和变量
    • 字符串和编码
    • 使用list和tuple
    • 条件和判断
    • 循环
    • 使用dic和set
  • 函数
    • 调用函数
    • 自/定义函数
    • 函数的参数
      • 参数组合:必选参数、默认参数、可变参数、命名关键字参数和关键字参数
    • 递归函数
  • 高级特性
    • 切片
      • 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice)操作符,能大大简化这种操作。注意:list和tuple均可以做切片操作!
    • 迭代
      • 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。

      • 在Python中,迭代是通过for ... in来完成的,而很多语言比如C语言,迭代list是通过下标完成的,比如Java代码:

      • 因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

      • 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。

      • 如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断

      • 如果要对list实现类似Java那样的下标循环怎么办?Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

    • 列表生成式
      • 如果要计算1-100的整数之和,从1写到100有点困难,幸好Python提供一个range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(5)生成的序列是从0开始小于5的整数:eg:L = list(range(0, 5))
      • 而列表生成式则可以用一行语句代替循环生成上面的list:
        • eg:L = [x * x for x in range(1, 11)]
        • eg:L = [x * x for x in range(1, 11) if x % 2 == 0]
        • eg:[m + n for m in 'ABC' for n in 'XYZ']
        • eg:d = {'x': 'A', 'y': 'B', 'z': 'C' },d = [k + '=' + v for k, v in d.items()]
        • eg:L = ['Hello', 'World', 'IBM', 'Apple'],L = [s.lower() for s in L]
      • if...else
        • eg:>>> [x for x in range(1, 11) if x % 2 == 0]
        • eg:>>> [x if x % 2 == 0 else -x for x in range(1, 11)]
        • eg:>>> # if条件表达式里内容不做处理 else里是另外一种情况要做处理事 LN = [x if isinstance(x, str) != True else x.lower() for x in L]
    • 生成器
      • 「如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。」***在Python中,这种一边循环一边计算的机制,称为生成器:generator。
      • 斐波拉契数列
      • 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
      • 同样的,把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代:eg:for n in fib(6):print(n)
    • 迭代器
      • 可迭代对象-可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:

      • 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

      • 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

      • 可以使用isinstance()判断一个对象是否是Iterator对象:

 

<think>好的,用户想开发一个基于Python学习进度跟踪系统。首先,我需要明确用户的需求。他们可能希望系统能够记录学习进度,生成报告,提醒任务,甚至可能有数据分析或可视化功能。根据用户提供的引用,特别是引用[2]和引用[5],他们可能对使用Django和Vue这样的框架感兴趣,或者需要进度条功能。 接下来,我应该考虑系统的架构。通常,Web系统会分为前端和后端,后端处理数据和逻辑,前端展示界面。用户提到的引用[2]中使用了Django和Vue,所以这可能是一个合适的组合。另外,引用[4]和[5]提到了UI界面和进度条,可能需要用到PyQt或者Tkinter,但如果是Web应用,前端可能用Vue更合适。 然后,数据库的选择。用户提到MySQL,这在引用[2]中也有使用,所以可能需要用MySQL来存储用户数据、学习记录等。需要设计数据库表结构,比如用户表、课程表、学习记录表等。 功能模块方面,用户可能需要用户认证、进度跟踪、数据可视化、提醒通知等功能。例如,用户登录后可以添加学习任务,系统记录学习时间,生成进度条,提醒未完成的任务。引用[5]中的tqdm库可以用来在命令行显示进度,但如果是Web界面,可能需要用前端库如ECharts来展示进度图表。 技术实现上,后端用Django处理HTTP请求,提供REST API,前端用Vue.js进行数据交互和展示。数据库用MySQL,通过Django的ORM进行管理。数据分析部分可能需要用到Pandas或Scikit-learn,如引用[3]提到的scikit-learn,但用户的需求主要是跟踪,可能暂时不需要复杂的机器学习,除非他们想加入推荐功能,如引用[2]中的协同过滤算法。 另外,用户可能需要任务提醒功能,这可以用Celery进行异步任务调度,定时发送邮件或消息提醒。引用[4]中的OpenCV和实时检测可能不相关,但进度跟踪需要的时间管理可以参考。 测试和部署也是重要部分,需要单元测试和系统测试,如引用[2]提到的。部署可能用Docker或云服务。 可能遇到的问题包括数据库设计是否合理,前后端数据交互的API设计,以及进度计算的逻辑。例如,如何根据学习时间和计划时间计算进度百分比,并实时更新。 最后,根据引用[1],用户可能希望系统有实践练习和代码案例,所以在开发过程中,可以提供详细的文档和示例代码,帮助用户理解。同时,引用[5]中的tqdm可以集成到后台处理中,比如处理大量数据时的进度显示。 总结步骤:需求分析、技术选型、数据库设计、功能模块开发、前后端实现、测试和部署。可能需要参考现有的项目结构,如引用[2]和[3],确保代码的可维护性和扩展性。</think>### 基于Python学习进度跟踪系统开发指南 #### 一、系统架构设计 1. **技术栈选择** - 后端框架:推荐使用$Django$或$Flask$,支持快速搭建RESTful API[^2] - 前端框架:$Vue.js$或$React$实现动态交互界面[^2] - 数据库:$MySQL$或$SQLite$存储用户数据与学习记录[^3] - 数据分析:$Pandas$处理学习数据,$Matplotlib/Plotly$实现可视化[^4] 2. **核心模块划分** ```mermaid graph TD A[用户管理] --> B[课程管理] B --> C[学习记录跟踪] C --> D[数据可视化] D --> E[智能提醒] ``` #### 二、数据库设计 ```sql -- 用户表 CREATE TABLE Users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE, password_hash CHAR(60) ); -- 课程表 CREATE TABLE Courses ( course_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, course_name VARCHAR(100), total_hours INT, FOREIGN KEY (user_id) REFERENCES Users(id) ); -- 学习记录表 CREATE TABLE Study_Records ( record_id INT AUTO_INCREMENT PRIMARY KEY, course_id INT, study_date DATE, duration DECIMAL(4,1), FOREIGN KEY (course_id) REFERENCES Courses(course_id) ); ``` #### 三、核心功能实现 1. **进度跟踪算法** $$ \text{完成进度} = \frac{\sum \text{已学习时长}}{\text{课程总时长}} \times 100\% $$ 2. **使用tqdm实现命令行进度条[^5]** ```python from tqdm import tqdm import time total_hours = 40 # 总学习时长 progress = 0 with tqdm(total=total_hours, desc=&#39;学习进度&#39;) as pbar: while progress < total_hours: study_time = random.uniform(0.5, 2.0) time.sleep(study_time) progress += study_time pbar.update(study_time) ``` 3. **可视化仪表盘(Matplotlib示例)** ```python import matplotlib.pyplot as plt def plot_progress(progress_data): plt.figure(figsize=(10,6)) plt.plot(progress_data[&#39;date&#39;], progress_data[&#39;cumulative_hours&#39;], &#39;g-o&#39;) plt.xlabel(&#39;日期&#39;) plt.ylabel(&#39;累计学习时长(小时)&#39;) plt.title(&#39;学习进度趋势图&#39;) plt.grid(True) plt.show() ``` #### 四、系统集成与优化 1. **使用Django框架搭建后端API** ```python # views.py from rest_framework import generics from .models import StudyRecord from .serializers import RecordSerializer class RecordListCreate(generics.ListCreateAPIView): queryset = StudyRecord.objects.all() serializer_class = RecordSerializer ``` 2. **前端Vue组件示例** ```vue <template> <div class="progress-circle"> <div class="progress" :style="circleStyle"></div> <span class="percentage">{{ percentage }}%</span> </div> </template> <script> export default { props: [&#39;percentage&#39;], computed: { circleStyle() { return { &#39;background&#39;: `conic-gradient(#4CAF50 ${this.percentage}%, #ddd ${this.percentage}% 100%)` } } } } </script> ``` #### 五、部署与测试 1. **使用Docker容器化部署** ```dockerfile FROM python:3.8 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["gunicorn", "study_tracker.wsgi:application", "--bind", "0.0.0.0:8000"] ``` 2. **自动化测试(pytest示例)** ```python def test_progress_calculation(): total = 40 studied = 10 assert calculate_progress(total, studied) == 25.0 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值