├── .github ├── ISSUE_TEMPLATE │ └── course-bugs.md └── workflows │ ├── auto-pr.yml │ ├── prettier-lab-docs.yml │ └── sync-lab-docs.yml ├── .gitignore ├── 1-Linux-基础入门-free ├── 01-1-Linux 系统简介.sy.md ├── 02-2-基本概念及操作.sy.md ├── 03-3-用户及文件权限管理.sy.md ├── 04-59-Linux 目录结构及文件基本操作.sy.md ├── 05-60-环境变量与文件查找.sy.md ├── 06-2687-寻找文件.tz.md ├── 07-61-文件打包与解压缩.sy.md ├── 08-62-文件系统操作与磁盘管理.sy.md ├── 09-1917-Linux 下的帮助命令.sy.md ├── 10-1918-Linux 任务计划 crontab.sy.md ├── 11-2697-备份日志.tz.md ├── 12-63-命令执行顺序控制与管道.sy.md ├── 13-337-简单的文本处理.sy.md ├── 14-346-数据流重定向.sy.md ├── 15-2698-历史命令.tz.md ├── 16-354-正则表达式基础.sy.md ├── 17-2699-数据提取.tz.md ├── 18-356-Linux 下软件安装.sy.md ├── 19-1943-Linux 进程概念.sy.md ├── 20-1944-Linux 进程管理.sy.md ├── 21-1945-Linux 日志系统.sy.md └── README.md ├── 1035-Git-与-GitHub-入门实践-free ├── 01-7166-Git 与 GitHub 简介.sy.md ├── 02-9805-Git 基础操作.sy.md ├── 03-9816-Git 分支操作.sy.md ├── 04-9817-多人协作 GitHub 部分.sy.md ├── 05-9824-多人协作 Git 部分.sy.md ├── 06-10369-Git tag 和 GitHub releases.sy.md └── README.md ├── 106-Redis-简明教程-free ├── 01-891-Redis 安装介绍.sy.md ├── 02-911-Redis 数据类型.sy.md ├── 03-913-Redis 系统管理.sy.md ├── 04-915-Redis 高级应用.sy.md └── README.md ├── 11-Go-语言简明教程-free ├── 01-49-Go 语言介绍.sy.md ├── 02-54-Go 语言基础.sy.md ├── 03-58-Go 语言顺序编程.sy.md ├── 04-127-面向对象编程.sy.md ├── 05-128-并发编程.sy.md ├── 06-129-词频统计综合案例.sy.md ├── 07-142-IDE 及环境配置.sy.md └── README.md ├── 115-操作系统原理与实践-free ├── 00-2704815-使用本课程上课说明.wd.md ├── 10-374-熟悉实验环境 .sy.md ├── 20-568-操作系统的引导.sy.md ├── 30-569-系统调用.sy.md ├── 40-570-进程运行轨迹的跟踪与统计.sy.md ├── 50-571-基于内核栈切换的进程切换.sy.md ├── 60-572-信号量的实现和应用.sy.md ├── 70-573-地址映射与共享.sy.md ├── 80-574-终端设备的控制.sy.md └── 90-575-proc文件系统的实现.sy.md ├── 12-MongoDB-基础教程-free ├── 01-50-数据库和集合基本操作.sy.md ├── 02-53-数据查询.sy.md ├── 03-57-文档基本操作.sy.md ├── 04-77-查询、索引与聚合.sy.md ├── 05-78-高级查询与索引.sy.md ├── 06-2789-挑战:管理员工的基本信息.tz.md └── README.md ├── 1230-Java-简明教程-free ├── 01-9465-基础语法(上).sy.md ├── 02-9466-基础语法(下).sy.md ├── 03-9467-面向对象.sy.md ├── 04-9468-常用类.sy.md ├── 05-9469-泛型和集合.sy.md ├── 06-9470-异常.sy.md ├── 07-9471-Lambda.sy.md ├── 08-9472-IO.sy.md ├── 09-9473-网络编程.sy.md ├── 10-9474-多线程.sy.md ├── 11-11047-JDBC.sy.md ├── 12-11048-反射.sy.md ├── 13-11049-正则表达式.sy.md ├── 14-11050-设计模式.sy.md └── README.md ├── 1238-JavaScript-基础入门-free ├── 01-9786-JavaScript 基础.sy.md ├── 02-9787-JavaScript 关键特性.sy.md ├── 03-9788-JSON.sy.md ├── 04-9789-Web API.sy.md ├── 05-9802-值类型和引用类型以及异常.sy.md ├── 06-9803-面向对象编程.sy.md ├── 07-9804-函数进阶.sy.md └── README.md ├── 1262-Vue.js-基础入门-free ├── 01-10292-Vue 简介与安装使用.sy.md ├── 02-10336-模版语法.sy.md ├── 03-10337-计算属性和侦听属性与过滤器.sy.md ├── 04-10338-class 与 style 绑定.sy.md ├── 05-10339-条件与循环渲染.sy.md ├── 06-10340-事件处理.sy.md ├── 07-10341-表单处理.sy.md ├── 08-10342-组件.sy.md ├── 09-10343-过渡与动画.sy.md ├── 10-10344-Vue 进阶引导.sy.md └── README.md ├── 1265-Python-实现常见数据结构-free ├── 01-10282-数据结构(上).sy.md ├── 02-10284-数据结构(下).sy.md ├── 03-10285-哈希.sy.md ├── 04-10286-数学算法.sy.md ├── 05-10345-线性代数.sy.md ├── 06-10346-搜索算法.sy.md ├── 07-10347-排序算法.sy.md ├── 08-10364-字符串.sy.md └── README.md ├── 1330-Python-新手入门课-free ├── 01-11060-进入编程大门.sy.md ├── 02-11061-认识 Linux.sy.md ├── 03-11071-创建代码文件.tz.md ├── 04-11072-认识 Python.sy.md ├── 05-11073-Python 的流程控制.sy.md ├── 06-11076-逢 7 就跳过.tz.md ├── 07-11077-Git 和 Github.sy.md ├── 08-11102-最终挑战:提交代码.tz.md ├── 09-11923-不是结束,而是开始.sy.md └── README.md ├── 1403-Linux-运维新手入门课-free ├── 01-12915-认识 Linux.sy.md ├── 02-12916-挑战:创建代码文件.tz.md ├── 03-12917-部署 Nginx Web 服务器.sy.md ├── 04-12918-挑战:让实验楼网站恢复访问.tz.md ├── 05-12919-Zabbix 监控平台搭建.sy.md ├── 06-12920-Zabbix 监控 Nginx Web 服务.sy.md └── README.md ├── 144-HTML-实现扫雷游戏-free ├── 01-435-HTML 实现扫雷游戏.sy.md └── README.md ├── 1485-Julia-简明教程-free ├── 01-16789-Julia 简介和安装.sy.md ├── 02-16790-变量和数据类型.sy.md ├── 03-16791-元组、字典和集合.sy.md ├── 04-16792-函数.sy.md ├── 05-16793-流程控制和异常处理.sy.md ├── 06-16794-变量作用域和类型.sy.md ├── 07-16802-按照要求打印学生信息.tz.md └── README.md ├── 1499-通过例子学-Rust-free ├── 01-16545-Hello World.sy.md ├── 02-16546-原生类型.sy.md ├── 03-16547-自定义类型.sy.md ├── 04-16548-变量绑定.sy.md ├── 05-16549-类型系统.sy.md ├── 06-16550-类型转换.sy.md ├── 07-16551-表达式.sy.md ├── 08-16552-流程控制.sy.md ├── 09-16553-函数.sy.md ├── 10-16554-模块.sy.md ├── 11-16555-crate.sy.md ├── 12-16556-cargo.sy.md ├── 13-16557-属性.sy.md ├── 14-16558-泛型.sy.md ├── 15-16559-作用域规则.sy.md ├── 16-16560-特性 trait.sy.md ├── 17-16561-使用 macro_rules! 来创建宏.sy.md ├── 18-16562-错误处理.sy.md ├── 19-16563-标准库类型.sy.md ├── 20-16564-标准库更多介绍.sy.md ├── 21-16565-测试.sy.md ├── 22-16566-不安全操作,兼容性与补充.sy.md └── README.md ├── 2-Vim-基础入门-free ├── 01-16-Vim 快速入门.sy.md ├── 02-17-Vim 文档编辑.sy.md ├── 03-18-Vim 查找替换.sy.md ├── 04-19-Vim 高级功能.sy.md └── README.md ├── 2023-TypeScript-基础入门-free ├── 01-29200-初见 TypeScript.sy.md ├── 02-29201-基本数据类型.sy.md ├── 03-29202-接口.sy.md ├── 04-29203-类(Class).sy.md ├── 05-29204-函数.sy.md ├── 06-29205-模块.sy.md ├── 07-29206-命名空间.sy.md └── README.md ├── 22-jQuery-基础入门-free ├── 01-122-Jquery 介绍.sy.md ├── 02-130-jQuery 选择器.sy.md ├── 03-131-Query 中的 DOM 操作.sy.md ├── 04-132-jQuery 中的事件和动画.sy.md ├── 05-133-Query 对表单、表格的操作.sy.md ├── 06-11140-jQuery AJAX.sy.md ├── 07-11141-jQuery 插件的使用和写法.sy.md └── README.md ├── 23-PHP-编程入门-free ├── 01-189-PHP简介.sy.md ├── 02-190-基本语法.sy.md ├── 03-191-数据类型(一).sy.md ├── 04-192-数据类型(二).sy.md ├── 05-193-变量.sy.md ├── 06-194-常量.sy.md ├── 07-195-运算符.sy.md ├── 08-196-控制结构(一).sy.md ├── 09-197-控制结构(二).sy.md ├── 10-198-函数.sy.md ├── 11-199-类与对象(一).sy.md ├── 12-200-类与对象(二).sy.md └── README.md ├── 237-Hadoop-基础入门-free ├── 00-2437210-版本更新说明.sy.md ├── 01-764-Hadoop 介绍与安装.sy.md ├── 02-1032-HDFS 原理及操作.sy.md ├── 03-1033-MapReduce 原理及操作.sy.md ├── 04-1034-MapReduce 应用案例.sy.md ├── 05-2414413-Spark介绍和安装部署.sy.md ├── 06-1042-Hive 介绍和安装部署.sy.md ├── 07-1044-HBase安装与应用案例.sy.md ├── 08-1045-Sqoop 安装与操作.sy.md ├── 09-1046-Flume 介绍与安装.sy.md ├── 10-776-Hadoop2.X 64 位编译(选学).sy.md ├── 11-1029-Hadoop2.X 64 位环境搭建(选学).sy.md ├── 12-1035-Pig 安装与应用案例.sy.md ├── 13-1043-Mahout 安装与应用案例.sy.md ├── 14-1047-Chukwa 介绍与安装部署.sy.md └── README.md ├── 35-Hadoop-部署及管理-free ├── 01-134-Hadoop课程介绍.sy.md ├── 02-135-Hadoop单机模式安装.sy.md ├── 03-162-Hadoop伪分布模式配置部署.sy.md └── README.md ├── 3584-Oeasy-教您玩转-Python-free ├── 001-87321-先跑起来.sy.md ├── 002-87323-你好世界.sy.md ├── 003-87333-继续运行.sy.md ├── 004-87374-调试程序.sy.md ├── 005-87382-程序本质.sy.md ├── 006-87385-hello-world.sy.md ├── 007-87487-字符本质.sy.md ├── 008-87675-ASCII 码表.sy.md ├── 009-87338-换行字符.sy.md ├── 010-87991-不换行输出.sy.md ├── 011-87992-输出时间.sy.md ├── 012-87993-刷新时间.sy.md ├── 013-87995-整合程序.sy.md ├── 014-87996-直接运行.sy.md ├── 015-88007-设置路径.sy.md ├── 016-88008-查看进程.sy.md ├── 017-88353-回到开头.sy.md ├── 018-95601-深度整合.sy.md ├── 019-88354-换行回车.sy.md ├── 020-88730-电传打字机.sp.md ├── 021-88731-teletype 历史.sy.md ├── 022-87343-转义序列.sy.md ├── 023-89703-转义字符.sy.md ├── 024-87341-光标位置.sy.md ├── 025-104140-字体样式.sy.md ├── 026-87346-修改颜色.sy.md ├── 027-95632-背景颜色.sy.md ├── 028-89900-更多颜色.sy.md ├── 029-89935-各种符号.sy.md ├── 030-92241-编码进化.sy.md ├── 031-92402-各语言字符编码.sy.md ├── 032-92414-unicode.sy.md ├── 033-92423-utf-8.sy.md ├── 034-92554-另类字符.sy.md ├── 035-92555-Python 历史.sy.md ├── 036-188456-啥是变量.sy.md ├── 037-188458-定义变量.sy.md ├── 038-188464-接收输入.sy.md ├── 039-188465-相加运算.sy.md ├── 040-188729-尝试捕获异常.sy.md ├── 041-188728-自制模块.sy.md ├── 042-188730-主控程序.sy.md ├── 043-188731-版本控制 git.sy.md ├── 044-188727-注释说明.sy.md ├── 045-188787-帮助手册.sy.md ├── 046-188798-动态类型.sy.md ├── 047-188803-字符串类型.sy.md ├── 048-188814-整型数字变量.sy.md ├── 049-188908-进制转化.sy.md ├── 050-188921-加法运算.sy.md ├── 051-188926-键盘输入.sy.md ├── 052-188927-随机数字.sy.md ├── 053-189035-随机字符.sy.md ├── 054-189036-颜色常量.sy.md ├── 055-188928-减法运算.sy.md ├── 056-188929-负数表示.sy.md ├── 057-189359-补码系统.sy.md ├── 058-188930-乘法运算.sy.md ├── 059-189507-除法运算.sy.md ├── 060-189509-取整操作.sy.md ├── 061-189513-浮点类型.sy.md ├── 062-189617-分数类型.sy.md ├── 063-189618-深入浮点型数字.sy.md ├── 064-189619-深入整型数字.sy.md ├── 065-189506-乘方运算.sy.md ├── 066-189668-开方和对数运算.sy.md ├── 067-189669-虚数类型.sy.md ├── 068-189673-表达式 expression.sy.md ├── 069-189722-打开文件.sy.md ├── 070-189725-读取细节.sy.md ├── 071-189732-命令行参数.sy.md ├── 072-190174-写入文件.sy.md ├── 073-190199-二进制模式.sy.md ├── 074-190203-二进制文件流存取整数.sy.md ├── 075-190458-二进制文件流存取浮点数.sy.md ├── 076-190459-Python 的进化.sy.md ├── 077-190650-拷贝程序.sy.md ├── 078-191368-文件锁.sy.md ├── 079-190654-追加写入.sy.md ├── 080-190651-序列化-serialize.sy.md ├── 081-190652-多文件读写.sy.md ├── 082-192165-执行外部命令.sy.md ├── 083-190653-编码 encoding.sy.md ├── 084-233669-系统命令.sy.md ├── 085-192174-with 关键字.sy.md ├── 086-192219-列表-类型.sy.md ├── 087-192220-列表-增减.sy.md ├── 088-192221-列表-构造-范围-range.sy.md ├── 089-192241-列表-索引 index.sy.md ├── 090-192242-列表-运算.sy.md ├── 091-192294-列表-切片 slice.sy.md ├── 092-192295-列表-排序 order.sy.md ├── 093-192296-列表-嵌套 embeded.sy.md ├── 094-192304-元组-tuple.sy.md ├── 095-192403-字符串序列-string.sy.md ├── 096-192405-字节流序列-bytes.sy.md ├── 097-192411-集合-set-元素操作.sy.md ├── 098-192413-集合运算.sy.md ├── 099-192414-字典-dictionary.sy.md ├── 100-192423-字典操作.sy.md ├── 101-201638-容器总结.sy.md ├── 102-203868-容器对象的腌制和存储.sy.md ├── 103-197319-分支开始.sy.md ├── 104-198696-缩进细节.sy.md ├── 105-199151-调试程序.sy.md ├── 106-199155-比较运算符.sy.md ├── 107-203062-序列类容器的比较运算.sy.md ├── 108-203075-映射类和集合类容器比较运算.sy.md ├── 109-203108-是否等于-is.sy.md ├── 110-203370-是否是某类型实例-isinstance.sy.md ├── 111-203367-是否属于-in.sy.md ├── 112-203369-取反运算-not.sy.md ├── 113-203372-双分支结构-else.sy.md ├── 114-203373-三目运算符.sy.md ├── 115-203374-嵌套条件语句.sy.md ├── 116-203376-多分支条件语句-elif.sy.md ├── 117-203377-跳过-pass-猜丁壳.sy.md ├── 118-203381-逻辑与-and.sy.md ├── 119-203409-数字区间.sy.md ├── 120-203387-逻辑或-or.sy.md ├── 121-203872-优先级-precedence.sy.md ├── 122-203873-综合练习-玩骰子-dices.sy.md ├── 123-203874-位运算符-按位与或非.sy.md ├── 124-205644-移位运算符.sy.md ├── 125-206033-条件分支流程总结.sy.md ├── 126-233735-循环起来.sy.md ├── 127-233736-循环条件.sy.md ├── 128-233769-break-中断条件.sy.md ├── 129-233772-循环细节.sy.md ├── 130-233773-else-不满足循环条件时.sy.md ├── 131-233775-continue-继续.sy.md ├── 132-233791-for-循环-玲珑塔.sy.md ├── 133-233802-iterable-可迭代对象-元组-列表.sy.md ├── 134-233828-可迭代对象-集合-sorted.sy.md ├── 135-233829-for-遍历字符串和字节序列.sy.md ├── 136-233927-for-遍历字典 dict.sy.md ├── 137-234325-zip-缝合.sy.md ├── 138-234326-enumerate-编号.sy.md ├── 139-234327-二重循环.sy.md ├── 140-234372-遍历文件流.sy.md ├── 141-253312-for 的总结.sy.md ├── 142-253313-列表推导式.sy.md ├── 143-255133-集合推导式.sy.md ├── 144-255813-字典推导式.sy.md ├── 145-259389-循环总结.sy.md ├── 146-259358-字符串 raw.sy.md ├── 147-192569-浏览过程 请求 响应 状态码.sy.md ├── 148-192576-requests-模块.sy.md ├── 149-192577-lxml 元素-树形结构.sy.md ├── 150-192598-lxml-属性-attrib.sy.md ├── 151-192644-lxml-文本-text.sy.md ├── 152-192645-lxml-遍历-iteration.sy.md ├── 153-192646-lxml-从 str 生成 etree.sy.md ├── 154-193105-lxml-结合-requests.sy.md ├── 155-193139-xpath-筛选.sy.md ├── 156-194109-xpath-属性筛选.sy.md ├── 157-194111-xpath-路径表达式.sy.md ├── 158-263198-xpath-选择器练习.sy.md ├── 159-263197-xpath-提取文本方法text()_string().sy.md ├── 160-194366-综合练习-爬取网站.sy.md ├── 161-194455-综合练习-遍历链接.sy.md ├── 162-250373-爬取百度.sy.md ├── 163-250390-百度指数.sy.md ├── 164-250391-爬取图片.sy.md ├── 165-252877-爬取图片进阶.sy.md ├── 166-253240-爬取图像数据.sy.md └── README.md ├── 37-HBASE-基础入门-free ├── 01-364-HBase 简介.sy.md ├── 02-365-HBase 安装配置.sy.md ├── 03-756-HBase 基本操作.sy.md ├── 04-1973-Hbase rowkey 设计.sy.md ├── 05-7098-HBase 布隆过滤器.sy.md └── README.md ├── 3821-Java-新手入门课-free ├── 01-114201-进入编程大门.sy.md ├── 02-116488-认识 Linux.sy.md ├── 03-121602-第一个 Java 程序.sy.md ├── 04-121603-Java 基础语法.sy.md ├── 05-121604-Java 流程控制.sy.md ├── 06-121605-逢 7 就跳过.tz.md ├── 07-121606-Git 和 GitHub.sy.md ├── 08-121607-最终挑战:提交代码.tz.md ├── 09-121608-不是结束,而是开始.sy.md └── README.md ├── 39-Apache-Mahout-基础入门-free ├── 01-785-Mahout 简介.sy.md ├── 02-786-Mahout 安装配置.sy.md ├── 03-805-Mahout 聚类算法.sy.md ├── 04-806-Mahout 分类算法.sy.md └── README.md ├── 3946-Python 3 新特性快速上手-free ├── 01-529698-Python 3.11 新特性.sy.md ├── 02-137602-结构模式匹配.sy.md ├── 03-137599-更好的错误信息.sy.md ├── 04-137603-与类型提示相关的新功能.sy.md ├── 05-137604-其他新功能.sy.md ├── 06-138776-Python 3.9 新特性.sy.md ├── 07-139538-Python 3.8 新特性.sy.md ├── 08-139541-Python 3.7 新特性.sy.md ├── 09-139543-Python 3.6 新特性.sy.md └── README.md ├── 43-HTML5-简明教程-free ├── 01-151-HTML 概述.sy.md ├── 02-152-HTML 常用标签.sy.md ├── 03-175-HTML 表格与 DIV 应用.sy.md ├── 04-176-HTML 表单.sy.md ├── 05-177-HTML 图像与框架.sy.md ├── 06-178-HTML5 简介.sy.md ├── 07-10032-HTML5 表单.sy.md ├── 08-19130-HTML5 Canvas API.sy.md ├── 09-19131-HTML5 视频音频与拖放.sy.md ├── 10-19132-HTML5 Web Storage 和文件上传.sy.md └── README.md ├── 44-Node.js-基础入门-free ├── 01-158-Node.js 简介及简单使用.sy.md ├── 02-246-Node.js 模块.sy.md ├── 03-247-Node.js 函数.sy.md ├── 04-304-Node.js 事件.sy.md ├── 05-336-Node.js http 模块 和 fs 模块.sy.md ├── 06-1153-Node.js Express 框架.sy.md └── README.md ├── 539-Java-函数式编程-free ├── 01-1829-Lambda 表达式.sy.md ├── 02-1831-函数式接口.sy.md ├── 03-1832-Streams 流.sy.md └── README.md ├── 57-C-语言简明教程-free ├── 01-280-C 语言简单剖析.sy.md ├── 02-2781-输出 I love shiyanlou.tz.md ├── 03-285-数据类型.sy.md ├── 04-297-运算符和数据转换.sy.md ├── 05-2782-摄氏转华氏温度.tz.md ├── 06-315-选择程序设计.sy.md ├── 07-335-循环程序设计.sy.md ├── 08-2783-序列求和.tz.md ├── 09-357-C 语言数组.sy.md ├── 10-367-模块化程序设计.sy.md ├── 11-368-指针(一).sy.md ├── 12-378-指针(二).sy.md ├── 13-2784-修复指针使用错误.tz.md ├── 14-409-文件和文件的输入与输出.sy.md ├── 15-2785-复制文件内容.tz.md └── README.md ├── 596-Python3-简明教程-free ├── 01-2036-开始 Python 之旅.sy.md ├── 02-2037-变量和数据类型.sy.md ├── 03-2038-运算符和表达式.sy.md ├── 04-2772-挑战:圆的面积.tz.md ├── 05-2039-控制流 If-else.sy.md ├── 06-2040-循环.sy.md ├── 07-2041-数据结构.sy.md ├── 08-2042-字符串.sy.md ├── 09-2043-函数.sy.md ├── 10-2044-文件处理.sy.md ├── 11-2773-挑战:字符串操作.tz.md ├── 12-2045-异常.sy.md ├── 13-2774-挑战:玩转函数.tz.md ├── 14-2046-类 .sy.md ├── 15-2047-模块.sy.md ├── 16-2048-Collections 模块.sy.md ├── 17-2775-挑战:类和Collection模块.tz.md ├── 18-2049-PEP8 代码风格指南.sy.md ├── 19-2050-迭代器、生成器、装饰器.sy.md ├── 20-2051-Virtualenv.sy.md ├── 21-2052-测试.sy.md ├── 22-2053-项目结构.sy.md ├── 23-2054-Flask 介绍.sy.md └── README.md ├── 63-新手入门指南之玩转蓝桥云课-free ├── 10-53598-你好,蓝桥云课 👋.wd.md ├── 20-292-Linux 桌面环境使用指南.sy.md └── 30-53599-WebIDE 环境使用指南.sy.md ├── 68-Linux-命令基础入门-free ├── 01-301-Linux操作命令(一).sy.md ├── 02-302-Linux操作命令(二).sy.md ├── 03-303-Linux操作命令(三).sy.md ├── 04-341-Linux操作命令(四).sy.md ├── 05-348-Linux操作命令(五).sy.md ├── 06-353-Linux操作命令(六).sy.md ├── 07-369-Linux操作命令(七).sy.md ├── 08-370-Linux操作命令(八).sy.md ├── 09-371-Linux操作命令(九).sy.md ├── 10-393-Linux操作命令(十).sy.md └── README.md ├── 70-Python-实现文本解析器-free ├── 01-307-Python 实现文本解释器.sy.md └── README.md ├── 75-C-语言实现简单计算器-free ├── 01-314-C 语言制作简单计算器.sy.md └── README.md ├── 7635-Apache-Log4j-2-远程代码执行漏洞详解-free ├── 01-282645-Apache Log4j2 远程代码执行漏洞详解.sy.md └── README.md ├── 855-R-语言基础入门-free ├── 01-3105-R 语言入门:基础数据结构.sy.md ├── 02-3136-R 语言入门:tidyverse 生态链.sy.md └── README.md ├── 9-MySQL-基础课程-free ├── 01-48-SQL 介绍及 MySQL 安装.sy.md ├── 02-56-创建数据库并插入数据.sy.md ├── 03-73-SQL 的约束.sy.md ├── 04-2769-搭建简易成绩管理系统数据库.tz.md ├── 05-74-SELECT 语句详解.sy.md ├── 06-75-数据库及表的修改和删除.sy.md ├── 07-76-其它基本操作.sy.md └── README.md ├── 90-正则表达式基础入门-free ├── 01-779-正则表达式介绍与基础.sy.md ├── 02-780-grep 命令与正则表达式.sy.md ├── 03-781-sed 命令与正则表达式.sy.md ├── 04-782-正则表达式扩展应用.sy.md ├── 05-2788-Linux 用户信息编辑.tz.md └── README.md ├── 944-高级-Bash-脚本编程指南-free ├── 01-3556-bash介绍与入门.sy.md ├── 02-3557-挑战:简单的热身.tz.md ├── 03-3558-bash特殊字符(上).sy.md ├── 04-3559-bash特殊字符(下).sy.md ├── 05-3560-变量和参数.sy.md ├── 06-3561-基本运算符.sy.md ├── 07-3562-挑战:矩形的面积和周长.tz.md ├── 08-3563-流程控制.sy.md ├── 09-3564-挑战:最大值.tz.md ├── 10-3565-挑战:偶数之和.tz.md ├── 11-3570-函数.sy.md └── README.md ├── 98-TCP-IP-网络协议基础入门-free ├── 01-448-TCP IP简介.sy.md ├── 02-458-链路层介绍.sy.md ├── 03-474-IP网际协议.sy.md ├── 04-496-网络层其它协议.sy.md ├── 05-541-传输层:UDP协议.sy.md ├── 06-556-传输层:TCP协议.sy.md ├── 07-565-应用层协议.sy.md └── README.md ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md └── README.md /.github/ISSUE_TEMPLATE/course-bugs.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 报告课程问题 3 | about: Course Bugs 4 | title: "请简要描述问题" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | ## 内容路径 10 | 11 | - [请复制粘贴仓库文件夹名称](请复制粘贴仓库文件夹路径) 12 | 13 | ## 问题描述 14 | 15 | 请详细阐述已知问题描述。 16 | -------------------------------------------------------------------------------- /.github/workflows/auto-pr.yml: -------------------------------------------------------------------------------- 1 | name: 自动同步文档到蓝桥云课 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | auto-pr: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/checkout@v2 11 | with: 12 | ref: product 13 | - name: Reset promotion branch 14 | run: | 15 | git fetch origin master:master 16 | git reset --hard master 17 | - name: Create Pull Request 18 | uses: peter-evans/create-pull-request@v3 19 | with: 20 | branch: product-promotion 21 | reviewers: yanwydxf 22 | title: "自动同步文档到蓝桥云课" 23 | labels: 自动同步 24 | body: | 25 | 说明: 26 | 27 | - 这是一个自动生成的 PR,将保持 master 和 product 分支内容一致。 28 | - 课程内容,会在此 PR 合并之后自动同步上线。 29 | -------------------------------------------------------------------------------- /.github/workflows/prettier-lab-docs.yml: -------------------------------------------------------------------------------- 1 | name: 自动格式化文档 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | jobs: 7 | auto-prettier: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v2 12 | with: 13 | ref: ${{ github.head_ref }} 14 | - name: Get File Changes 15 | uses: trilom/file-changes-action@v1.2.4 16 | with: 17 | githubToken: ${{ secrets.GITHUB_TOKEN }} 18 | output: '" "' 19 | - name: Run Prettier 20 | run: npx prettier --write "${{ steps.get_file_changes.outputs.files }}" 21 | continue-on-error: true 22 | - name: Auto Commit 23 | uses: stefanzweifel/git-auto-commit-action@v4.3.0 24 | with: 25 | commit_message: 自动格式化文档 26 | branch: ${{ github.head_ref }} 27 | -------------------------------------------------------------------------------- /.github/workflows/sync-lab-docs.yml: -------------------------------------------------------------------------------- 1 | name: 同步文档到蓝桥云课 2 | on: 3 | push: 4 | branches: 5 | - product 6 | jobs: 7 | sync-lab-docs: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v2 12 | with: 13 | ref: ${{ github.head_ref }} 14 | - name: 获取变更文件 15 | uses: trilom/file-changes-action@v1.2.4 16 | with: 17 | output: "json" 18 | fileOutput: "json" 19 | - name: 安装 labdocs-update-cli 20 | run: | 21 | git clone https://${{ secrets.ACCESS_TOKEN }}@github.com/lanqiao-courses/labdocs-update-cli.git 22 | cd labdocs-update-cli && pip install --editable . 23 | - name: 同步文档至蓝桥云课 24 | # 同步修改和新增文件 25 | run: | 26 | labdocs login 27 | echo "===== 同步修改文件 =====" 28 | labdocs update --file $HOME/files_modified.json 29 | echo "===== 同步新增文件 =====" 30 | labdocs update --file $HOME/files_added.json 31 | 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /1-Linux-基础入门-free/06-2687-寻找文件.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:寻找文件 2 | 3 | ## 介绍 4 | 5 | 有一个非常重要的文件(`sources.list`)但是你忘了它在哪了,你依稀记得它在 `/etc/` 目录下,现在要你把这个文件找出来,然后设置成自己(shiyanlou 用户)可以访问,但是其他用户并不能访问。 6 | 7 | ## 目标 8 | 9 | 1. 找到 `sources.list` 文件 10 | 2. 把文件所有者改为自己(shiyanlou) 11 | 3. 把权限修改为仅仅只有自己可读可写 12 | 13 | ## 提示语 14 | 15 | - find 16 | - chmod 17 | - chown 18 | - sudo 19 | 20 | 注意:如果是实验楼的海外用户,由于环境差异可能会找到两个 `sources.list` 文件,不需要修改 shiyanlou 目录下的 `sources.list`,因为这个文件是从实验环境外部挂载到环境中的,是无法修改的。 21 | 22 | ## 参考答案 23 | 24 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。 25 | 26 |
27 | 参考答案 28 | 29 | ```bash 30 | sudo find /etc -name sources.list 31 | sudo chown shiyanlou /etc/apt/sources.list 32 | sudo chmod 600 /etc/apt/sources.list 33 | ``` 34 | 35 |
36 | -------------------------------------------------------------------------------- /1-Linux-基础入门-free/11-2697-备份日志.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:备份日志 2 | 3 | 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用 `alternatives.log` 日志替代),备份当天的日志并删除之前的日志。而且备份之后文件名是 `年-月-日` 的格式。`alternatives.log` 在 `/var/log/` 下面。 4 | 5 | ## 目标 6 | 7 | 1. 为 `shiyanlou` 用户添加计划任务 8 | 1. 每天凌晨 3 点的时候定时备份 `alternatives.log` 到 `/home/shiyanlou/tmp/` 目录 9 | 1. 命名格式为 `年-月-日`,比如今天是 2017 年 4 月 1 日,那么文件名为 `2017-04-01` 10 | 11 | ## 提示语 12 | 13 | - date 14 | - crontab 15 | - cp 命令 16 | - 用一条命令写在 crontab 里面即可,不用写脚本 17 | 18 | 注意 crontab 的计划任务设定的用户: 19 | 20 | ```bash 21 | crontab -e 表示为当前用户添加计划任务 22 | sudo crontab -e 表示为root用户添加计划任务 23 | ``` 24 | 25 | 注意使用下面的命令启动 crontab: 26 | 27 | ```bash 28 | sudo cron -f & 29 | ``` 30 | 31 | ## 参考答案 32 | 33 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。 34 | 35 |
36 | 参考答案 37 | 38 | ```bash 39 | sudo cron -f & 40 | crontab -e # 添加 41 | 0 3 * * * sudo rm /home/shiyanlou/tmp/* 42 | 0 3 * * * sudo cp /var/log/alternatives.log /home/shiyanlou/tmp/$(date +\%Y-\%m-\%d) 43 | ``` 44 | 45 |
46 | -------------------------------------------------------------------------------- /1-Linux-基础入门-free/15-2698-历史命令.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:历史命令 2 | 3 | ## 介绍 4 | 5 | 在 Linux 中,对于文本的处理和分析是极为重要的,现在有一个文件叫做 data1,可以使用下面的命令下载: 6 | 7 | ```bash 8 | cd /home/shiyanlou 9 | wget https://labfile.oss-internal.aliyuncs.com/courses/1/data1 10 | ``` 11 | 12 | data1 文件里记录是一些命令的操作记录,现在需要你从里面找出出现频率次数前 3 的命令并保存在 `/home/shiyanlou/result`。 13 | 14 | ## 目标 15 | 16 | 1. 处理文本文件 `/home/shiyanlou/data1` 17 | 2. 将结果写入 `/home/shiyanlou/result` 18 | 3. 结果包含三行内容,每行内容都是出现的次数和命令名称,如“100 ls” 19 | 20 | ## 提示 21 | 22 | 1. cut 截取 (参数可以使用 `-c 8-`,使用 man cut 可以查看含义) 23 | 2. `uniq -dc` 去重 24 | 3. sort 的参数选择 `-k1 -n -r` 25 | 4. 操作过程使用管道,例如: 26 | 27 | ```bash 28 | cd /home/shiyanlou 29 | cat data1 |....|....|.... > /home/shiyanlou/result 30 | ``` 31 | 32 | ## 来源 33 | 34 | 2016 年百度校招面试题 35 | 36 | ## 参考答案 37 | 38 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。 39 | 40 |
41 | 参考答案 42 | 43 | ```bash 44 | cat data1 |cut -c 8-|sort|uniq -dc|sort -rn -k1 |head -3 > /home/shiyanlou/result 45 | ``` 46 | 47 |
48 | -------------------------------------------------------------------------------- /1-Linux-基础入门-free/17-2699-数据提取.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:数据提取 2 | 3 | ## 介绍 4 | 5 | 小明在做数据分析的时候需要提取文件中关于数字的部分,同时还要提取用户的邮箱部分,但是有的行不是数组也不是邮箱,现在需要你在 data2 这个文件中帮助他用正则表达式匹配出数字部分和邮箱部分。 6 | 7 | 数据文件可以使用以下命令下载: 8 | 9 | ```bash 10 | $ cd /home/shiyanlou 11 | $ wget https://labfile.oss-internal.aliyuncs.com/courses/1/data2 12 | ``` 13 | 14 | 下载后的数据文件路径为 `/home/shiyanlou/data2`。 15 | 16 | ## 目标 17 | 18 | 1. 在文件 `/home/shiyanlou/data2` 中匹配数字开头的行,将所有以数字开头的行都写入 `/home/shiyanlou/num` 文件。 19 | 2. 在文件 `/home/shiyanlou/data2` 中匹配出正确格式的邮箱,将所有的邮箱写入 `/home/shiyanlou/mail` 文件,注意该文件中每行为一个邮箱。 20 | 21 | ## 提示 22 | 23 | 1. 邮箱的格式匹配 24 | 2. 注意符号 `.` 的处理 25 | 26 | ## 来源 27 | 28 | 2016 年 TapFun 校招面试题 29 | 30 | ## 参考答案 31 | 32 | 注意:请务必自己独立思考解决问题之后再对照参考答案,一开始直接看参考答案收获不大。 33 | 34 |
35 | 参考答案 36 | 37 | ```bash 38 | grep '^[0-9]' /home/shiyanlou/data2 > /home/shiyanlou/num 39 | grep -E '^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$' /home/shiyanlou/data2 > /home/shiyanlou/mail 40 | ``` 41 | 42 |
43 | -------------------------------------------------------------------------------- /1-Linux-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Linux 基础入门 2 | 3 | 本课程教你如何熟练地使用 Linux,本实验中通过在线动手实验的方式学习 Linux 常用命令,用户与权限管理,目录结构与文件操作,环境变量,计划任务,管道与数据流重定向等基本知识点。 4 | 5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/) 6 | - 链接: https://www.lanqiao.cn/courses/1 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1638351889148_68975725dd46a9adfd750384dc06e9ad) 9 | -------------------------------------------------------------------------------- /1035-Git-与-GitHub-入门实践-free/README.md: -------------------------------------------------------------------------------- 1 | # Git 与 GitHub 入门实践 2 | 3 | 本课程为 Git 与 GitHub 的入门课程,本着实用的原则,针对零基础同学,以图文的形式详细介绍了 Git & GitHub 结合使用的基本操作。课程包括:在 GitHub 上创建仓库、克隆 GitHub 上的仓库到本地、添加修改到暂存区以及撤销修改、配置个人信息、版本回退、处理提交时间线分叉问题、使用本地提交变化记录、添加 SSH 关联授权等方方面面的知识点。 4 | 5 | - 作者: [幺幺哒](https://www.lanqiao.cn/users/310176/) 6 | - 链接: https://www.lanqiao.cn/courses/1035 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1638351993699_06177efb06db02903ed126ca48dc5cba) 9 | -------------------------------------------------------------------------------- /106-Redis-简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # Redis 简明教程 2 | 3 | Redis 是一个开源,支持网络且基于内存和键值对的存储数据库,本课程将介绍 Redis 的基本配置和使用方法。 4 | 5 | - 作者: [lcf](https://www.lanqiao.cn/users/42227/) 6 | - 链接: https://www.lanqiao.cn/courses/106 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn106.jpg) 9 | -------------------------------------------------------------------------------- /11-Go-语言简明教程-free/07-142-IDE 及环境配置.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # GO 语言 IDE 及环境配置 8 | 9 | ## 实验介绍 10 | 11 | 本实验将简要介绍当前 Go 语言的主流 IDE,并对其环境配置进行详细介绍。 12 | 13 | #### 知识点 14 | 15 | - 常用开发工具及其环境配置 16 | 17 | ## Go 开发工具 18 | 19 | #### GOROOT 与 GOPATH 20 | 21 | 在介绍常用 IDE 之前,我们先来了解一下 Go 的环境变量配置,实际上在之前的课程中我们已经有所介绍了。 22 | 23 | **GOROOT** 24 | 25 | 就是 go 的安装路径。在 `~/.bash_profile` 中添加下面语句: 26 | 27 | ```bash 28 | GOROOT=/usr/local/go 29 | export GOROOT 30 | ``` 31 | 32 | 当然,要执行 go 命令和 go 工具,就要配置 go 的可执行文件的路径。 33 | 操作如下: 34 | 35 | 在 `~/.bash_profile` 中配置如下: 36 | 37 | ```bash 38 | export $PATH:$GOROOT/bin 39 | ``` 40 | 41 | **GOPATH** 42 | 43 | GOPATH 是作为编译后二进制的存放目的地和 import 包时的搜索路径 (其实也是你的工作目录,你可以在 src 下创建你自己的 go 源文件,然后开始工作)。 44 | 45 | GOPATH 之下主要包含三个目录: 46 | 47 | - `bin`:目录主要存放可执行文件; 48 | - `pkg`:目录存放编译好的库文件; 49 | - `src`:目录下主要存放 Go 的源文件。 50 | 51 | 不要把 GOPATH 设置成 Go 的安装路径,可以自己在用户目录下面创建一个目录,如 gopath。操作如下: 52 | 53 | ```bash 54 | cd ~ 55 | mkdir gopath 56 | 57 | # 在 ~/.bash_profile 中添加如下语句: 58 | GOPATH=/Users/username/gopath 59 | ``` 60 | 61 | ### 常用开发工具 62 | 63 | Go 语言在刚推出时并没有专门针对 Go 语言开发的 IDE,不过还好 Go 提供的插件比较完善。开发者可以使用 IDEA、Eclipse 工具安装 Go 插件进行 Go 语言开发。直到 2017 年著名的捷克公司 JetBrains 才发布了第一款专门针对 Go 语言开发的 IDE:Goland。本节内容也着重为大家介绍 IDEA 与 Goland。这两款软件都来自 JetBrains 公司,大家可以在[官网](https://www.jetbrains.com/)下载。由于实验环境不支持安装这两款软件,大家可以自行在本地电脑进行安装。 64 | 65 | **IDEA**:IntelliJ idea 是一款非常强大的 IDE,支持丰富的插件。安装配置都是非常简单的,主要需要安装插件 Go,也可以安装 Markdown 的插件,便于读写 Markdown 文件。 66 | 67 | 首先打开 IDEA,然后点击左上角”File->Settings->Plugins”; 68 | 69 | ![Plugins](https://doc.shiyanlou.com/document-uid949121labid10288timestamp1552542329146.png/wm) 70 | 71 | 然后点击 "Browse repositories";然后在搜索栏搜索插件 `GO`;选择名为 `GO` 的插件进行安装。 72 | 73 | ![install](https://doc.shiyanlou.com/document-uid949121labid10288timestamp1552542339121.png/wm) 74 | 75 | 插件安装完成后重启 IDEA, 再打开 `setting`,添加 `go sdk`。再点击 `GO` 对 `SDK` 进行设置,首先添加 `GOROOT` 也就是 GO 的安装路径,再设置 `GOPATH`。![SDK](https://doc.shiyanlou.com/document-uid949121labid10288timestamp1552542346099.png/wm) 76 | 然后就可以在 `GOPATH` 下的 `src` 目录下新建源文件了。 77 | 78 | **Goland**: Goland 是专门针对 Go 开发的一款 IDE,功能强大且整合了 IntelliJ 平台的有关 go 语言的编码辅助功能和工具集成特点。但是比较遗憾的是它没有免费社区版,想要使用它必须要购买注册码。 79 | 80 | 和 IDEA 一样,使用同样的方法进行下载安装,没有注册码的同学可以选择 30 天免费试用,然后打开设置,无需下载 GO 插件,直接进行添加 `GOROOT` 和 `GOPATH` 就可以新建项目进行开发了。对安装和配置步骤存在疑问的同学,可以在评论区留言提问,也可以在网上自行查阅相关教程。 81 | 82 | ## 实验总结 83 | 84 | 到目前为止,这门课程就结束了。在这门课程中我们学习了 Go 语言的基础知识,如数据类型、面向对象编程、并发编程等。可以看到 Go 语言的关键词非常少,使用起来相当灵活,相对于 C、C++ 等语言很大程度上提高了开发效率。想要进一步熟练 Go 语言,多看别人的源码,多加练习,多做项目即可,贵在坚持。 85 | 86 | #### 代码获取 87 | 88 | 本课程中的所有源码可以通过以下命令下载: 89 | 90 | ```bash 91 | wget https://labfile.oss-internal.aliyuncs.com/courses/11/Golang_Programming.zip 92 | ``` 93 | 94 | #### 参考文档 95 | 96 | 本课程的文档部分参考了以下文档。 97 | 98 | - [Go 语言官方文档](http://golang.org/doc/) 99 | - [Go 入门指南](https://github.com/Unknwon/the-way-to-go_ZH_CN) 100 | - [Go web 编程](https://github.com/astaxie/build-web-application-with-golang/blob/master/LICENSE.md) 101 | -------------------------------------------------------------------------------- /11-Go-语言简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # Go 语言简明教程 2 | 3 | Go 语言是来自 Google 的一门静态编译型语言,它拥有媲美 C 语言的强大性能。设计者赋予了它大道至简的设计理念,使它具有简洁、高效且灵活多变的特性。特别是在支持高并发的分布式集群系统中,Go 语言拥有得天独厚的优势。 4 | 5 | - 作者: [小码农](https://www.lanqiao.cn/users/20417/) 6 | - 链接: https://www.lanqiao.cn/courses/11 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/course/1542591711549_【11】-【Go语言编程】.png) 9 | -------------------------------------------------------------------------------- /115-操作系统原理与实践-free/00-2704815-使用本课程上课说明.wd.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 说明 8 | 9 | **由于服务器资源有限,近期使用本课程上课老师较多,为避免学生同时开启环境,导致服务器超载,请各位使用本课程上课的老师认真阅读下列说明,做好资源扩容报备,以避免影响您的上课体验!** 10 | 11 | 院校老师上课需知: 12 | 13 | 为满足老师的授课需求,请使用此课程授课的老师,**至少提前一天**填写此登记表提前报备(**每次课前均要报备**),以便扩充课程资源! 14 | 15 | **如未提前登记直接开课,则可能出现资源满载学生无法开启环境的情况。** 16 | 17 | 18 | 开课登记表👉:https://lanqiao-product.feishu.cn/share/base/form/shrcni82J0ddxUPclYPnGYuuYvc (点击链接,填写表单进行报备)。 -------------------------------------------------------------------------------- /115-操作系统原理与实践-free/80-574-终端设备的控制.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 字符显示的控制 8 | 9 | ## 1. 课程说明 10 | 11 | 难度系数:★★☆☆☆ 12 | 13 | 本实验是 [操作系统之外设与文件系统 - 网易云课堂](https://mooc.study.163.com/course/1000002009#/info) 的配套实验,推荐大家进行实验之前先学习相关课程: 14 | 15 | - L26 I/O 与显示器 16 | - L27 键盘 17 | 18 | > Tips:点击上方文字中的超链接或者输入 https://mooc.study.163.com/course/1000002009#/info 进入理论课程的学习。 19 | > 如果网易云上的课程无法查看,也可以看 Bilibili 上的 [操作系统哈尔滨工业大学李治军老师](https://www.bilibili.com/video/av17036347)。 20 | 21 | ## 2. 实验目的 22 | 23 | - 加深对操作系统设备管理基本原理的认识,实践键盘中断、扫描码等概念; 24 | - 通过实践掌握 Linux 0.11 对键盘终端和显示器终端的处理过程。 25 | 26 | ## 3. 实验内容 27 | 28 | 本实验的基本内容是修改 Linux 0.11 的终端设备处理代码,对键盘输入和字符显示进行非常规的控制。 29 | 30 | 在初始状态,一切如常。用户按一次 F12 后,把应用程序向终端输出所有字母都替换为“\*”。用户再按一次 F12,又恢复正常。第三次按 F12,再进行输出替换。依此类推。 31 | 32 | 以 ls 命令为例: 33 | 34 | 正常情况: 35 | 36 | ```bash 37 | # ls 38 | hello.c hello.o hello 39 | ``` 40 | 41 | 第一次按 F12,然后输入 ls: 42 | 43 | ```bash 44 | # ** 45 | *****.* *****.* ***** 46 | ``` 47 | 48 | 第二次按 F12,然后输入 ls: 49 | 50 | ```bash 51 | # ls 52 | hello.c hello.o hello 53 | ``` 54 | 55 | 第三次按 F12,然后输入 ls: 56 | 57 | ```bash 58 | # ** 59 | *****.* *****.* ***** 60 | ``` 61 | 62 | ## 4. 实验报告 63 | 64 | 完成实验后,在实验报告中回答如下问题: 65 | 66 | - 在原始代码中,按下 F12,中断响应后,中断服务程序会调用 func?它实现的是什么功能? 67 | - 在你的实现中,是否把向文件输出的字符也过滤了?如果是,那么怎么能只过滤向终端输出的字符?如果不是,那么怎么能把向文件输出的字符也一并进行过滤? 68 | 69 | ## 5. 评分标准 70 | 71 | - F12 切换,40% 72 | - 输出字符隐藏,40% 73 | - 实验报告,20% 74 | 75 | ## 6. 实验提示 76 | 77 | 本实验需要修改 Linux 0.11 的终端设备处理代码(`kernel/chr_drv/console.c` 文件),对键盘输入和字符显示进行非常规的控制。 78 | 79 | ### 6.1 键盘输入处理过程 80 | 81 | 键盘 I/O 是典型的中断驱动,在 `kernel/chr_drv/console.c` 文件中: 82 | 83 | ```c 84 | void con_init(void) //控制台的初始化 85 | { 86 | // 键盘中断响应函数设为 keyboard_interrupt 87 | set_trap_gate(0x21, &keyboard_interrupt); 88 | } 89 | ``` 90 | 91 | 所以每次按键有动作,keyboard_interrupt 函数就会被调用,它在文件 `kernel/chr_drv/keyboard.S`(注意,扩展名是大写的 S)中实现。 92 | 93 | 所有与键盘输入相关的功能都是在此文件中实现的,所以本实验的部分功能也可以在此文件中实现。 94 | 95 | 简单说,`keyboard_interrupt` 被调用后,会将键盘扫描码做为下标,调用数组 `key_table` 保存的与该按键对应的响应函数。 96 | 97 | ### 6.2 输出字符的控制 98 | 99 | `printf()` 等输出函数最终都是调用 `write()` 系统调用,所以控制好 `write()`,就能控制好输出字符。 100 | -------------------------------------------------------------------------------- /12-MongoDB-基础教程-free/06-2789-挑战:管理员工的基本信息.tz.md: -------------------------------------------------------------------------------- 1 | ## 管理员工的基本信息 2 | 3 | ### 介绍 4 | 5 | 某公司随着员工人数的增加,现需要开发一个系统用于管理员工的基本信息,请你根据给出的要求帮他们设计并实现该系统的数据库。 6 | 7 | 公司员工的信息如下: 8 | 9 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid370051labid50timestamp1490667463721.png/wm) 10 | 11 | 注意服务器中的 MongoDB 服务还没有启动,需要先用 `sudo service mongodb start` 启动服务,然后以 `mongo` 命令进入 MongoDB shell 。 12 | 13 | ### 目标 14 | 15 | 1. MongoDB 服务处于运行状态; 16 | 2. 新建的数据库名称为 shiyanlou; 17 | 3. 在 shiyanlou 中新建集合 employee ,用于存储员工的基本信息; 18 | 4. 将上述表中的信息插入到集合 employee 中,包括: sid,sname,age,gender,phone,address,其中 address 以嵌入式关系进行存储,包括 city,district; 19 | 5. 员工 Tom 的电话换成了 18200753159,家从 jinniu 区 搬到了 chenghua 区,更新 Tom 的信息; 20 | 6. 在列**工号(sid)**和**姓名(sname)**上建立索引,加快查询速度。 21 | 22 | ### 提示 23 | 24 | - 工号为数值型 25 | - 更新子文档信息 26 | - 由于插入数据量太大,手动输入容易出错,可以拷贝参考答案中的插入数据进行操作 27 | 28 | ### 参考答案 29 | 30 | 创建数据库以及插入数据 31 | 32 | ```bash 33 | $ sudo service mongodb start 34 | $ mongo 35 | use shiyanlou 36 | db.employee.insert([{"sid":1001,"sname":"Tom","age":35,"gender":"male","phone":13981234567,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1002,"sname":"Jack","age":26,"gender":"male","phone":13981357913,"address":[{"city":"Chengdu","district":"wuhou"}]},{"sid":1003,"sname":"Rose","age":31,"gender":"female","phone":13980246802,"address":[{"city":"Chongqing","district":"jiangbei"}]},{"sid":1004,"sname":"Bob","age":29,"gender":"male","phone":13987654321,"address":[{"city":"Chongqing","district":"yuzhong"}]},{"sid":1005,"sname":"Gavin","age":24,"gender":"male","phone":13989753197,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1006,"sname":"Amy","age":27,"gender":"female","phone":13988642086,"address":[{"city":"Shanghai","district":"xuhui"}]},{"sid":1007,"sname":"Anne","age":23,"gender":"female","phone":18211237894,"address":[{"city":"Chengdu","district":"qingyang"}]},{"sid":1008,"sname":"John","age":33,"gender":"male","phone":18219638521,"address":[{"city":"Chongqing","district":"jiangbei"}]},{"sid":1009,"sname":"Tony","age":36,"gender":"male","phone":18211478523,"address":[{"city":"Chengdu","district":"jinniu"}]},{"sid":1010,"sname":"Betty","age":28,"gender":"female","phone":18218520369,"address":[{"city":"Beijing","district":"chaoyang"}]}]) 37 | ``` 38 | 39 | 接着上面的步骤,进行更新,导出等操作: 40 | 41 | ```bash 42 | > db.employee.update({"sname":"Tom"},{$set:{"phone":"18200753159"}}) 43 | > db.employee.update({"sname":"Tom"},{$set:{"address.0.district":"chenghua"}}) 44 | 45 | // 如果嵌入文档未加'[]'。即不是以数组的方式,则修改子文档的命令为 db.employee.update({"sname":"Tom"},{$set:{"address.district":"chenghua"}}) 46 | 47 | > db.employee.ensureIndex({"sid":1,"sname":1}) 48 | ``` 49 | -------------------------------------------------------------------------------- /12-MongoDB-基础教程-free/README.md: -------------------------------------------------------------------------------- 1 | # MongoDB 基础教程 2 | 3 | 目前 MongoDB 是 IT 行业非常流行的一种非关系型数据库(NoSQL),其灵活的数据存储方式备受当前 IT 从业人员的青睐。本课程是 MongoDB 基础教程,介绍了 MongoDB 基本的集合操作、高级查询以及索引与聚合。 4 | 5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/) 6 | - 链接: https://www.lanqiao.cn/courses/12 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn12.jpg) 9 | -------------------------------------------------------------------------------- /1230-Java-简明教程-free/13-11049-正则表达式.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 正则表达式 8 | 9 | ## 简介 10 | 11 | > 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE ),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 12 | 13 | Java 通过 `java.util.regex` 包支持正则表达式的的功能。 14 | 15 | #### 知识点 16 | 17 | - java.util.regex 18 | 19 | ## 匹配 20 | 21 | **这里只说明如何在 Java 中使用正则表达式,关于表达式的更多内容,请在实验楼搜索相关内容学习。** 22 | 23 | Java 使用正则表达式匹配非常简单,这里我们以匹配邮箱地址为例。在 `/home/project` 目录下新建一个源代码文件 `RegexDemo.java`。 24 | 25 | ```java 26 | import java.util.regex.Matcher; 27 | import java.util.regex.Pattern; 28 | 29 | public class RegexDemo { 30 | public static void main(String[] args) { 31 | // Pattern类 正则表达式的编译表示。 32 | Pattern pattern = Pattern.compile("^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$"); 33 | String[] emails = {"shiyanlou@shiyanlou.com", "shiyanlou"}; 34 | for (String email : 35 | emails) { 36 | //Matcher 通过解释Pattern对字符序列执行匹配操作的引擎 37 | Matcher matcher = pattern.matcher(email); 38 | System.out.println(email + "匹配结果:" + matcher.matches()); 39 | } 40 | } 41 | } 42 | ``` 43 | 44 | 编译运行: 45 | 46 | ```bash 47 | $ javac RegexDemo.java 48 | $ java RegexDemo 49 | shiyanlou@shiyanlou.com匹配结果:true 50 | shiyanlou匹配结果:false 51 | ``` 52 | 53 | ```checker 54 | - name: 检查是否存在 RegexDemo 55 | script: | 56 | #!/bin/bash 57 | ls /home/project/RegexDemo.java 58 | error: | 59 | 没有找到 /home/project/RegexDemo.java 文件 60 | ``` 61 | 62 | ## 练习题:正则表达式 63 | 64 | 在 `/home/project` 目录下新建一个源代码文件 `RegexTest.java`。你需要完成以下要求: 65 | 66 | - 从控制台输入一串字符串,使用正则表达式判断其是不是 11 位手机号码。 67 | - 如果是 11 位手机号码,输出 `true`,如果不是输出 `false`。 68 | 69 | 示例: 70 | 71 | ```bash 72 | 输入: 73 | 13408199578 74 | 输出: 75 | true 76 | ``` 77 | 78 | ```checker 79 | - name: 检查是否存在 RegexTest 80 | script: | 81 | #!/bin/bash 82 | ls /home/project/RegexTest.java 83 | error: | 84 | 没有找到 /home/project/RegexTest.java 文件 85 | - name: 输出结果检测 86 | script: | 87 | #!/bin/bash 88 | javac /home/project/RegexTest.java -d . ;echo 13408199484 | java RegexTest | grep true 89 | error: | 90 | 输出结果错误 91 | timeout: 20 92 | ``` 93 | 94 | ### 参考答案 95 | 96 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大**。 97 | 98 | ```java 99 | import java.util.Scanner; 100 | import java.util.regex.Matcher; 101 | import java.util.regex.Pattern; 102 | 103 | public class RegexTest { 104 | public static void main(String[] args) { 105 | Pattern pattern = Pattern.compile("^1([34578])\\d{9}$"); 106 | Scanner in = new Scanner(System.in); 107 | String phone = in.nextLine(); 108 | Matcher matcher = pattern.matcher(phone); 109 | System.out.println(matcher.matches()); 110 | } 111 | } 112 | ``` 113 | 114 | ## 总结 115 | 116 | 本节内容相对简单,仅说明了如何在 Java 中使用正则表达式。主要知识点为: 117 | 118 | - java.util.regex 119 | 120 | 到此,Java 语言编程基础我们就学完了。在学完基础知识之后,还请多勤加练习,多写代码巩固相关知识内容。 121 | -------------------------------------------------------------------------------- /1230-Java-简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # Java 简明教程 2 | 3 | 本课程作为 Java 编程的入门内容,是每个 Java 初学者都必须掌握的基础知识。课程从常量与变量、运算符、流程控制、数组和方法等 Java 基础语法开始,层层递进,逐步带你认识了解如何通过 Java 实现面向对象的三大特征继承、封装,多态。同时,课程还会涉及 Java 中常用类、字符串、集合框架和异常处理的相关操作使用。 4 | 5 | - 作者: [Chamber](https://www.lanqiao.cn/users/441493/) 6 | - 链接: https://www.lanqiao.cn/courses/1230 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211222-1640137044945) 9 | -------------------------------------------------------------------------------- /1238-JavaScript-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # JavaScript 基础入门 2 | 3 | 课程从什么是 JavaScript 开始,一步步讲解 JavaScript 基础语法、关键特性、JSON、WebAPI 等知识点。内容将会涉及网页窗口交互的方法以及通过 DOM 进行网页元素的相关操作。 4 | 5 | - 作者: [哦嗨哟 L](https://www.lanqiao.cn/users/897174/) 6 | - 链接: https://www.lanqiao.cn/courses/1238 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211217-1639724478051) 9 | -------------------------------------------------------------------------------- /1262-Vue.js-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Vue.js 基础入门 2 | 3 | 本课程是一门 Vue.js 的入门课程,介绍了 Vue 的安装和使用,带领大家学习 Vue 模板语法,核心指令,计算和侦听属性,条件和循环渲染元素,以及怎样去绑定元素 class 和 style,处理基础事件,Vue 组件开发等。 4 | 5 | - 作者: [linki](https://www.lanqiao.cn/users/940410/) 6 | - 链接: https://www.lanqiao.cn/courses/1262 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/course/1554280673829_【1262】-【Vue基础入门】.png) 9 | -------------------------------------------------------------------------------- /1265-Python-实现常见数据结构-free/README.md: -------------------------------------------------------------------------------- 1 | # Python 实现常见数据结构 2 | 3 | 使用 Python 实现各种算法,主要知识点包括数据结构,哈希,数学算法,线性代数,搜索算法,排序算法,字符串。 4 | 5 | - 作者: [寒冰团长](https://www.lanqiao.cn/users/890547/) 6 | - 链接: https://www.lanqiao.cn/courses/1265 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/course/1555480028087_【1265】-【Python实现各种常用算法】.png) 9 | -------------------------------------------------------------------------------- /1330-Python-新手入门课-free/03-11071-创建代码文件.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:创建代码文件 2 | 3 | ## 介绍 4 | 5 | 在这个挑战中,你需要在指定的目录下创建一个代码文件,然后拷贝到指定的目录。 6 | 7 | 挑战全程在 Xfce 终端中操作,忘记命令时可以翻阅上节的笔记,这是你的第一个挑战,加油! 8 | 9 | ## 目标 10 | 11 | 1. 请在 `/home/shiyanlou` 目录下创建 `shiyanlou.py` 文件。 12 | 2. 在文件中输入以下内容: 13 | 14 | ```python 15 | print('hello shiyanlou') 16 | ``` 17 | 18 | 3. 进入 `Code` 目录,新建名为 `test` 的目录,然后将刚创建的 `/home/shiyanlou/shiyanlou.py` 文件复制到目录 `/home/shiyanlou/Code/test` 中。 19 | 20 | ## 提示语 21 | 22 | 1. `touch` 创建文件 23 | 2. 可使用 `Sublime、gedit、Vim` 等编辑器 24 | 3. `mkdir` 创建目录 25 | 4. `cd ~` 返回 `home` 目录 26 | 5. `cp` 复制 27 | 6. 使用 `Sublime` 写入代码后,注意保存的位置。 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid8504-20190712-1562904376758) 30 | 31 | **请务必注意文件的路径,确保文件路径为 `/home/shiyanlou/shiyanlou.py` 和 `/home/shiyanlou/Code/test/shiyanlou.py`。可使用 `pwd` 命令自查,否则将无法通过检测。** 32 | 33 | ## 知识点 34 | 35 | - Linux 目录结构 36 | - Linux 文件操作 37 | - cp 命令 38 | - mkdir 命令 39 | -------------------------------------------------------------------------------- /1330-Python-新手入门课-free/06-11076-逢 7 就跳过.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:逢 7 就跳过 2 | 3 | ## 介绍 4 | 5 | 不知道你有没有玩过“逢 7 过”的游戏,游戏规则很简单: 6 | 7 | 几个人轮流报数,凡遇到 7 的倍数,或含 7 的数字就要跳过,否则就算失败。 8 | 9 | 今天我们就用 Python 来打印 1 到 100 之间,所有满足条件的数字。 10 | 11 | ![图片描述](https://doc.shiyanlou.com/courses/uid8504-20190522-1558521315468) 12 | 13 | ## 目标 14 | 15 | 1. 请在 `/home/shiyanlou` 目录下创建 `jump7.py` 文件(请确保目录正确,否则无法通过挑战) 16 | 2. 在文件中写入代码,打印 1 到 100 之间(包含 1 和 100),不是 7 的倍数、且不含 7 的数字,每行打印一个数字。 17 | 3. 完成挑战后,请把文件复制到 `/home/shiyanlou/Code` 目录内,然后点击右侧工具栏的「 下载代码 」,把代码下载到本地, **我们在下个挑战中还会用到这段代码**。 18 | 19 | ## 知识点 20 | 21 | - Python 开发环境 22 | - int 类型 23 | - 变量 24 | - 运算符 25 | - while 循环 26 | - 条件判断 27 | 28 | ## 提示 29 | 30 | **⚠️ 前方高能,有剧透风险,喜欢挑战的同学请先独立思考,然后借着百度、谷歌来解出题目。** 31 | 32 | 在实际的开发工作中,大部分工作也是靠着经验 + 思考 + 搜索引擎来完成的,你可以提前熟悉这个感觉。 33 | 34 | #### 💡(一) 35 | 36 | 开发中,我们经常要先构思框架,再优化功能。 37 | 38 | 所以在这个挑战中,你可以先用循环,写出打印出 1 到 100 间的数字的程序,之后再往里面加条件判断。 39 | 40 | #### 💡(二) 41 | 42 | 7 的倍数,可以理解为除以 7 余数为 0 的数; 43 | 44 | ```python 45 | a % 7 == 0 46 | ``` 47 | 48 | 在 1 到 100 这个区间里: 49 | 50 | - 个位上是 7 的数,即除以 10 余 7 的数; 51 | 52 | ```python 53 | a % 10 == 7 54 | ``` 55 | 56 | - 十位上是 7 的数,即除以 10 取整数为 7 的数。 57 | 58 | ```python 59 | a // 10 == 7 60 | ``` 61 | 62 | 如果满足这些条件,就跳过;如不满足,则打印。可以用 `elif` 或 `or` 来加判定条件~ 63 | 64 | #### 💡(三) 65 | 66 | **请保证文件名和存储路径都满足题目要求。** 67 | 68 | PS:还记得我们在第一节实验中,体验过的那个对战小游戏吗?其实你现在已经可以把那个游戏编写出来了!完成挑战后,不妨尝试一下~如果有什么问题,记得在群里和小伙伴们讨论一下。 69 | 70 |
71 | 参考答案 72 |

使用 while:

73 |

74 | a = 0
75 | while a < 100:
76 |     a = a + 1
77 |     if a % 7 == 0 or a % 10 == 7 or a // 10 == 7:
78 |         continue
79 |     else:
80 |         print(a)
81 |    
82 |

使用 for:

83 |

84 | for a in range(1,101):
85 |     if a % 7 == 0 or a % 10 == 7 or a // 10 == 7:
86 |         continue
87 |     else:
88 |         print(a)
89 |    
90 |
91 | -------------------------------------------------------------------------------- /1330-Python-新手入门课-free/08-11102-最终挑战:提交代码.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:提交我的代码 2 | 3 | ## 介绍 4 | 5 | 我们已经有了 Github 账号,现在需要你能新建一个仓库,并向仓库中提交上一个挑战的代码。你需要完整地执行一次对 GitHub 仓库的创建、克隆、提交、推送操作。 6 | 7 | ## 目标 8 | 9 | 1. 在自己电脑中的浏览器上打开 GitHub 页面,登录账号后创建 `shiyanlou-code` 仓库。 10 | 2. 在实验环境中,克隆你的仓库到 `/home/shiyanlou/Code` 目录下。 11 | 3. 进入 `cd /home/shiyanlou/Code/shiyanlou-code` 中,新建 `jump7.py` 文件,并把你上个挑战的通过代码,复制进文件中保存。 12 | 4. 将全部修改添加到暂存区、创建提交、推送到自己的 GitHub 远程 `shiyanlou-code` 仓库 13 | 5. 本挑战没有标准答案,完成整个上传仓库的流程即可。 14 | 15 | ## 提示语 16 | 17 | 1. `git clone https://github.com/你的Github账号/仓库名称` 克隆仓库 18 | 2. 用右侧工具栏的「剪切板」,可以复制代码。 19 | 3. `git add .` 添加修改到暂存区 20 | 4. `git commit -m 备注信息` 创建新的提交版本 21 | 5. `git push` 将提交推送到远程仓库 22 | 23 | ## 知识点 24 | 25 | - Github 操作 26 | - git clone 27 | - git add 28 | - git commit 29 | - git push 30 | -------------------------------------------------------------------------------- /1330-Python-新手入门课-free/README.md: -------------------------------------------------------------------------------- 1 | # Python 新手入门课 2 | 3 | 极度舒适的新手入门课程,面向完全没有编程基础的同学。你将在一下午入门 Linux、Python 基础和 Github 常用命令,为未来的编程大楼打下稳固的基础。 4 | 5 | - 作者: [实小楼](https://www.lanqiao.cn/users/8504/) 6 | - 链接: https://www.lanqiao.cn/courses/1330 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211217-1639724495831) 9 | -------------------------------------------------------------------------------- /1403-Linux-运维新手入门课-free/02-12916-挑战:创建代码文件.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:创建代码文件 2 | 3 | ## 介绍 4 | 5 | 在这个挑战中,你需要在指定的目录下创建一个代码文件,然后拷贝到指定的目录。 6 | 7 | 挑战全程在 Xfce 终端中操作,忘记命令时可以翻阅上节的笔记,遇到问题时请在微信答疑群里 **@助教**,我们会帮助你解决问题。 8 | 9 | ## 目标 10 | 11 | 1. 请在 `/home/shiyanlou` 目录下创建 `shiyanlou.py` 文件 12 | 2. 在文件中输入以下内容: 13 | 14 | ```python 15 | print('hello shiyanlou') 16 | ``` 17 | 18 | 3. 进入 `Code` 目录,新建名为 `test` 的目录,然后将 `shiyanlou.py` 复制到目录 `/home/shiyanlou/Code/test` 中 19 | 20 | ## 提示语 21 | 22 | 1. `touch` 创建文件 23 | 2. 可使用 `Sublime、gedit、Vim` 等编辑器 24 | 3. `mkdir` 创建目录 25 | 4. `cd ~` 返回 `home` 目录 26 | 5. `cp` 复制 27 | 6. 使用 `Sublime` 写入代码后,注意保存的位置。 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid8504-20190712-1562904376758) 30 | 31 | ## 知识点 32 | 33 | - Linux 目录结构 34 | - Linux 文件操作 35 | - cp 命令 36 | - mkdir 命令 37 | -------------------------------------------------------------------------------- /1403-Linux-运维新手入门课-free/04-12918-挑战:让实验楼网站恢复访问.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:让实验楼网站恢复访问 2 | 3 | ## 介绍 4 | 5 | 小楼这次闯下大祸,不小心把线上的实验楼网站搞挂了。实验楼的网站使用的是 nginx 服务,目前无法启动。 6 | 7 | 右边给你的是实验楼的服务器,请尝试在最短的时间内让实验楼恢复访问。你所节省的每一分钟,都能挽留上百名实验楼的用户。 8 | 9 | **注意**:实验楼网站页面目录为 `/home/shiyanlou/page`。 10 | 11 | ## 目标 12 | 13 | 恢复访问的要求如下: 14 | 15 | 1. Nginx 服务处于运行状态 16 | 2. 在实验环境中使用 Firefox 浏览器访问本地 `http://localhost` 可以进入实验楼的主页,如下图: 17 | 18 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid1labid2641timestamp1489113160808.png/wm) 19 | 20 | 实验环境的桌面如果没有 Firefox 图标,可以在下图所示的位置找到打开的入口: 21 | 22 | ![图片描述](https://doc.shiyanlou.com/courses/uid977658-20191010-1570689850870/wm) 23 | 24 | ## 提示 25 | 26 | 要注意,环境中的 Apache 可能会导致 Nginx 启动失败,可以执行 `sudo service apache2 stop` 来停止它。 27 | 28 | 如果启动失败,可以使用 `sudo nginx -t` 来排查配置文件的错误哟 ~ 29 | 30 | 赶紧启动 Nginx 吧! 31 | 32 | ## 知识点 33 | 34 | 1. nginx 服务配置 35 | 2. nginx 日志分析 36 | -------------------------------------------------------------------------------- /1403-Linux-运维新手入门课-free/README.md: -------------------------------------------------------------------------------- 1 | # Linux 运维新手入门课 2 | 3 | Linux 运维的新手入门课程,面向完全没有 Linux 基础的同学。你将在一下午入门 Linux、Nginx 基础和 Zabbix 监控系统,为未来的 Linux 服务器运维工作打下基础。 4 | 5 | - 作者: [实小楼](https://www.lanqiao.cn/users/8504/) 6 | - 链接: https://www.lanqiao.cn/courses/1403 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid8504-20191018-1571390319412) 9 | -------------------------------------------------------------------------------- /144-HTML-实现扫雷游戏-free/README.md: -------------------------------------------------------------------------------- 1 | # HTML 实现扫雷游戏 2 | 3 | 本课程带领大家实现经典小游戏扫雷,你可以通过实践 JavaScript 和 CSS 等基本的 Web 开发知识,学习如何对游戏中的对象进行抽象和封装。 4 | 5 | - 作者: [atwal](https://www.lanqiao.cn/users/21657/) 6 | - 链接: https://www.lanqiao.cn/courses/144 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn144.jpg) 9 | -------------------------------------------------------------------------------- /1485-Julia-简明教程-free/07-16802-按照要求打印学生信息.tz.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: false 5 | --- 6 | 7 | # 挑战:按照要求打印学生信息 8 | 9 | ## 介绍 10 | 11 | 我们已经学习了很多 Julia 的基本语法,现在完成这个挑战巩固一下其中的一些知识点。 12 | 13 | 首先根据「实验 1」中的方法安装 Julia ,打开终端命令行切换到 Code 目录下: 14 | 15 | ```bash 16 | $ cd ~/Code 17 | ``` 18 | 19 | 执行如下命令安装: 20 | 21 | ```bash 22 | wget https://labfile.oss-internal.aliyuncs.com/courses/1485/julia-1.3.1-linux-x86_64.tar.gz 23 | tar xzvf julia-1.3.1-linux-x86_64.tar.gz 24 | cd /usr/bin 25 | sudo ln -s /home/shiyanlou/Code/julia-1.3.1/bin/julia julia 26 | cd - 27 | ``` 28 | 29 | 如上所示,最后一个命令回到 /home/shiyanlou/Code 目录下,然后创建 test.jl 文件: 30 | 31 | ```bash 32 | $ touch test.jl 33 | ``` 34 | 35 | 已知一个学生的信息保存在字典中,包括 name 、age 、height 、score 、school 等信息,现在要将它们按照这样的格式打印出来: 36 | 37 | ```bash 38 | NAME: 小明 39 | HEIGHT: 130 40 | SCORE: 89 41 | SCHOOL: No.1 Middle School 42 | AGE: 12 43 | ``` 44 | 45 | 已知文件内容如下,可以将其复制到实验环境中: 46 | 47 | ```julia 48 | student = Dict("name" => "小明", "age" => 12, "score" => 89, 49 | "height" => 130, "school" => "No.1 Middle School") 50 | 51 | function print_info(stu) 52 | # TODO 53 | end 54 | 55 | print_info(student) 56 | ``` 57 | 58 | 如上所示,需要在 test.jl 文件中定义一个函数 print_info ,最后调用函数打印 student 字典中的信息,注意 key 要全大写。 59 | 60 | 完成代码后,在命令行执行 `julia test.jl` 命令: 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid310176-20200116-1579180254361/wm) 63 | 64 | #### 知识点 65 | 66 | - for 循环 67 | - Dict 数据类型 68 | - \$ 格式化打印 69 | - 函数的定义 70 | - uppercase 函数的使用 71 | 72 | 点击下一页查看参考答案。 73 | 74 | ## 参考代码 75 | 76 | 注意:文件要放到指定目录下,文件名要拼写正确 77 | 78 | ```julia 79 | student = Dict("name" => "小明", "age" => 12, "score" => 89, 80 | "height" => 130, "school" => "No.1 Middle School") 81 | 82 | function print_info(stu) 83 | for (key, value) in student 84 | println("$(uppercase(key)): $value") 85 | end 86 | end 87 | 88 | print_info(student) 89 | ``` 90 | -------------------------------------------------------------------------------- /1485-Julia-简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # Julia 简明教程 2 | 3 | 本课程作为 Julia 这门编程语言的入门教程,旨在介绍其基础语法,希望大家能够通过本课程的学习,熟练掌握 Julia 的语法风格和编程习惯。 4 | 5 | - 作者: [幺幺哒](https://www.lanqiao.cn/users/310176/) 6 | - 链接: https://www.lanqiao.cn/courses/1485 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid214893-20200117-1579248373874) 9 | -------------------------------------------------------------------------------- /1499-通过例子学-Rust-free/07-16551-表达式.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 表达式 8 | 9 | ## 实验介绍 10 | 11 | 本节实验通过一个简短的示例介绍下 Rust 的表达式,包括代码块、语句、左值、右值等基本概念。 12 | 13 | #### 知识点 14 | 15 | 本节实验的主要内容包括以下知识点: 16 | 17 | - 表达式 18 | - 代码块 19 | - 左值 20 | - 右值 21 | 22 | #### 安装环境 23 | 24 | 在实验开始之前,我们首先需要安装 rust 开发环境, 25 | 26 | ```bash 27 | sudo apt update 28 | sudo apt install rustc -y 29 | ``` 30 | 31 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20220216-1644973783064) 32 | 33 | 安装完成后可以通过 `rustc --version` 验证。 34 | 35 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20220216-1644973867988) 36 | 37 | ## 语句构成 38 | 39 | Rust 程序(大部分)由一系列语句构成: 40 | 41 | ```rust 42 | fn main() { 43 | // 语句 44 | // 语句 45 | // 语句 46 | } 47 | ``` 48 | 49 | Rust 有多种语句。最普遍的语句类型有两种:一种是绑定变量,另一种是表达式带上分号: 50 | 51 | ```rust 52 | fn main() { 53 | // 变量绑定 54 | let x = 5; 55 | 56 | // 表达式; 57 | x; 58 | x + 1; 59 | 15; 60 | } 61 | ``` 62 | 63 | 代码块也是表达式,所以它们在赋值操作中可以充当右值(r-values)。代码块中的最后一条 64 | 表达式将赋给左值(l-value)。需要注意的是,如果代码块最后一条表达式结尾处有分号,那 65 | 么返回值将变成 `()`。 66 | 67 | > 译注:代码块中的最后一条语句是代码块中**实际执行**的最后一条语句,而不一定是代码块中最后一行的语句。 68 | 69 | ```rust 70 | fn main() { 71 | let x = 5u32; 72 | 73 | let y = { 74 | let x_squared = x * x; 75 | let x_cube = x_squared * x; 76 | 77 | // 将此表达式赋给 `y` 78 | x_cube + x_squared + x 79 | }; 80 | 81 | let z = { 82 | // 分号结束了这个表达式,于是将 `()` 赋给 `z` 83 | 2 * x; 84 | }; 85 | 86 | println!("x is {:?}", x); 87 | println!("y is {:?}", y); 88 | println!("z is {:?}", z); 89 | } 90 | ``` 91 | 92 | ## 实验总结 93 | 94 | 本节实验通过一个简短的示例学习了 Rust 的表达式。 95 | 96 | 请务必按照实验步骤将示例代码在实验环境中完整输入一遍,并完成动手练习题目。只有真正动手去做才会有最大的收获,遇到问题欢迎在 [实验楼讨论区](https://www.shiyanlou.com/questions/) 中发帖与同学讨论交流。 97 | -------------------------------------------------------------------------------- /1499-通过例子学-Rust-free/11-16555-crate.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # crate 8 | 9 | ## 实验介绍 10 | 11 | crate(中文有 “包,包装箱” 之意)是 Rust 的编译单元。当调用 `rustc some_file.rs` 时,`some_file.rs` 被当作 **crate 文件**。如果 `some_file.rs` 里面含有 `mod` 声明,那么模块文件的内容将在编译之前被插入 crate 文件的相应声明处。换句话说,模块**不会**单独被编译,只有 crate 才会被编译。 12 | 13 | #### 知识点 14 | 15 | 本节实验的主要内容包括以下知识点: 16 | 17 | - `crate` 概念 18 | - 创建方式 19 | - `extern crate` 20 | 21 | #### 安装环境 22 | 23 | 在实验开始之前,我们首先需要安装 rust 开发环境, 24 | 25 | ```bash 26 | sudo apt update 27 | sudo apt install rustc -y 28 | ``` 29 | 30 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20220216-1644973783064) 31 | 32 | 安装完成后可以通过 `rustc --version` 验证。 33 | 34 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20220216-1644973867988) 35 | 36 | ## `crate` 概念 37 | 38 | crate(中文有 “包,包装箱” 之意)是 Rust 的编译单元。当调用 `rustc some_file.rs` 时,`some_file.rs` 被当作 **crate 文件**。如果 `some_file.rs` 里面含有 `mod` 声明,那么模块文件的内容将在编译之前被插入 crate 文件的相应声明处。换句话说,模块**不会**单独被编译,只有 crate 才会被编译。 39 | 40 | crate 可以编译成二进制可执行文件(binary)或库文件(library)。默认情况下,`rustc` 将从 crate 产生二进制可执行文件。这种行为可以通过 `rustc` 的选项 `--crate-type` 重载。 41 | 42 | ## 创建方式 43 | 44 | 让我们创建一个库,然后看看如何把它链接到另一个 crate。 45 | 46 | 新建 `rary.rs` 文件,编写代码如下: 47 | 48 | ```rust 49 | pub fn public_function() { 50 | println!("called rary's `public_function()`"); 51 | } 52 | 53 | fn private_function() { 54 | println!("called rary's `private_function()`"); 55 | } 56 | 57 | pub fn indirect_access() { 58 | print!("called rary's `indirect_access()`, that\n> "); 59 | 60 | private_function(); 61 | } 62 | ``` 63 | 64 | 在实验楼 WebIDE 终端中执行以下命令: 65 | 66 | ```bash 67 | $ rustc --crate-type=lib rary.rs 68 | ``` 69 | 70 | 执行的结果如下所示: 71 | 72 | ![执行结果](https://doc.shiyanlou.com/courses/uid1172186-20200107-1578383066) 73 | 74 | 默认情况下,库会使用 crate 文件的名字,前面加上 “lib” 前缀,但这个默认名称可以使用 `crate_name` 属性覆盖。 75 | 76 | ## `extern crate` 77 | 78 | 要把上一节创建的库链接到一个 crate,必须使用 `extern crate` 声明。这不仅会链接库,还会用一个与库名相同的模块来存放库里面的所有项。于模块的可见性规则也适用于库。 79 | 80 | ```rust 81 | // 链接到 `rary` 库,导入其中的项 82 | extern crate rary; 83 | 84 | fn main() { 85 | rary::public_function(); 86 | 87 | // 报错! `private_function` 是私有的 88 | //rary::private_function(); 89 | 90 | rary::indirect_access(); 91 | } 92 | ``` 93 | 94 | 在实验楼 WebIDE 终端中执行以下命令: 95 | 96 | ```bash 97 | # library.rlib 是已编译好的库的路径,这里假设它在同一目录下: 98 | $ rustc executable.rs --extern rary=./library.rlib && ./executable 99 | ``` 100 | 101 | 执行的结果如下: 102 | 103 | ![执行结果](https://doc.shiyanlou.com/courses/uid1172186-20200107-1578383067) 104 | 105 | ## 实验总结 106 | 107 | 本节实验中我们学习了以下的内容: 108 | 109 | - `crate` 概念 110 | - 创建方式 111 | - `extern crate` 112 | 113 | 请务必按照实验步骤将示例代码在实验环境中完整输入一遍,并完成动手练习题目。只有真正动手去做才会有最大的收获,遇到问题欢迎在 [实验楼讨论区](https://www.shiyanlou.com/questions/) 中发帖与同学讨论交流。 114 | -------------------------------------------------------------------------------- /1499-通过例子学-Rust-free/README.md: -------------------------------------------------------------------------------- 1 | # 通过例子学 Rust 2 | 3 | Rust 是一门注重安全(Safety)、速度(Speed)和并发(Concurrency)的现代系统编程语言。Rust 通过内存安全来实现以上目标,但不用垃圾回收机制。《通过例子学 Rust》由一系列可运行的实例组成,通过这些例子阐明了各种 Rust 的概念和基本库。 4 | 5 | - 作者: [云课管理员](https://www.lanqiao.cn/users/1735818/) 6 | - 链接: https://www.lanqiao.cn/courses/1499 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid214893-20200110-1578643296222) 9 | -------------------------------------------------------------------------------- /2-Vim-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Vim 基础入门 2 | 3 | 本课程将带大家学习使用强大的 Vim 编辑器。Vim 是从 vi 发展出来的一个文本编辑器,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。适合所有想要学习编程和想要在蓝桥云课学习的人。 4 | 5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/) 6 | - 链接: https://www.lanqiao.cn/courses/2 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211222-1640137054209) 9 | -------------------------------------------------------------------------------- /2023-TypeScript-基础入门-free/03-29202-接口.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 接口(Inferfaces) 8 | 9 | ## 简介 10 | 11 | 在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型。接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。 12 | 13 | #### 知识点 14 | 15 | - 接口的基本概念 16 | - 可选属性 17 | - 任意属性 18 | - 只读属性 19 | 20 | ## 接口的基本概念 21 | 22 | 在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型,在面向对象编程中接口都是比较常见且重要的概念。 23 | 24 | **接口的作用:** 25 | 26 | 1. 对类的一部分行为进行抽象(类的部分后续会讲到) 27 | 2. 描述对象的形状 28 | 29 | ```ts 30 | interface Person { 31 | name: string; 32 | age: number; 33 | } 34 | 35 | let tom: Person = { 36 | name: "tom", 37 | age: 18, 38 | }; 39 | ``` 40 | 41 | 上面的例子中,我们定义了一个接口 `Person`,接着定义了一个变量 `tom`,它的类型是 `Person`。这样,我们就约束了 `tom` 的形状必须和接口 `Person` 一致。 42 | 43 | **注意:** 44 | 45 | 接口一般首字母大写,也可以在接口之前加大写 `I` ,赋值的时候,变量的形状必须和接口的形状保持一致。不允许添加未定义的属性。 46 | 47 | ## 可选属性 48 | 49 | 有时我们希望不要完全匹配一个形状,那么可以用可选属性。 50 | 51 | ```ts 52 | interface Person { 53 | name: string; 54 | age?: number; 55 | } 56 | 57 | let tom: Person = { 58 | name: "Tom", 59 | }; 60 | ``` 61 | 62 | ![](https://doc.shiyanlou.com/courses/700/1226977/41b24c10495cbc9d7fe3df81a434c75b-0/wm) 63 | 64 | 在属性后使用 `?` 表示这个属性是可选属性,可选属性的含义是该属性可以不存在,但是仍然不允许添加未定义的属性。 65 | 66 | ## 任意属性 67 | 68 | 有时候我们希望一个接口允许有任意的属性,可以使用如下方式。 69 | 70 | ```ts 71 | interface Person { 72 | name: string; 73 | age?: number; 74 | [propName: string]: any; 75 | } 76 | 77 | let tom: Person = { 78 | name: "Tom", 79 | gender: "male", 80 | }; 81 | ``` 82 | 83 | ![](https://doc.shiyanlou.com/courses/700/1226977/5143c29c7c23eaac65a328cf1a91c1af-0/wm) 84 | 85 | 使用 `[propName: string]` 定义了任意属性取 `string` 类型的值。 86 | 87 | ## 只读属性 88 | 89 | 有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 `readonly` 定义只读属性: 90 | 91 | ```ts 92 | interface Person { 93 | readonly id: number; 94 | name: string; 95 | age?: number; 96 | [propName: string]: any; 97 | } 98 | 99 | let tom: Person = { 100 | id: 123, 101 | name: "Tom", 102 | gender: "male", 103 | }; 104 | ``` 105 | 106 | ![](https://doc.shiyanlou.com/courses/700/1226977/22b67b2e9d8dcf83021ff9a81e5c58bb-0/wm) 107 | 108 | 如果使用 `readonly` 定义的属性 `id` 初始化后,又被赋值了,那么就会报错了: 109 | 110 | ![](https://doc.shiyanlou.com/courses/700/1226977/c3c3f5c29d3efff1cf6af86b4b3549c3-0/wm) 111 | 112 | ## 总结 113 | 114 | 本实验我们学习了以下内容: 115 | 116 | - 接口的基本概念 117 | - 可选属性 118 | - 任意属性 119 | - 只读属性 120 | 121 | 希望各位学员能够多动手敲代码,才能更熟悉。 122 | -------------------------------------------------------------------------------- /2023-TypeScript-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # TypeScript 基础入门 2 | 3 | 本课程是 TypeScript 基础入门课程。课程从什么是 TypeScript 开始,一步步讲解到基本数据类型、接口、类、函数、模块、命名空间等知识点。 4 | 5 | - 作者: [Sny](https://www.lanqiao.cn/users/1226977/) 6 | - 链接: https://www.lanqiao.cn/courses/2023 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1631095090019_a8101c884c5c1db8d2bc806c91de5318) 9 | -------------------------------------------------------------------------------- /22-jQuery-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # jQuery 基础入门 2 | 3 | jQuery 是一个优秀的轻量级 Javascript 库,兼容 CSS3,还兼容各种浏览器,在 Web 前端开发中广泛使用。课程将从 jQuery 基础入手,我们会学习到 jQuery 的具有鲜明特征的用法,例如 jQuery 选择器、jQuery 的事件和动画等,最终达到熟练掌握 jQuery 的目的。 4 | 5 | - 作者: [Christian](https://www.lanqiao.cn/users/20407/) 6 | - 链接: https://www.lanqiao.cn/courses/22 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid18510-20190523-1558594931531) 9 | -------------------------------------------------------------------------------- /23-PHP-编程入门-free/01-189-PHP简介.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # PHP 简介 8 | 9 | ## 实验介绍 10 | 11 | 本节介绍了什么是 PHP 和 PHP 的应用,然后介绍如何运行 PHP 文件。 12 | 13 | #### 实验知识点 14 | 15 | - PHP 基础知识 16 | 17 | #### 实验环境 18 | 19 | - PHP 7.4 20 | 21 | ## 实验步骤 22 | 23 | - PHP 是什么 24 | - PHP 能做什么 25 | - PHP 如何运行 26 | 27 | ### PHP 是什么 28 | 29 | PHP(全称 Hypertext Preprocessor,超文本预处理器的字母缩写)是一种服务器端脚本语言,它可嵌入到 HTML 中,尤其适合 WEB 开发。 30 | 31 | 一个简单的 PHP 文件示例 32 | 33 | ```php 34 | 35 | 36 | Example 37 | 38 | 39 | 40 |

41 | 42 |

43 | 44 | 45 | ``` 46 | 47 | 其中被 `` 包围的内容即是 PHP 程序,在装了 PHP 解释器的服务端运行该文件时,PHP 程序能够被解析到 HTML 页面中,上例中结果为 48 | 49 | ```html 50 | 51 | 52 | Example 53 | 54 | 55 | 56 |

Hello ShiYanLou!

57 | 58 | 59 | ``` 60 | 61 | ### PHP 能做什么 62 | 63 | - **服务端脚本**。这是 PHP 最传统,也是最主要的目标领域。需要具备以下三点:PHP 解析器(CGI 或者服务器模块),WEB 服务器(如 Nginx,Apache)和浏览器。 64 | 65 | - **命令行脚本**。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它,仅需要 PHP 解析器来执行。 66 | 67 | - **桌面应用程序**。桌面应用程序可以通过 PHP 高级特性 PHP-GTK 来编写。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。 68 | 69 | ### PHP 如何运行 70 | 71 | - 命令行脚本文件 72 | 73 | 在目录 `/home/project` 创建 hello.php,并编辑内容 74 | 75 | ```php 76 | $a = 'Hello World'; 116 | php > echo $a; 117 | Hello World 118 | ``` 119 | 120 | - 直接运行代码 121 | 122 | ```bash 123 | php -r "echo 'Hello World!';" 124 | Hello World 125 | ``` 126 | 127 | - 服务器端 128 | - cgi,如 Nginx 的 fast-cgi。 129 | - 模块,如 Apache 的 mod_php。 130 | 131 | 在开发和测试阶段还可以使用 PHP 内置服务器 132 | 133 | ```bash 134 | cd /home/project 135 | php -S localhost:8080 136 | ``` 137 | 138 | 端口号 8080 可以自定义 139 | 140 | 浏览器输入 http://localhost:8080/hello.php 141 | 142 | ```html 143 | Hello World 144 | ``` 145 | 146 | ```checker 147 | - name: 检查是否创建hello.php 148 | script: | 149 | #!/bin/bash 150 | ls -l /home/project/hello.php 151 | error: | 152 | 我们发现您还没有编辑 hello.php 153 | ``` 154 | 155 | ## 课后习题 156 | 157 | 请编写一个 PHP 脚本,在命令行输出 158 | 159 | ```bash 160 | hello shiyanlou 161 | ``` 162 | 163 | ## 参考文档 164 | 165 | 本实验课程基于《PHP 参考手册》中文版本制作,可查看原版链接:http://php.net/manual/zh/ 166 | -------------------------------------------------------------------------------- /23-PHP-编程入门-free/02-190-基本语法.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # PHP 基本语法 8 | 9 | ## 实验介绍 10 | 11 | 本节介绍了 PHP 标记,指令分隔符和注释 12 | 13 | #### 实验知识点 14 | 15 | - PHP 标记 16 | - 从 HTML 中分离 17 | - 指令分隔符 18 | - 注释 19 | 20 | #### 实验环境 21 | 22 | - PHP 7.4 23 | 24 | ## 实验步骤 25 | 26 | - PHP 标记 27 | - 从 HTML 中分离 28 | - 指令分隔符 29 | - 注释 30 | 31 | ### PHP 标记 32 | 33 | 通常 PHP 标记为 ``,输出内容可使用短格式 ``。所有这些标签内的部分都会被 PHP 解析器解析。 34 | 35 | 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白。 36 | 37 | ```php 38 | ` 45 | 46 | 在 PHP5.4 以后短标签无需任何设置,都是合法标签。 47 | 48 | ```php 49 | 50 | ``` 51 | 52 | 注意:在 PHP7 中以下两个标记方式已经不再适用 53 | 54 | - `` 55 | - `<%` 和 `%>` 56 | 57 | ### 从 HTML 中分离 58 | 59 | 通常情况下可以使用 `echo` 输出 HTML 页面 60 | 61 | 编辑 `/home/project/html.php` 62 | 63 | ```php 64 | 69 | 70 | 71 | This is a paragraph 72 |

73 | 74 | "; 75 | ``` 76 | 77 | 命名行执行 78 | 79 | ```bash 80 | php html.php 81 | ``` 82 | 83 | 由于在一对开始和结束标记之外的内容都会被 PHP 解析器忽略,我们可以在 HTML 中需要使用 PHP 的地方在执行 PHP 程序,因此,上面例子可以写成 84 | 85 | ```php 86 | 89 | 90 | 91 |

> 92 | This is a paragraph 93 |

94 | 95 | 96 | ``` 97 | 98 | 命名行执行 99 | 100 | ```bash 101 | php html.php 102 | ``` 103 | 104 | 两次执行的结果是一样的,因此可以使用第二种方式将 PHP 代码嵌入到 HTML 中,避免使用 `echo` 输出整段 html 代码。 105 | 106 | ```checker 107 | - name: 查看是否创建 html.php 108 | script: 109 | #!/bin/bash 110 | grep html /home/project/html.php 111 | error: 112 | 我们发现您还没有创建 html.php 113 | ``` 114 | 115 | ### 指令分隔符 116 | 117 | PHP 需要在每个语句后用分号(`;`)结束指令。如果后面还有新行,则代码段的结束标记包含了行结束。 118 | 119 | ### 注释 120 | 121 | PHP 支持多种注释风格 122 | 123 | - 单行注释。 `//` 和 `#` 仅仅注释到行末或者当前的 PHP 代码块。 124 | - 多行注释。注释在碰到第一个 `*/` 时结束 125 | 126 | ```php 127 | sayHi(); 80 | ``` 81 | 82 | 执行 php const.php 83 | 84 | 从结果可以看出,常量 HELLO 被定义后,无法重新赋值。 85 | 86 | ```checker 87 | - name: 检测是否创建文件 const.php 88 | script: | 89 | #!/bin/bash 90 | grep define /home/project/const.php 91 | error: | 92 | 我们发现您还没有编辑 const.php 93 | ``` 94 | 95 | ### 相比变量 96 | 97 | #### 相同点 98 | 99 | 命名规范都必须以字母或下划线开头,后面跟字母,数字或下划线 100 | 101 | #### 不同点 102 | 103 | - 常量前面没有美元符号 `$` 104 | - 常量只能通过 `define()` 或 `const` 定义,而不能通过赋值语句 105 | - 常量可以不用理会变量的作用域而在任何地方定义和访问 106 | - 常量一旦定义就不能被重新定义或者取消定义 107 | - 常量的值只能是标量 108 | 109 | ### 魔术常量 110 | 111 | PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。 112 | 113 | 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 `__LINE__` 的值就依赖于它在脚本中所处的行来决定,这些特殊的常量不区分大小写。 114 | 115 | - `__LINE__`,文件中的当前行号。 116 | - `__FILE__`,文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。 117 | - `__DIR__`,文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。 118 | - `__FUNCTION__`,函数名称,返回该函数被定义时的名字。 119 | - `__CLASS__`,类的名称,返回该类被定义时的名字。 120 | - `__TRAIT__`,Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。 121 | - `__METHOD__`,类的方法名,返回该方法被定义时的名字(区分大小写)。 122 | - `__NAMESPACE__`,当前命名空间的名称(区分大小写)。 123 | 124 | ## 课后习题 125 | 126 | 试试上述讲到的 8 个魔术常量会输出什么。 127 | -------------------------------------------------------------------------------- /23-PHP-编程入门-free/README.md: -------------------------------------------------------------------------------- 1 | # PHP 编程入门 2 | 3 | PHP 是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML 中,尤其适合 web 开发。实验课程基于《PHP 参考手册》中文版本制作。 4 | 5 | - 作者: [Sny](https://www.lanqiao.cn/users/1226977/) 6 | - 链接: https://www.lanqiao.cn/courses/23 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211222-1640137055326) 9 | -------------------------------------------------------------------------------- /237-Hadoop-基础入门-free/00-2437210-版本更新说明.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 课程版本更新说明 8 | 9 | ## 实验环境更新 10 | 11 | 12 | 经过迭代升级,我们对实验环境进行了一系列的改进。在之前的版本中,我们使用的是 CentOS 64 位操作系统,单核处理器,1G 内存,并且不支持可视化操作。然而,为了提升实验的性能和功能,我们做出了以下调整。 13 | 14 | 升级了操作系统,选择了 Ubuntu 64 位版本。Ubuntu 是一个广泛使用的开源操作系统,它具有更好的用户界面和友好的用户体验,同时也有着广泛的软件支持和社区支持。 15 | 16 | 此外由于大数据环境对于硬件要求较高,课程更新之后对硬件进行了升级。我们增加了处理器的核心数量,从单核升级到了 4 核。这意味着我们的实验环境可以同时处理更多的任务,提高了计算能力和效率。另外,我们还增加了内存容量,从 1G 升级到了 16G。更大的内存容量可以容纳更多的数据和程序,提供更好的性能和稳定性。 17 | 18 | 而且 Ubuntu 实验环境还支持可视化操作。在之前的版本中,我们的实验环境不支持可视化操作,限制了一些需要图形界面的实验和应用。为了满足用户的需求,我们现在的实验环境支持可视化操作,用户可以方便地使用图形界面进行各种操作和任务。 19 | 20 | 通过这些升级和改进,我们的实验环境变得更加强大和灵活,为用户提供了更好的实验体验和更广泛的应用场景。我们相信这些改进将使实验工作更高效、更便捷,并为用户带来更多的可能性。 21 | 22 | ## 技术框架更新 23 | 24 | 随着大数据技术的不断发展,由于课程发布时间较早,其中部分框架的版本已经落后于业界实际使用,以及部分框架已经退出大众视野,不再使用。因此结合实际需求,做出调整如下: 25 | 26 | 新版本技术框架: 27 | 28 | - JDK **升级**为 1.8 29 | - Hadoop **升级**为 2.9.2 30 | - Hive **升级**为 2.3.4 31 | - Sqoop **升级**为 1.4.7 32 | - Flume **升级**为 1.9.0 33 | - **新增** Spark-2.3.4 计算引擎 34 | 35 | 此外,像 Pig、Mahout 和 Chukwa 由于版本更新的历史原因,目前在互联网业界已经很少使用。所以排在了后续章节,作为选学内容,读者在学有余力的情况下可以作为扩展知识了解。 36 | -------------------------------------------------------------------------------- /237-Hadoop-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Hadoop 基础入门 2 | 3 | 课程涵盖了大数据领域常见的组件,如 Hadoop、Mapreduce、HBase、Spark、Hive、Sqoop 和 Flume 等。我们将从理论出发,搭建环境并学习相应实践案例。 4 | 5 | - 作者: [jan98341](https://www.lanqiao.cn/users/29778/) 6 | - 链接: https://www.lanqiao.cn/courses/237 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/course/1542592277450_【237】-【Hadoop入门进阶课程】.png) 9 | -------------------------------------------------------------------------------- /35-Hadoop-部署及管理-free/README.md: -------------------------------------------------------------------------------- 1 | # Hadoop 部署及管理 2 | 3 | Hadoop 是一款支持数据密集型分布式应用并以 Apache 2.0 许可协议发布的开源软件框架,本实验学习并实践 Hadoop 系统的不同模式的部署,以及基本的系统使用与管理。 4 | 5 | - 作者: [实验楼包工头](https://www.lanqiao.cn/users/20418/) 6 | - 链接: https://www.lanqiao.cn/courses/35 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1522313561058.png) 9 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/001-87321-先跑起来.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 先跑起来 🥊 8 | 9 | ## Python 10 | 11 | #### 什么是 Python? 12 | 13 | - Python 很好用 14 | - 适合初学者 15 | - 而且在各个领域都很强大 16 | 17 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210219-1613741920318) 18 | 19 | ### 后来居上 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210302-1614680976240) 22 | 23 | - 上图可以点开 24 | - Python3 逆风翻盘 25 | - 当然 `java` 也是非常伟大的对手 26 | 27 | ### 历史悠久 28 | 29 | - 三次问鼎 `tiobe` 霸主之位 30 | - LinuxJournal 31 | - 最喜欢的编程语言 2009-2011 32 | - 最喜欢的脚本语言 2006-2008、2010、2011 33 | - LinuxQuestion.org 34 | - 会员选择大奖 2007-2010 35 | 36 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210302-1614681460201) 37 | 38 | ### 从安装开始 39 | 40 | - 打开终端 terminal 41 | - 运行 Python3 42 | - 更新 apt 源,安装 Python 43 | - 打开 xfce 进入终端 44 | 45 | ```bash 46 | #首先是更新源 47 | sudo apt update 48 | 49 | #然后是安装Python 50 | sudo apt install python3 51 | 52 | #最后升级Python 53 | sudo apt upgrade python3 54 | ``` 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210302-1614682257719) 57 | 58 | - 一路下一步就可以 59 | - 这样就可以更新到最新版本的 Python 啦 🤗 60 | 61 | ### 运行 Python3 62 | 63 | ```bash 64 | python3 65 | ``` 66 | 67 | - 我们进入 Python 了 68 | - 这东西就像一个游戏 69 | - 当前的版本是 3.8.10 70 | - 这个环境叫做 `IDLE` 71 | - 具体啥意思? 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220112-1641976868394) 74 | 75 | ### IDLE 76 | 77 | - `IDLE`是什么意思? 78 | - 直白的意思就是无所事事的闲人 🤡 79 | - 具体点呢 80 | - `I`ntergrated `D`evelopment and `L`earning `E`nvironment 81 | - 你可以让他执行你的命令 82 | - 这里整合了开发和学习环境 83 | - 这里就是我们的游乐场 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210302-1614682548000) 86 | 87 | - 玩之前我们先找一下出口 88 | - 怎么退出呢? 89 | 90 | ### 退出 Python 91 | 92 | - `quit()` 93 | - ctrl+d也可以退出游乐场 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220112-1641976900531) 96 | 97 | - 游乐场正运行着呢 98 | - 这时候告诉游乐场,我要走了 99 | - 游乐场一听 100 | - 泪流满面 😭 101 | - 你要走了 102 | - 游乐场也关门了 103 | - 不过没事,什么时候想去,游乐场都会再开 😛 104 | 105 | ## 总结 106 | 107 | - 这次我们, 108 | - 了解了 Python 109 | - 安装了 Python 110 | - 进入了 Python 111 | - 退出了 Python 112 | - 这并不难 113 | 114 | #### 这就是我们对于 Python 的初体验。恭喜您存活了下来! 115 | 116 | - Python 还有什么好玩的呢?🤔 117 | - 我们下次再说!👋 118 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/010-87991-不换行输出.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 不换行输出 8 | 9 | ## 回忆上次内容 10 | 11 | - `\n` 就是换行 12 | - 他对应着 `ascii` 字符的代码是(`10`)`10进制` 13 | - 他的英文是 LF,意思是`Line Feed` 14 | - 这样我就可以自由的控制哪里换行了! 15 | - 可以做一个框架标题吗?🤔 16 | 17 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210307-1615080561808) 18 | 19 | ### 尝试制作 20 | 21 | ```shell 22 | vi banner.py 23 | ``` 24 | 25 | - 首先要新建一个`banner.py`文件 26 | - 并用`vi`打开 27 | 28 | ```python3 29 | print("*==================*"); 30 | print("* *"); 31 | print("* oeasy *"); 32 | print("* *"); 33 | print("*==================*"); 34 | 35 | ``` 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210307-1615080640738) 38 | 39 | - `:w|!python %` 执行脚本 40 | 41 | ### 回到单行输出 42 | 43 | - 如果我中间来两行`print()` 44 | 45 | ```bash 46 | print("oeasy") 47 | print() 48 | print() 49 | print("oeasy") 50 | ``` 51 | 52 | - 那为什么我两个 `print` 就会输出两行? 53 | - 这里面也没有换行啊 54 | - help 一下 55 | 56 | ### 查询帮助 57 | 58 | - 我们在`python3`帮助模式中 59 | - 查询`print` 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613825169267) 62 | 63 | - 这里面有一个 end='\n' 64 | - 就如同 sep=" " 65 | - 让分隔符默认是空格一样 66 | - 结尾符是作为默认参数值放到这里的 67 | - 也就是说默认就加个换行 68 | - 如果我们把 end 设置为`$`会如何? 69 | - 说干就干 70 | 71 | ### end 结尾字符 72 | 73 | ```python 74 | print("HelloWorld",end='$') 75 | ``` 76 | 77 | - end 就是结尾 78 | - print 会给字符串最后结尾加上一个`$` 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613825388067) 81 | 82 | - 他直接把后面的提示符给顶出来一块 83 | - 哈哈哈哈 84 | - 如果是别的字符呢? 85 | - 比如`abc` 86 | 87 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613825502869) 88 | 89 | ### 不换行 90 | 91 | ```python 92 | print("hello",end='') 93 | ``` 94 | 95 | - 如果结尾字符啥都没有呢?会如何? 96 | - 试试 end="" 97 | 98 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613825704886) 99 | 100 | - 如果使用 end='' 101 | - 但是依旧想要在结束的地方换行 102 | - 应该怎么办? 103 | 104 | ### 结尾还是换行 105 | 106 | - 手动在结尾添加 `\n` 107 | - 这样就可以不换行持续在一行输出了! 108 | - 同样如果在里面加上`\n`也就会换行了 109 | - 下面两句是等价的 110 | 111 | ```python 112 | print("hello\n",end='') 113 | print("hello") 114 | ``` 115 | 116 | - 这不就是又回来了么?! 117 | - 好像什么都没有学的样子! 118 | - 😅 真的有点尴尬... 119 | 120 | ## 总结 121 | 122 | - `print`函数 123 | - 有个默认的参数 `end` 124 | - `end参数` 的默认值是 `\n` 125 | - `end` 的值可以是任意字符串 126 | - 都会加到输出的后面 127 | - 如果是空串`end=""` 128 | - 意味着输出完不换行而且什么也不加 129 | - 但我可以手动在字符串里面加上换行符 `\n` 130 | - 这样的话 131 | - 我不但可以控制哪里换行 132 | - 还能控制哪里不换行! 133 | - 我想输出点别的,比如说当前时间?🤔 134 | - 我们下次再说!👋 135 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/012-87993-刷新时间.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 刷新时间 8 | 9 | ## 回忆上次内容 10 | 11 | - 通过搜索 12 | - 我们学会 import 导入 `time` 了 13 | - time 是一个 `module`模块包 14 | - 我们可以得到当前的时间了 15 | - localtime = time.asctime( time.localtime(time.time()) ) 16 | - `time.asctime(...)` 17 | - 是`time`这个`module`里面的函数 18 | - `time.localtime(...)` 19 | - 是`time`这个`module`里面的函数 20 | - `time.time(...)` 21 | - 是`time`这个`module`里面的函数 22 | - 都是外部函数 23 | - 内部函数是系统自带的 24 | - 比如`quit()` 25 | - 现在想要自动刷新时间,怎么办?🤔 26 | 27 | ### 写 py 文件 28 | 29 | - 我不想手动刷新 30 | - 要自动延迟 31 | - 首先要把这个东西制作成一个 py 文件 32 | - 先退出 python3 解释器环境 33 | - 使用内建的函数`quit()` 34 | 35 | ```shell 36 | #编辑文件 37 | vi localtime.py 38 | ``` 39 | 40 | ### 写文件并运行 41 | 42 | - 然后原来的东西全都写进 py 文件去 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613828277503) 45 | 46 | - `:w|!python3 %`保存并执行当前文件 47 | - 是可以执行的 48 | 49 | ### 继续搜索 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613828880628) 52 | 53 | - 不断寻找 54 | - 打开 55 | - 尝试 56 | 57 | ### 观察代码 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613828968027) 60 | 61 | - 这里有点小错误 62 | - 主要是 while 后面的条件 63 | - 具体看后面 64 | 65 | ### 抄写下来,进行分析 66 | 67 | ```python 68 | import time 69 | i = 1 70 | while i <= 3: 71 | print(i) 72 | i = i+1 73 | time.sleep(1) 74 | ``` 75 | 76 | - 引入了 `time` 包 77 | - i 是一个数 78 | - 一开始等于 `1` 79 | - 注意 `while` 这一行 80 | - 条件是` i<=3` 81 | - 行尾有个半角冒号 82 | - 后面用tab空了 4 个字符 83 | - 在 while 下紧跟着空了四个字符的三句话 84 | - 都是 while 要执行的循环体 85 | - 注意缩进一定是 4 个字符 86 | - time.sleep(1) 87 | - 是 time 包里面的 88 | - 小括号应该对应函数 89 | - sleep(1)这个函数的参数是 1 90 | - 应该是愣 1 秒的意思 91 | 92 | ### 进行改造 93 | 94 | ```python 95 | i = 1 96 | while True: 97 | print(i) 98 | i = i+1 99 | time.sleep(1) 100 | ``` 101 | 102 | - 原来只能循环 3 次 103 | - 主要就是 while 的条件改成了 True 104 | - 注意`True`的大小写 105 | - 现在无限循环 106 | - 跟着 while 但是缩进的三句话无限循环 107 | - `:w|!python3 %`开始循环 108 | - ctrl+c跳出循环回 vi 109 | 110 | ### 整合代码 111 | 112 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613829824540) 113 | 114 | - 现在我们就需要把两个文档整合到一起 115 | - 上次的代码能够得到时间并输出 116 | - 这次的代码能够提供一个基本的循环结构 117 | - 具体怎么整合看你的了!!! 118 | 119 | ## 总结 120 | 121 | - 通过搜索 122 | - 可以延迟 123 | - `time.sleep(1)` 124 | - 可以无限循环 125 | - `while True:` 126 | - 现在需要两个程序的整合 127 | - 怎么办?🤔 128 | - 我们下次再说!👋 129 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/013-87995-整合程序.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 整合程序 8 | 9 | ## 回忆上次内容 10 | 11 | - 通过搜索 12 | - 可以延迟 13 | - `time.sleep(1)` 14 | - 可以无限循环 15 | - `while True:` 16 | - 现在需要两个程序的整合 17 | - 怎么办?🤔 18 | 19 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613829824540) 20 | 21 | - 你一定要自己整合啊 22 | - 生命在于瞎折腾 23 | 24 | ### 进行整合 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613830240822) 27 | 28 | ```python 29 | import time 30 | while True: 31 | localtime=time.asctime(time.localtime(time.time())) 32 | print("localtime:"+localtime) 33 | time.sleep(1) 34 | ``` 35 | 36 | - 思路就是 37 | - 循环作为整体框架结构 38 | - 循环的内容是输出时间 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210220-1613830348663) 41 | 42 | - 成功是成功了 43 | - 但是停不下来 😅 44 | - 用ctrl+c停下来 45 | - 其实可以试试北京时间、东京时间各是多少。。。 46 | - 我们从 vim 里跳出来回到 shell 运行一下 47 | 48 | ### 在终端运行 49 | 50 | ```shell 51 | #使用python3对于sleep.py进行解释 52 | python3 sleep.py 53 | ``` 54 | 55 | - 这样也是运行成功的 56 | - 但是我想直接运行 57 | - 比如直接如下 58 | 59 | ```shell 60 | sleep.py 61 | ``` 62 | 63 | - 就运行,可能吗? 64 | 65 | ## 总结 66 | 67 | - 我们把两个程序整合起来了 68 | - 可以持续输出当前时间 69 | - 每秒都更新 70 | - 但是我想直接在 shell 里面输入`sleep.py`就运行 71 | - 可能吗?🤔 72 | - 我们下次再说!👋 73 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/014-87996-直接运行.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 直接运行 8 | 9 | ## 回忆上次内容 10 | 11 | - 我们把两个程序整合起来了 12 | - 可以持续输出当前时间 13 | - 每秒更新 14 | - 但是我想直接在 shell 里面输入`sleep.py`就运行 15 | - 可能吗?🤔 16 | - 先搜索吧 17 | 18 | ### 进行搜索 19 | 20 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613892082677) 21 | 22 | ### 提示是这样的 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613892140071) 25 | 26 | - 总共分 3 步: 27 | - 第 1 步文件位置 28 | - 以前确认过 29 | - Python3 在 /usr/bin/ 30 | - 第 2 步编辑文件 31 | 32 | ### 添加文件头 33 | 34 | ```python 35 | #!/usr/bin/python3 36 | ``` 37 | 38 | - `#`的意思是`注释` 39 | - 这句不用执行 40 | - !/usr/bin/python3 这个指的是当前文件的执行方式 41 | - 如果要执行的话,用 `python3` 来执行 42 | - `which python3`? 43 | - 就是 `/usr/bin` 下的 `python3` 44 | 45 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613894255175) 46 | 47 | ### 尝试执行 48 | 49 | ```shell 50 | #直接运行sleep.py 51 | sleep.py 52 | ``` 53 | 54 | - 根本没有找到 sleep.py 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613892798653) 57 | 58 | ```bash 59 | #明确sleep.py位于当前目录,并运行 60 | ./sleep.py 61 | ``` 62 | 63 | - 第 2 句找到了 `sleep.py`,但是没有权限 64 | 65 | ### 提升权限 66 | 67 | ```bash 68 | #查询sleep.py 69 | ls -lah sleep.py 70 | #修改权限 71 | sudo chmod u+x sleep.py 72 | #再次查询sleep.py 73 | ls -lah sleep.py 74 | ``` 75 | 76 | - 注意下图红圈位置的变化 77 | - 从-到了 x 78 | - -就是没有权限 79 | - x 就是有了 e`x`cute 的权限 80 | - chmod u+x sleep.py 81 | - chmod 82 | - `ch`ange 改变 83 | - `mod`e 状态位 mode bits 84 | - u+x 85 | - `u`ser 当前用户组 86 | - `+x`增加 e`x`cute 的权限 87 | - sleep.py 88 | - 被改变的文件名称 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613894398541) 91 | 92 | - 这确实能执行了 93 | - 但我不想要当前路径`./` 94 | - 直接`sleep.py` 95 | - 这可能么 96 | 97 | ## 总结 98 | 99 | - 可以把 Python 文件 直接执行了 100 | - 文件头部要声明用的哪个解释器 101 | - `#!/usr/bin/python3` 102 | - 用的是 `python3` 解释 `python代码` 103 | - 修改 `py`文件 的权限 104 | - 给当前用户增加 执行`excute` 权限 105 | - chmod u+x sleep.py 106 | - 运行`./sleep.py`成功 107 | - 但我想要直接`sleep.py`就运行 108 | - 可能吗?🤔 109 | - 我们下次再说!👋 110 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/017-88353-回到开头.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 回到开头 8 | 9 | ## 回忆上次内容 10 | 11 | - 我们可以用ctrl+z把当前进程切换到后台 12 | - 用`fg`可把进程再切回前台 13 | - `ps -lf`查看进程信息 14 | - `python3 sleep.py`大概 7M 15 | - `kill -9 PID`给进程发送死亡信号 16 | - 后台可以有多个进程 17 | - `jobs`查看所有作业 18 | - `fg %1`可以把指定的进程切回前台 19 | - 运行多个`python3 sleep.py`的话,各个进程独立,各占内存 20 | - 这个切进程很好用 21 | - 不过运行进程的时候总是满屏刷 22 | - 这个能解决吗?🤔 23 | 24 | ### 回到从头 25 | 26 | - 我们从先去游乐场 27 | - `\n`是我们熟悉的 28 | - 我们先复习一下 29 | 30 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613905491259) 31 | 32 | - 这次解锁的东西叫做`\r` 33 | - `\r`的作用是回到输出头部的位置 34 | - 如果原来的字符串比新的长怎么办呢? 35 | 36 | ### return 37 | 38 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210923-1632387434289) 39 | 40 | - `\r` 只负责回到头 41 | - 其他的不管 42 | - 不要翻篇,自己尝试修改`sleep.py` 43 | - 让输出时间固定在一行 44 | 45 | ### 结合程序 46 | 47 | - 这个程序和 sleep 的结合很简单 48 | - 只需要把输出的字符串前面加上`\r` 49 | - 并且把结尾默认的 end=`\n`换成 end="" 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613906226779) 52 | 53 | - 试验成功 54 | - 真的定在那儿刷新了 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210221-1613906280764) 57 | 58 | - 就是字有点小 59 | 60 | ### 字体变大 61 | 62 | ```bash 63 | #安装figlet 64 | sudo apt install figlet 65 | #运行figlet 66 | figlet "oeasy" 67 | #利用管道使用figlet 68 | echo "oeasy"|figlet 69 | ``` 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210306-1614987482170) 72 | 73 | ### 管道原理 74 | 75 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210224-1614171987291) 76 | 77 | - `管道运算符|` 就是水管子 78 | 79 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210306-1614987482170) 80 | 81 | - 把 echo "oeasy"的输出结果 82 | - 当做 figlet 的输出参数 83 | - 再进行输出 84 | - 我们尝试把时间输出当做 figlet 的输入 85 | 86 | ### 尝试整合 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210306-1614988251250) 89 | 90 | - 运行失败了 91 | - 我想先把那个`\r`去掉 92 | - 但是还是不行 93 | - 这里面只保留输出试试 94 | 95 | ```python 96 | #!/usr/bin/python3 97 | import time 98 | localtime = time.asctime(time.localtime(time.time())) 99 | print("localtime"+localtime,end="") 100 | ``` 101 | 102 | ### 最终 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210923-1632387588817) 105 | 106 | - 输出是可以的 107 | - 但是不会刷新 108 | - 而且太大了 109 | 110 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210306-1614988479484) 111 | 112 | ### 简化输出 113 | 114 | - 把前面的`localtime` 提示去掉 115 | 116 | ```python 117 | #!/usr/bin/python3 118 | import time 119 | localtime = time.asctime(time.localtime(time.time())) 120 | print(localtime,end="") 121 | ``` 122 | 123 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210306-1614991529311) 124 | 125 | - figlet 有别的字体么? 126 | 127 | ### figlet 字体列表 128 | 129 | - f 控制字体 130 | - r、c、l 控制左中右 131 | 132 | ![Image text](https://labfile.oss.aliyuncs.com/courses/2712/show_figlet.png) 133 | 134 | ## 总结 135 | 136 | - 用`\r`可以让输出位置回到最开头的地方 137 | - 重新输出时间 138 | - 我们可以让时间在固定位置刷新了 139 | - 我想要的是大字符 140 | - 应该是 figlet 141 | - 但是希望同时还能刷新 142 | - 可能吗?🤔 143 | - 我们下次再说!👋 144 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/020-88730-电传打字机.sp.md: -------------------------------------------------------------------------------- 1 | 电传打字机的视频 2 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/029-89935-各种符号.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 各种符号 8 | 9 | ## 回忆上次内容 10 | 11 | - 首先我们了解了高亮颜色 12 | 13 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614231595731) 14 | 15 | - 然后我们了解了 `\33[38;5;XXXm` 这种定制颜色 16 | 17 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614231791978) 18 | 19 | - 甚至可以用 RGB 颜色 20 | - 如果你的终端支持的话 21 | - \33[38;2;R;G;Bmoeasy\33[0m 22 | - 每个颜色 0-5 总共 6 级 23 | - 颜色真不少了 24 | - 我想用大红色画个桃心 ♥️ 25 | - 有可能吗??🤔 26 | 27 | ### 插入符号 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614254776009) 30 | 31 | - 把字符复制下来 32 | - 然后粘到系统里面观察 33 | - ♠ ♣ ♥ ♦ 34 | 35 | ### 输出符号 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210930-1633006953917) 38 | 39 | - 这个东西是可以作为字符串里的字符输出的 40 | - 但是他的 ordinal 序号是多少呢? 41 | 42 | ### 得到序号 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210930-1633007093540) 45 | 46 | - 通过字符得到序号 ord 47 | - 反过来通过序号得到字符 chr 48 | - 他有 16 进制形式么? 49 | 50 | ### 16 进制 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210930-1633007154905) 53 | 54 | - 前面加一个\u 后面加上 16 进制数 55 | - 就可以进行输出字符 56 | - 好像是又在\转义(escape)了 57 | - 四个符号对应四组字符串 58 | - 这次的转义序列是`\u2660`等 59 | - 每个字符都可以转义么? 60 | - 不要翻篇 61 | - 自己试试 62 | 63 | ### 转义 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614257539737) 66 | 67 | - 我不要默认红 68 | - 我要纯红色的大红心 69 | - 怎么办? 70 | 71 | ### 大红心 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614261001222) 74 | 75 | - \33[38;5;196;1m] 76 | - \33[38;5;196 使用索引色 77 | - 196 = 16 + 62*5 + 61*0 + 60\*0 78 | - 红色打满 79 | - 那么红色方板应该怎么做呢? 80 | - 这个\u 到底是什么意思呢? 81 | - 好像是一种通过数字找到对应字符的方式 82 | - 这个我们见过 83 | 84 | ### ascii 85 | 86 | ```bash 87 | sudo apt install ascii 88 | ascii 89 | ``` 90 | 91 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210226-1614308669337) 92 | 93 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210226-1614308834043) 94 | 95 | - 不要翻页 96 | - 尝试一下如何用数字直接输出`oeasy`字符串 97 | 98 | ### 输出 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210226-1614308947916) 101 | 102 | - 可是这个\u 究竟是什么呢? 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210225-1614257539737) 105 | 106 | ### 查看帮助 107 | 108 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210226-1614309122402) 109 | 110 | - \nnn 8 进制 111 | - \xhh 16 进制 112 | - \uhhhh 4 位的 Unicode 编码 113 | - \uhhhhhhhh 8 位的 Unicode 编码 114 | - 那我来试试吧 115 | 116 | ### 具体试试 117 | 118 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210226-1614309367755) 119 | 120 | - 4 位 16 进制数对应一个字符 121 | - 这种对应关系就像 122 | - 7 位 2 进制数对应一个字符 123 | - 7 位 2 进制数的编码方式是 ascii 124 | - 4 位 16 进制数的编码叫什么 125 | - unicode 126 | 127 | ## 总结 128 | 129 | - 我们输出了红心 130 | - 找到了红心对应的编码 131 | - 黑红梅方都对应有编码 132 | - 这种编码叫做 unicode 133 | - 原来的叫做 ascii️ 134 | - 已经有了 ascii 135 | - 为什么会有 unicode 编码方式呢??🤔 136 | - 他俩什么关系呢? 137 | - 我们下次再说!👋 138 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/036-188456-啥是变量.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 变量定义 8 | 9 | ## 回忆上次内容 10 | 11 | - 这次回顾了一下历史 12 | - python 是如何从无到有的 13 | - 看到 Guido 长期的坚持和努力 14 | 15 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210815-1628982755102) 16 | 17 | - 再复杂的编程也是从定义变量开始的 18 | - python 如何定义变量呢? 19 | 20 | ### 变量 21 | 22 | - 想要定义变量 23 | - 首先明确什么是变量 24 | - 变量就是数值可以变化的量 25 | - 英文名称 variable 26 | - 计算机在内存中分配出空间 27 | - 用来存储这些能变的量 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210815-1628992691650) 30 | 31 | - 那比如说什么是能变的量呢? 32 | 33 | ### 坐火车 34 | 35 | - 你要买火车票的话 36 | - 具体车次是变量 37 | 38 | - 不能说每次你都买统一个车次 39 | - 其中最重要的出发地是目的地 40 | - 还有发车时间 41 | - 这都是变量 42 | 43 | - 如果搜索呢? 44 | - 你就是根据出发地 目的地 45 | - 把所有经过这段的车次对象筛选出来 46 | - 然后 用户选择自己的车次 购买车票 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210815-1628992722514) 49 | 50 | - 当然你自己作为购票主体 51 | - 个人信息也是变量 52 | - 任何系统其实都是有各种各样的变量 53 | 54 | ### 教务系统 55 | 56 | - 教务系统 57 | - 这里面有什么变量 58 | - 课程是变量 59 | - 一个课程有自己的编号 60 | - 有自己的时间 地点 61 | - 学员等等信息 62 | - 就像车次一样 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210815-1628992994542) 65 | 66 | - 这些变量都可以变 67 | - 修改时间 68 | - 把选修变成必修 69 | - 课程加人减人 70 | - 就连游戏其实也是变量组成的 71 | 72 | ### 格斗游戏 73 | 74 | - 血量 就是可以变化的 75 | - 挨打就降低自身血量 76 | - 打人就降低对方血量 77 | - 谁没血了 谁就输了 78 | - 还有什么变量? 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210815-1628993211259) 81 | 82 | - 攒的这个豆是变量 83 | 84 | - 你有多少 power 85 | - 多少个豆 86 | - 可不可以发大招 87 | - 这都是可以变的 88 | - 发个大招就少一个豆 89 | 90 | - 你选的人也是个变量 91 | 92 | - 选谁不选谁你说了算 93 | - 不是说写死 Hard Code 了 94 | - 只能选择某个人 95 | 96 | - 当前舞台是变量 97 | - 舞台上的位置也是变量 98 | - 会随着两个人的移动 有所变化 99 | - 接收到的键盘输入信号是变量 100 | 101 | - 根据这个不同的输入 102 | - 可以有不同的操作 103 | 104 | - 这些东西都在内存里面 105 | - 随时可以变化的 106 | - 就是变量 107 | 108 | ## 总结 109 | 110 | - 这次讲了什么是变量 111 | - 可以变的量就是变量 112 | - 各种系统、游戏就是由变量所组成的 113 | - 那我们能否真正定义一个变量呢?🤔 114 | - 我们下次再说!👋 115 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/044-188727-注释说明.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 主控程序 8 | 9 | ## 回忆上次内容 10 | 11 | - 使用了版本控制 git 12 | - 制作备份 13 | - 进行回滚 14 | - 尝试了嵌套的控制结构 15 | - 层层控制 16 | - 不过非到不得以 17 | - 尽量不要太多层次的嵌套 18 | - 虽然这样从顶到底 19 | - 含义明确 20 | - 但是扁平难道就不能含义明确么? 21 | - 我可以做点什么,让程序更加明确呢?🤔 22 | 23 | ## 注释 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629073134303) 26 | 27 | - 其实我们这个 input.py 第一行就是注释 28 | - 可以把这句话剪切到 main.py 开头 29 | - 凡是#开头的行 30 | - 都不会被执行 31 | - 都是注释语句 32 | 33 | ### 行中注释 34 | 35 | - 除了行首的注释之外 36 | - 行中是否可以有注释呢? 37 | - 试试 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629073325120) 40 | 41 | - #号后面的变颜色的部分 42 | - 就是注释了 43 | - 如果注释在字符串里面呢? 44 | 45 | ### 尝试一下 46 | 47 | ```python 48 | print("hi # there") 49 | ``` 50 | 51 | - 在字符串中的 #Pound 52 | - 不会被当做注释 53 | - 这个注释还有什么用处呢? 54 | 55 | ### 判别编码格式 56 | 57 | - 如果#注释中存在字符串匹配下面的表达式 58 | - ^[\t\v]_#._?coding[:=][\t]\*([-_.a-zA-Z0-9]+) 59 | 60 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629090337959) 61 | 62 | - 这是在 pep263 中的规定的 63 | - https://www.python.org/dev/peps/pep-0263/ 64 | - 编码方式 encoding 65 | 66 | ```python 67 | #!/usr/bin/python 68 | # vim: set fileencoding=utf-8 : 69 | ``` 70 | 71 | - 第一句 72 | - 是告诉 shell 的 73 | - 用什么二进制文件打开这个当前文件 74 | - 第二句 75 | - 是告诉 vim 的 76 | - 当前文件保存用的编码格式 77 | - 这样不但规定了 python 源文件的编码格式 78 | - ^[\t\v]_#._?coding[:=][\t]\*([-_.a-zA-Z0-9]+) 79 | - 还设置了 vim 的文件保存格式 80 | - 除此之外注释还可以怎样用么? 81 | 82 | ### 搜索注释 83 | 84 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629073456147) 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629073474197) 87 | 88 | - 原来用的都是单行注释 89 | - 现在有一种多行注释 90 | 91 | ### 多行注释 92 | 93 | - 用三个双引号或者三个单引号就可以做多行注释 94 | - 回忆一下 print 的时候三个引号可以原样输出 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629091023751) 97 | 98 | - 现在三引号里面的东西就是注释 99 | - 注释中说明了 100 | - 上面输入的是苹果数量 101 | - 下面是香蕉数量 102 | - 虽然注释很多但是不会影响程序的运行速度 103 | - 只是增加可读性而已 104 | 105 | ## 总结 106 | 107 | - 这次了解了注释 108 | - 注释是为了让程序更可读 109 | - 注释不会影响程序运行速度 110 | - 注释分为两种 111 | - 单行的 - # 112 | - 多行的 - 三个`"`或`'` 113 | - 多行注释还有什么特殊作用么?🤔 114 | - 下次再说!👋 115 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/045-188787-帮助手册.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 帮助手册 8 | 9 | ## 回忆上次内容 10 | 11 | - 上次了解了注释 12 | - 注释是为了让程序更可读 13 | - 注释不会影响程序运行速度 14 | - 注释分为两种 15 | - 单行的 - # 16 | - 多行的 - 三个`"`或`'` 17 | - 多行注释还有什么特殊作用么?🤔 18 | 19 | ### 生成帮助手册 20 | 21 | ```bash 22 | ls 23 | python3 -m pydoc main 24 | ``` 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629096040358) 27 | 28 | - 可以在命令行中查看到 main.py 的帮助手册 29 | 30 | ### 增加描述说明 31 | 32 | ```bash 33 | #!/usr/bin/python3 34 | #vim: set fileencoding=utf-8 35 | ''' 36 | 关于当前模块的说明 37 | ''' 38 | ``` 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629095378760) 41 | 42 | - 写完之后保存 43 | - 注意已经设置了编码格式 44 | - 然后重新生成 main.html 45 | - `python3 -m pydoc main` 46 | 47 | ### 刷新帮助手册 48 | 49 | - `python3 -m pydoc main` 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629097540086) 52 | 53 | ### 生成网页 54 | 55 | - `python3 -m pydoc -w main` 56 | - 对于 main.py 生成帮助网页 57 | - 帮助文件叫做 main.html 58 | - 帮助文件 就生成在当前的 apple 文件夹 59 | 60 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629094604540) 61 | 62 | ### 打开帮助网页 63 | 64 | - 然后用火狐打开这个网页文件 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629095572322) 67 | 68 | - 左上角是两个链接 69 | - 当前文件夹索引 70 | - 当前 html 对应的 py 文件 71 | - 下面是 main 里面的内容 72 | - 相关的三引号描述 73 | - 再下面是三个链接 74 | - 是 main.py 引入的三个 module 75 | - 目前这三个模块的链接都无法打开 76 | - 因为没有生成 77 | 78 | ### 更新其他模块帮助文件 79 | 80 | - 修改三个 py 文件的内容 81 | - 其中 input 本来就有三引号注释 82 | - `python3 -m pydoc input` 83 | 84 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629098034501) 85 | 86 | - 只有顶端的三引号注释才被写入模块帮助 87 | - 下面的三引号注释被忽略 88 | 89 | ### 修改模块注释 90 | 91 | - 修改 input.py 92 | - 保存并写帮助网页 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629098243809) 95 | 96 | - 任务完成 97 | - 但并没有特别提高可读性 98 | 99 | ### python3 在线 100 | 101 | - python3 本身有在线的文档 102 | - 在http://docs.python.org 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210816-1629098501853) 105 | 106 | ## 总结 107 | 108 | - 这次了解了帮助手册的生成 109 | - 在开头的三引号注释可以帮助生成文档 110 | - 文档可以写成网页 111 | - python3 本身也有在线的帮助手册 112 | - 但目前的网页并没有解决程序可读性的问题 113 | - 有什么方法让程序更可读么?🤔 114 | - 下次再说!👋 115 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/051-188926-键盘输入.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 键盘输入 8 | 9 | ## 回忆上次内容 10 | 11 | - 这次开始了真正的运算 12 | - 加法运算 13 | - 加法运算由运算符和操作数组成 14 | - 加法操作实际是 cpu 的加法指令 15 | - 加法的结果赋给一个接收变量 16 | - 更复杂的运算 17 | - 也可以做 18 | 19 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629244632089) 20 | 21 | - 我想输入被加数和加数 22 | - 然后让电脑计算 23 | - 可以么?🤔 24 | 25 | ## 键盘输入 26 | 27 | - 键盘输入这个事情我们干过 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629253255152) 30 | 31 | #### 编写代码 32 | 33 | - 不要想着一下子就搞成 34 | - 时刻进行小规模测试 35 | 36 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629253551517) 37 | 38 | #### 继续修改 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629253708258) 41 | 42 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629253719878) 43 | 44 | - 这个由你来修改 45 | 46 | #### 思考 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211105-1636107401653) 49 | 50 | - input 返回的是字符串 51 | - 后来做的加法是字符串相加 52 | - 所以得到"38" 53 | - 现在需要把字符串转化为整数 54 | 55 | ## 转化格式 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211105-1636107255449) 58 | 59 | - 注意变量名要明确 60 | - str 类型的变量要标记为 s 开头,而不是 i 开头 61 | - 保存并运行 62 | 63 | #### 运行结果 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629254005006) 66 | 67 | - 输入 3,8 68 | - 测试成功 69 | - 但是需要考虑到容错 70 | - 加强程序的鲁棒性 71 | - 鲁棒性也叫健壮性 robustness 72 | - 说俗话就是比较皮实 73 | - 怎么折腾都玩不坏的意思 74 | - 错了不怕程序能包容着 75 | - 不至于不让玩了 76 | - 那具体怎么容错呢? 77 | 78 | ## 异常处理 79 | 80 | - 使用 `try:...except:...` 81 | - 进行异常处理 82 | - 当 try 代码块内程序执行触发异常时 83 | - python 会自动跳至处理器 84 | - 即 except 分句下面的代码块去运行 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211105-1636116090082) 87 | 88 | #### 容错 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629254236509) 91 | 92 | - 这里把 iSum 单独拎出来 93 | - 当做一个变量 94 | - 为的是程序明确可读 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629254245690) 97 | 98 | - 但是如果出了问题 99 | - 我不知道问题所在位置 100 | - 是左边操作数 101 | - 还是右边操作数 102 | 103 | #### 更明确 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629254500972) 106 | 107 | - 这样就更加明确了 108 | - 出了问题可以知道是哪边的问题 109 | 110 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210818-1629254511255) 111 | 112 | ## 总结 113 | 114 | - 这次主要是完成加法程序 115 | - 输入加数和被加数生成求和公式和结果 116 | - 先构思 117 | - 一点点深入 118 | - 不断进行修改 119 | - 可以让程序自动生成随机数 120 | - 并且相加吗? 121 | - 下次再说 👋 122 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/057-189359-补码系统.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 负数表示 8 | 9 | ## 回忆 10 | 11 | - 负数的表示 12 | - 从零为中心 13 | - 一半是零和正数 14 | - 另一半是负数 15 | - 但是具体到 1,2,4,8 个字节 16 | - 到底分别是如何表示负数的呢?🤪 17 | 18 | ### 反码 19 | 20 | - 首先了解反码的概念 21 | - 所谓反码就是把原来的数 0 变 1、1 变 0 22 | - 这样导致源码加反码一定等于全 1 23 | - 而全 1 再加 1 一定导致刚好溢出 24 | - 所以源码和(反码加一)在一起求和一定刚好溢出 25 | - 那么这个(反码加一)其实就是补码 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629382900303) 28 | 29 | - 001 的反码为 110 30 | - 001 的补码为 111 31 | 32 | ## 补码 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629382900303) 35 | 36 | - 这个系统叫做补码系统 37 | - 补码有点像相反数 38 | - 补上之后就湮灭了 39 | - 补上就彻底清净了 40 | 41 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629382929415) 42 | 43 | ### 1 个 byte 字节 44 | 45 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629382996018) 46 | 47 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383003494) 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383011297) 50 | 51 | ### 相反数 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383099351) 54 | 55 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383109004) 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383118574) 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383128441) 60 | 61 | ### 计算 62 | 63 | **$5+(-3)$:** 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383157064) 66 | 67 | - 对应 68 | 69 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383228638) 70 | 71 | - 循环 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383253516) 74 | 75 | - 原反补码 76 | 77 | - 正数的原反补都一样 78 | 79 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383328950) 80 | 81 | - 负数补码 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383366199) 84 | 85 | - 负数符号位是 1 86 | - 其余变反得到反码 87 | - 反码加一得到补码 88 | 89 | ### 不同类型 90 | 91 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383634284) 92 | 93 | - 不同类型对应不同的长度 94 | - 但是整体上来说 95 | - 补码的规律没有变 96 | 97 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210819-1629383588594) 98 | 99 | ## 总结 100 | 101 | - 补码系统在计算机领域通用 102 | - 负数在计算机中自动用补码形式存储 103 | - 也可以直接参与加减计算 104 | - 除了加减之外还有乘除运算 105 | - 乘除是如何进行的呢?🤪 106 | - 下次再说 👋 107 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/058-188930-乘法运算.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 乘法运算 8 | 9 | ## 回忆 10 | 11 | - 补码系统在计算机领域通用 12 | - 负数在计算机中自动用补码形式存储 13 | - 也可以直接参与加减计算 14 | - 除了加减之外还有乘除运算 15 | - 乘除是如何进行的呢?🤪 16 | - 下次再说 👋 17 | 18 | ## 乘法 19 | 20 | - 乘法本质上是连加 21 | - 符号是 \* 22 | - shift + 8 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629431338975) 25 | 26 | - 左右操作数都是整数 27 | - 乘法运算的结果也是整型变量 28 | - 这就是整数的乘法 29 | - 我们可以试试随机数的乘法 30 | 31 | #### 随机乘法 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210915-1631710100605) 34 | 35 | - 这个东西能否简化一下呢? 36 | 37 | #### 简化 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210915-1631710408500) 40 | 41 | - 这样就可以只引入这个 randint 这个函数 42 | - 而无需引入整个 random 这个模块 module 43 | - 还可以再简化么? 44 | 45 | #### 再简化 46 | 47 | - 不但可以引入这个函数 48 | - 还可以给他起一个别名 r 49 | - 这样写起来就更简单了 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210915-1631710523169) 52 | 53 | - 我们这次其实主要研究乘法 54 | - 来看看加减乘除的优先级 55 | 56 | ## 乘法和加减法优先级 57 | 58 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629431588146) 59 | 60 | - 先乘除后加减 61 | - 有括号的要优先 62 | 63 | #### 字符串的乘法 64 | 65 | - 字符串可以和整型数字相乘 66 | - 乘积的类型还是字符串 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629431724087) 69 | 70 | - 如果两个字符串不能相乘 71 | - 可以把能转化为整型数字的字符串转化了 72 | - 然后再相乘 73 | - 如果你还不死心... 74 | 75 | #### 绝望 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211103-1635946827393) 78 | 79 | - 字符串要不就没有乘法 80 | - 有乘法只能和整型相乘 81 | 82 | ## 字符串乘法应用 83 | 84 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629431868683) 85 | 86 | - `"h" \* 3` 87 | - 这样可以要 3 个 2 字节的有符号整型变量 88 | - 解码上可以用么呢? 89 | 90 | #### 解码 91 | 92 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629432099059) 93 | 94 | - 这里面也可以用字符串乘法 95 | 96 | #### 翻番 97 | 98 | - 这个乘法翻着跟头往上涨啊 99 | - 根本就不是加法能够想象的 100 | 101 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629433073076) 102 | 103 | - 超越了我的认知 104 | 105 | #### 这到底是什么类型呢 106 | 107 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210817-1629170347485) 108 | 109 | - 居然是整型 110 | - 而且还能进行运算 111 | 112 | ## pack 他试试 113 | 114 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629433313615) 115 | 116 | - 64bit 位 cpu 最大也就是 q 了 117 | 118 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629433361625) 119 | 120 | - 果然超了范围了 121 | - 但范围是多少呢? 122 | 123 | #### 范围 124 | 125 | - 引入 sys 包 126 | - sys 代表 system 127 | - 意思是系统 128 | - 这里可以得到和系统相关的一些内容 129 | - 我们现在用的是 ubuntu 系统 130 | - 查到无符号 8 字节整型数字 131 | - 最大也就是 9223372036854775808 132 | 133 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629433426170) 134 | 135 | - 在边缘上再加一 136 | - 居然加上去了 137 | - 我很困惑 138 | - 但他真的发生了 139 | 140 | ## 总结 141 | 142 | - 这次看了乘法 \* 143 | - 整数可以乘整数 144 | - 整数可以乘字符串 145 | - 乘法结果很大也不会崩溃 146 | - 有加就有减 147 | - 互为逆运算 148 | - 乘法的逆运算是什么呢?🤪 149 | - 下次再说 👋 150 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/059-189507-除法运算.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 除法运算 8 | 9 | ## 回忆 10 | 11 | - 这次看了乘法 \* 12 | - 整数可以乘整数 13 | - 整数可以乘字符串 14 | - 乘法结果很大也不会崩溃 15 | - 有加就有减 16 | - 互为逆运算 17 | - 乘法的逆运算是什么呢?🤪 18 | 19 | ## 除法 20 | 21 | - 加减乘除 22 | - 乘法的逆运算是除法! 23 | - 除法就是 / 24 | - 上来就除! 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629441598234) 27 | 28 | - 除法分成 29 | - 除不尽,也叫不能整除 $3/8$ 30 | - 除得尽,也叫能整除,如 $8/8$ 31 | - 不管除不除得尽 32 | - 结果类型都是 float 33 | - 是一个浮点类型 34 | - 整除整除 35 | - 如果就想要除出来得到一个整数 36 | - 应该怎么办呢 37 | 38 | ### 整除 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629441669502) 41 | 42 | - 整除运算符就是 2 个 / 43 | - 得到的结果是商 44 | - 商就是被除数里面有几个除数 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629442470499) 47 | 48 | - 8 整除以 3 商 2 49 | - 或者说 3 整除 8 商 2 50 | - 除法优先级如何呢 51 | 52 | ### 优先级 53 | 54 | - 优先级 55 | - 先乘除 56 | - 后加减 57 | - 有括号的要优先 58 | - 从左到右计算 59 | - 这是小学数学运算的优先级 60 | - 也是 c 语言中的优先级和结合序 61 | - 也是 python 的 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210904-1630724978238) 64 | 65 | - 除法和整除不同 66 | - 除法的结果是小数 67 | - 整除的结果是整数 68 | - 所以叫整除么 69 | - 这不是废话么? 70 | - 整除后 71 | - 商的类型是一个整数 72 | - 商之外的余数是多少呢? 73 | 74 | ## 取余 75 | 76 | - 余数就是被除数除了商的那部分之外剩下的 77 | - remain 就是剩下 78 | - 取余运算符是 % 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629442666338) 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629441842649) 83 | 84 | - 8 除以 3 商 2 余 2 85 | - 3 除以 8 商 0 余 3 86 | - 有没有一次就可以得到商和余数的办法? 87 | 88 | ### divmod 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629442969473) 91 | 92 | - 除此以外 93 | - 还可以用内置的 divmod 函数来进行整除和取余 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629443036360) 96 | 97 | - 得到的结果是一个元组 tuple 98 | 99 | ### 元组 tuple 100 | 101 | - 元组就是一组数字 102 | - 元组可以给变量进行赋值 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629443122323) 105 | 106 | ### divmod 结果 107 | 108 | - divmod(3,8) 得到一个元组 109 | 110 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629443169757) 111 | 112 | - 可以为商和余数赋值 113 | - 字符串可以做除法么 114 | 115 | ## 字符串除法 116 | 117 | - 试一试 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629443381137) 120 | 121 | - 字符串不能做除法 122 | - 除非转化为数字 123 | - 除以 0 会如何呢?🤪 124 | 125 | ### 除数为 0 126 | 127 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210820-1629443446252) 128 | 129 | - 会报错 130 | - 出现一个 ZeroDivisionError 131 | 132 | ### 总结 133 | 134 | - 这次看了除法 / 135 | - 整数除以整数,可以得到 136 | - 商 // 整除运算符 137 | - 余数 % 取余数运算符 138 | - 除数不能为零 139 | - 那如果除数是小数呢?🤪 140 | - 下次再说 👋 141 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/065-189506-乘方运算.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 乘方运算 8 | 9 | ## 回忆 10 | 11 | - 上次深入了整型的细节 12 | - python 把复杂的逻辑都留给自己 13 | - 对我们提供一个近乎无限大的整型变量 14 | - 可以做绝对精确的计算 15 | - 还不会溢出 16 | - 很厉害 17 | - python 还可以用千分位符分割整数和小数 18 | - 这有利于观察很大的数字 19 | - 这些很大的数字都怎么来的? 20 | - 加法和乘法都比较慢 21 | - 有乘方运算吗??🤪 22 | 23 | ### 搜索乘方 24 | 25 | - 什么不会就搜什么 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629513613166) 28 | 29 | #### 具体运算 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629513691844) 32 | 33 | - 两种方法都可以计算出乘方的值 34 | - 前面的是底数 35 | - 后面的是指数 36 | 37 | #### 其他进制形式 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629544273081) 40 | 41 | ### 科学计数法 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629545434702) 44 | 45 | - 科学计数法属于浮点型数字 46 | - 如果超过 $1e308$ 就会报错 47 | - 科学计数法支持其他进制么? 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629545703260) 50 | 51 | - 这显然是按照整型变量进行计算的 52 | - 单个科学计数法支持其他进制么 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629545846579) 55 | 56 | - 显然不支持 57 | - 如果非要使用一定要转化之后进行使用 58 | - 那我可以把最大的浮点型转化为整数,然后计算么? 59 | 60 | ### 转成整型 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629514227901) 63 | 64 | - 服务器愣住了 😵‍💫 65 | 66 | #### 优先级 67 | 68 | - 原来的优先级 69 | - 从左到右计算 70 | - 先乘除 71 | - 后加减 72 | - 有括号的要优先 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629546051490) 75 | 76 | - 乘方运算优先级高于乘除运算 77 | - 除了优先级之外 78 | - 还需要注意类型转化 79 | 80 | #### 隐式转化 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211101-1635759274938) 83 | 84 | - 浮点数和整数运算 85 | - 属于混合类型的运算 86 | - 其实系统要先把整型转化为浮点型 87 | - 然后再计算 88 | - 这个过程我们对我们隐身 89 | - 所以也叫隐式转化 90 | - 有隐式就有显式 91 | 92 | #### 显示转化 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211003-1633224050949) 95 | 96 | - 浮点型和整型运算 97 | - 默认是把整型隐式转化为浮点型 98 | - 也可以把浮点型显示转化为整型 99 | - 用 int() 函数强制显示转化完成 100 | - 这样就是两个整型变量的加法了 101 | 102 | #### 感恩 103 | 104 | - 这就是 python 之禅的作者 Tim Peters 105 | - 最初为 python 做出的进化 106 | 107 | ## 总结 108 | 109 | - 乘方运算符是\*\* 110 | - 优先级高于乘除 111 | - 浮点型和整型都支持 112 | - python 对于整型有着特别的优化 113 | - 不同类型数值之间运算时 114 | - 默认是隐式转化 115 | - 也可以强制显示转化 116 | - 乘方运算有逆运算么?🤪 117 | - 下次再说 👋 118 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/066-189668-开方和对数运算.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable^checker: true 5 | --- 6 | 7 | # 开方和对数运算 8 | 9 | ## 回忆 10 | 11 | - 乘方运算符是 $**$ 12 | - 优先级高于乘除 13 | - 浮点型和整型都支持 14 | - python 对于整型有着特别的优化 15 | - 不同类型数值之间运算时 16 | - 默认是隐式转化 17 | - 也可以强制显示转化 18 | - 乘方运算有逆运算么?🤪 19 | 20 | #### 开方 21 | 22 | - 平方是 $2$ 次方 23 | - 开方是 $0.5$ 次方 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629550986223) 26 | 27 | - 对 $-1$ 开方会如何? 28 | 29 | #### 莫名其妙 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629553545016) 32 | 33 | - 没有报错?! 34 | - 虽然不理解 35 | - 但生活要继续 36 | - 看看立方 37 | 38 | ### 立方 39 | 40 | - 三次方简称立方运算 41 | - 求三次立方根是他的逆运算 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629551128823) 44 | 45 | - $2$ 的 $3$ 次方是 $8$ 46 | - $8$ 的立方根是 $2$ 47 | - 如果是求倒数可以做么? 48 | 49 | #### 倒数运算 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629551190001) 52 | 53 | - $-1$ 次方就是倒数 54 | - $-2$ 次方就是平方倒数 55 | - $-0.5$ 次方就是平方根倒数 56 | 57 | ## 分数 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629551648570) 60 | 61 | - 三分之一和九分之一并不精确 62 | - 有什么办法吗? 63 | 64 | #### 转化 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629551787818) 67 | 68 | - 一种是控制分母大小 69 | - 另一种是分数当做底数 70 | - 哪个好?为什么? 71 | 72 | #### 逆运算 73 | 74 | - 乘方和开方运算都是指数运算 75 | - 指数运算有没有逆运算? 76 | - python 能做吗? 77 | 78 | #### 搜索 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629552061600) 81 | 82 | #### 尝试 83 | 84 | - $log_24$ = 2 85 | - log 以 $2$ 为底 $4$ 的对数 $= 2$ 86 | 87 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629552214709) 88 | 89 | - 结果是一个浮点型变量 90 | - 两个参数都需要写么 91 | 92 | ## ln 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629552459097) 95 | 96 | - 猜测第二个参数默认为 e 97 | - $log(x) = log_e(x)=ln(x)$ 98 | 99 | #### 帮助 100 | 101 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629552508796) 102 | 103 | - 查询帮助手册 104 | - 验证成功 105 | - 对数运算经常出现以 10 为底 106 | 107 | **$log10$:** 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629552782290) 110 | 111 | - $log10$ 以 $10$ 为底 112 | - $log2$ 以 $2$ 为底 113 | 114 | ## 对数运算 115 | 116 | - $log_x(y) = lg2/lg3 = ln2/ln3$ 117 | 118 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629553006210) 119 | 120 | #### 使用分数 121 | 122 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210821-1629553384381) 123 | 124 | - 看起来分数是先被转化为浮点数 125 | - 然后进行处理的 126 | - 结果也是浮点数 127 | 128 | ### 总结 129 | 130 | - 平方运算的逆运算是开平方 131 | - 指数为 $2$,平方 132 | - 指数为 $0.5$,开平方 133 | - 指数为 $-1$,取倒数 134 | - 平方和开平方都属于指数运算 135 | - 指数运算的逆运算是对数运算 136 | - 不过有个问题 137 | - $-1$ 的平方根好像是一个乱码? 138 | - 如何理解?🤔 139 | - 下次再说 👋 140 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/070-189725-读取细节.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 读取文件 8 | 9 | ## 回忆 10 | 11 | - 上次研究了操作文件 12 | - 操作文件流分成三步 13 | - 打开文件流 14 | - 读取文件流 15 | - 关闭文件流 16 | - 读写文件 17 | - 这文件流太猛了 18 | - 一下子全出来了 19 | - 咱能细水长流么?🤔 20 | 21 | ### 重温文件流操作流程 22 | 23 | 1. 打开文件流 24 | - f = open("oeasy.txt") 25 | 2. 读取文件 26 | - f.read() 27 | 3. 关闭文件流 28 | - f.close() 29 | 30 | - 上次的问题是文件流太猛 31 | - 一股脑全流出来了 32 | - 这次想要细水长流 33 | 34 | #### readline 35 | 36 | - 可以让文件流一行一行流出来 37 | 38 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629686502080) 39 | 40 | - 但是结尾那个`\n`怎么还原样显示呢? 41 | - 不应该是转移成回车么? 42 | - 读出来的是什么类型的数据呢? 43 | 44 | ### 赋值 45 | 46 | - 查看 readline 函数返回的类型 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629686671061) 49 | 50 | - 是一个字符串 51 | - 把他赋给一个变量 s 52 | - 然后输出 s 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629686719889) 55 | 56 | - 只有在 print(s)的时候 57 | - `\n`才会被翻译成转义序列 58 | - 当做回车进行输出 59 | 60 | #### 重写 61 | 62 | - 重写`oeasy.txt` 63 | - 里面只写`oeasy` 64 | - 然后让在游乐园里面 65 | - 尝试和文件内容互动 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629686960663) 68 | 69 | - 为了避免缓存问题 70 | - 重启一下游乐园 71 | 72 | ### 互动 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629687267341) 75 | 76 | - 重启游乐园之后 77 | - 打开文件 78 | - 读取文件第一行赋给 s_name 79 | - s_name.replace("\n","") 80 | - replace 的意思是替换 81 | - 把 s_name 中的 `\n` 替换为 `空串` 82 | - 然后就可以根据文件内容进行输出了!🤩 83 | - 更换一下文件内容试试 84 | 85 | #### 更换 86 | 87 | - 重进游乐场 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629687496302) 90 | 91 | - 试验成功 92 | - 不要忘记关闭文件流 93 | - 这种把文件写死在程序源代码的方法叫做 hardcode 94 | - 很硬的把变量写死了 95 | - 这不是一个好主意 96 | - 可以来点交互 97 | - 动态决定打开哪个文件 98 | - 怎么交互呢? 99 | 100 | ### 输入 101 | 102 | - 如果我想通过键盘输入需要读取的文件名 103 | - 回忆一下键盘输入 104 | - input() 105 | - 把返回值赋给一个 s_file 变量 106 | 107 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629687765120) 108 | 109 | - 如果输入的是一个不存在的文件呢? 110 | - 比如当前目录并不存在的一个叫做 o9z.txt 的文件 111 | 112 | #### 报错 113 | 114 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629687908516) 115 | 116 | - 找不到这个文件`o9z.txt` 117 | - 报了 Error 118 | - FileNotFoundError 119 | - 没有当然找不到 120 | - 不过可能这 o9z.txt 不在当前目录 121 | - 在别的目录 122 | - 我还想打开他那怎么办呢? 123 | 124 | ### 总结 125 | 126 | - 这次研究了细水长流 127 | - 读取文件流 128 | - 一行一行流出来 129 | - 而且可以通过 input()函数 130 | - 动态选择具体打开的文件 131 | - 如果我要选择的文件不在当前目录怎么办呢?🤔 132 | - 下次再说 👋 133 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/073-190199-二进制模式.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 二进制模式 8 | 9 | ## 回忆 10 | 11 | - 上次我们真的写了文件 12 | - 方法是开启写模式 13 | - 现在已知两个模式 14 | - 读 15 | - 写 16 | - 读的时候还可以 17 | - seek 到指定的位置 18 | - tell 报位置 19 | - 但是 seek 的相对模式不支持 20 | - 需要切换到二进制模式 21 | - 怎么弄呢?🤔 22 | 23 | ### mode 24 | 25 | - mode 模式设置为 rb 26 | - r - read - 读 27 | - b - binary - 二进制 和 text 文本相对 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629704619215) 30 | 31 | - 这样流头就可以自由地相对运动了 32 | - 返回值变成了字节流 33 | - b"222\n" 34 | - whence 除了相对于头、相对于当前 35 | - 还有一种相对于尾的模式 36 | - 怎么用呢? 37 | 38 | #### seek 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629704866829) 41 | 42 | - whence = 2 是从尾部计算 43 | - -3 就是倒数第 3 个字符 44 | - 返回值也是字节流 45 | 46 | ### 可以用二进制写么 47 | 48 | - 先查一下帮助 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629705072165) 51 | 52 | - 判断如果要"wb"的话就会 truncate 原始文件 53 | - 虽说如此 54 | - 我还是想试试 55 | 56 | #### wb 57 | 58 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629705293478) 59 | 60 | - 用二进制写模式打开文件 61 | - 可想而知,原始文件没了 62 | - 写模式不能读 63 | - 二进制写的时候不能直接写字符串 64 | - 而需要写二进制字节流 65 | - 写完了 66 | - 我想读 67 | 68 | ### 读模式 69 | 70 | - 打开模式肯定不能是写模式 71 | - 一写就把原来的都清空了 72 | - 用默认的 r 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629705667613) 75 | 76 | - 可以看到原来的 3 的位置 77 | - 第一个字节的位置为 0 78 | - 然后是 1,2,3 79 | - `111\n222\n333` 80 | - 从第一个`\n` 81 | - 开始重写 82 | - 写了 3 个 a 83 | 84 | #### 观察文件 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629705916773) 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629705979223) 89 | 90 | - 读写成功 91 | 92 | ### 总结 93 | 94 | - 这次我们用二进制写了文件 95 | - 写的时候也可以 seek 调整流头 96 | - 这二进制写和字符写好像也差不多 97 | - 为什么要有这么一个二进制写的方式呢?🤔 98 | - 下次再说 👋 99 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/077-190650-拷贝程序.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 拷贝程序 8 | 9 | ## 回忆 10 | 11 | - python 的成功不是偶然的 12 | - 新的嫩芽一定是发于陈腐的腐殖质 13 | - 他吸取了 ABC 好的一面 14 | - 也吸取了 shell 和 c 好的一面 15 | - 他可以很方便地操作文件 16 | - 其实我们也可以做一个拷贝程序?🤔 17 | - 先去游乐场 18 | 19 | ### 拷贝流程 20 | 21 | - 拷贝其实很简单 22 | - 就是先读后写么 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896158383) 25 | 26 | - 我们都选择使用二进制的方式读写 27 | - 因为这样有些不属于文本的内容也可以读写到 28 | 29 | ### 系统验证 30 | 31 | - 原来系统没有 o2z.txt 32 | - 现在有了 33 | - 读出来确实是 oeasy.txt 里面的内容 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629895846371) 36 | 37 | ### 添加参数 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896323883) 40 | 41 | - 注意 argv 里面 42 | - 第 0 个是当前 py 文件 43 | - 后面的两个是 44 | - from 的源文件 45 | - to 的目标文件 46 | - 换一个比较复杂的路径呢? 47 | 48 | ### 绝对路径 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896465678) 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896473247) 53 | 54 | - /proc/net/tcp 55 | - 是当前所有的 tcp 链接 56 | - 读写都是 ok 的 57 | - 可以用 input 来动态输入么? 58 | 59 | ### 动态输入 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896783213) 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629896792145) 64 | 65 | - 读写成功 66 | 67 | ### 读写大文件 68 | 69 | - 尝试把/usr/bin/python 拷贝到当前目录 70 | - cp /usr/bin/python ./p 71 | - cp 的意思是拷贝 72 | - cp 的语法是`cp 源文件 目标文件` 73 | - 源文件是`/usr/bin/python` 74 | - 目标文件是`./p` 75 | - `./`是当前目录 76 | - `p`是文件的名字 77 | - 取名叫 p 78 | - 然后尝试运行 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629897467005) 81 | 82 | ### 同时写 83 | 84 | - 但是如果是两个文件同时写呢? 85 | - 开两个终端 86 | - 分别运行 87 | - 会如何呢? 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629897769088) 90 | 91 | ### 执行结果 92 | 93 | - 后执行的结果为准 94 | - 前面的被 truncate 了 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629897891034) 97 | 98 | - 如果修改源代码 99 | - 能否让某文件同时用"wb"模式被 open 两次呢? 100 | 101 | ### 修改源代码 102 | 103 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629898216633) 104 | 105 | - 第 9 行加了一句话 106 | 107 | ### 同时运行 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629898241242) 110 | 111 | ### 运行结果 112 | 113 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210825-1629898277141) 114 | 115 | - 可以同时打开 116 | - 显然还是把第一次拷贝的东西给覆盖掉了 117 | 118 | ### 总结 119 | 120 | - python 拷贝程序运行比较顺利 121 | - 但是两个进程同时写的同一个文件可能有问题 122 | - 比如两个一起写 123 | - 后面就会覆盖前面 124 | - 怎么办呢?🤔 125 | - 下次再说 👋 126 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/079-190654-追加写入.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 追加写入 8 | 9 | ## 回忆 10 | 11 | - 上次我们搞的是文件读写的锁定 12 | - 靠的是 fcntl 这个包 13 | - 可以有 14 | - 分享锁 LOCK_SH 15 | - 独享锁 LOCK_EX 16 | - 阻塞标志 LOCK_NB 17 | - 取消锁 LOCK_UN 18 | - 不过得到锁了之后 19 | - 也是在原始基础上把原来的内容抹掉了 20 | - 我想要原来的都在 21 | - 新来的追加进去 22 | - 可以么? 23 | - 去哪里搜呢 🤔 24 | - 问你呢!!! 25 | 26 | ### 搜索 27 | 28 | - 先去 open 那里找找思路 29 | - help(open) 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975180837) 32 | 33 | - 感觉就是 a 34 | - appending 模式 35 | 36 | ### ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975158377) 37 | 38 | ### 构思 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975313736) 41 | 42 | - 看起来确实是 append 上去了 43 | - 原来的东西不会 truncate 44 | - 但是一会儿 w 一会儿 r 45 | - 切来切去好麻烦 46 | - 可以又 w 又 r 么? 47 | 48 | ### 搜索 49 | 50 | - help(open) 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975180837) 53 | 54 | - 感觉就是+ 55 | 56 | ### 实验 57 | 58 | - 继续书写 59 | - 有种势如破竹的感觉 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975528341) 62 | 63 | - 那我可以把 a 当做 w 来用么? 64 | 65 | ### 尝试 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975611673) 68 | 69 | - 想要先清空 70 | - 然后再写 71 | - 好像失败了 72 | - 为什么呢? 73 | 74 | ### 清空位置 75 | 76 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629975904653) 77 | 78 | - 这样我们就用 a 干了 w 的事情 79 | - 那我们能用 w 干 a 的事情吗? 80 | 81 | ### 尝试 82 | 83 | - 把原来的先读出来 84 | - 然后先把读出来的写进去 85 | - 再写新的 86 | - 这不就是追加了么? 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210826-1629976164930) 89 | 90 | ### 总结 91 | 92 | - 这次我们研究追加文件 93 | - 追加文件就是把文件打开 94 | - 然后在后面写上要写的内容 95 | - 还有读写功能+ 96 | - 这可以让我们既可以读又可以写 97 | - 我还想让程序写点复杂的程序 98 | - 从文件读取信息 99 | - 完成个计算 100 | - 可以么?🤔 101 | - 下次再说 👋 102 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/081-190652-多文件读写.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 追加写入 8 | 9 | ## 回忆 10 | 11 | - 上次我们研究数据序列化 12 | - 字符串、字节型整数、双精度浮点数依次写入 13 | - 然后可以进行数据类型转化 14 | - 并且进行运算 15 | - 可以对于序列化定点写入 16 | - 这并不难 17 | - 我们可以跨文件进行操作么?🤔 18 | 19 | ### 准备环境 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630032996724) 22 | 23 | - 首先把这两个文件写好 24 | - 然后退出游乐场 25 | - 建立一个 add.py 26 | 27 | ### 验证 28 | 29 | - 先做一个可以验证的小程序 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630033253714) 32 | 33 | ### 继续 34 | 35 | - 然后复制代码 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630033435183) 38 | 39 | - 并且尝试运行 40 | - 运行成功 41 | - 尝试进行加法运算 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630033513886) 44 | 45 | - 可以让文件名更加抽象么? 46 | 47 | ### 整理环境 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630035625463) 50 | 51 | - vi -O o{0..2}z.data 52 | - vi 编辑器 53 | - -O 纵向拆分 window 54 | - o{0..2}z 对应三个文件 55 | - o0z.data 56 | - o1z.data 57 | - o2z.data 58 | 59 | ### 录入数据 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630035521429) 62 | 63 | - 进入之后 64 | - :windo normal i123 65 | - 在每个 窗口 win 中执行 normal i123 66 | - :wqa 67 | - w 保存 68 | - q 退出 69 | - a 所有窗口 70 | 71 | ### 打开多文件 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630035983425) 74 | 75 | - 保存并运行 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630036025955) 78 | 79 | - 运行结果 369 80 | - 成功 ❀ 81 | - 这程序看起来很傻 82 | - 但是能用 83 | - 囧 84 | 85 | ### 总结 86 | 87 | - 这次打开了多个文件 88 | - 用{0..2}这种方式建立通用文件名 89 | - 然后用遍历的方式读多个文件 90 | - 然后进行计算 91 | - 我们可以在 python 中执行 python 程序么 92 | - 就是执行 shell 里的命令 93 | - 可以么?🤔 94 | - 下次再说 👋 95 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/082-192165-执行外部命令.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 外部命令 8 | 9 | ## 回忆 10 | 11 | - 上次打开了多个文件 12 | - 用{0..2}这种方式建立通用文件名 13 | - 然后用遍历的方式读多个文件 14 | - 然后进行计算 15 | - 我们可以在 python 中执行 python 程序么 16 | - 就是执行 shell 里的命令 17 | - 可以么?🤔 18 | 19 | ### 搜索 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630036970439) 22 | 23 | ### 具体 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037087154) 26 | 27 | - 去游乐场试试 28 | 29 | ### 执行 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037227811) 32 | 33 | - 真的可以运行 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037337656) 36 | 37 | - 现在我想在程序里面写个 python 文件 38 | - 写完了之后在 python 里面运行外部命令 39 | 40 | ### 尝试 41 | 42 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037538773) 43 | 44 | - 运行可以成功 45 | 46 | ### 写程序 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037896375) 49 | 50 | - 真的可以写一个程序 51 | - 然后运行这个程序 52 | - ❀ 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630037979704) 55 | 56 | ### 总结 57 | 58 | - 这次执行了外部的 os 命令 59 | - 然后在一个程序里面 60 | - 写了一个 python 程序 61 | - 然后用外部命令执行了这个命令 62 | - 不过事到如今 63 | - 有个小问题 64 | - 就是我们的字符编码都是英文的 ascii 编码 65 | - 可以使用中文么?🤔 66 | - 下次再说 👋 67 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/083-190653-编码 encoding.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 编码解码 8 | 9 | ## 回忆 10 | 11 | - 上次执行了外部的 os 命令 12 | - 然后在一个程序里面 13 | - 写了一个 python 程序 14 | - 然后用外部命令执行了这个命令 15 | - 不过事到如今 16 | - 有个小问题 17 | - 就是我们的字符编码都是英文的 ascii 编码 18 | - 可以使用中文么?🤔 19 | 20 | ### 游乐场 21 | 22 | - 先去游乐场 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630047951300) 25 | 26 | - `4e00` 是 `一` 的 unicode 编码 27 | - 按照 `utf-8` 得到的编码是 b"\xe4\xb8\x80" 28 | - 把这个东西直接二进制写文件里 29 | 30 | ### 写入 31 | 32 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630048133381) 33 | 34 | - 写入没有问题 35 | - 能读出来么? 36 | 37 | ### 读取 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630048256841) 40 | 41 | - 不但能读出来 42 | - 而且能解码 43 | - 用什么编就用什么解 44 | - 解铃换需系铃人 45 | - 但这是`utf-8` 46 | - 可以用 gbk 来编解码么? 47 | 48 | ### gbk 编码 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630049377863) 51 | 52 | - gbk 两个字节搞定 53 | - 顺利编码 54 | 55 | ### gbk 解码 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630049469224) 58 | 59 | - gbk 解码成功 60 | - 用什么编就用什么解 61 | - 解铃还需系铃人 62 | - 其他的编码方式(如 Big5 等)也都类似 63 | - 最重要的就是 utf-8 编码 64 | - 不过我好像忘了 f.close()了 65 | 66 | ### 总结 67 | 68 | - 这次研究读写文件中的中文编码 69 | - 用什么编 70 | - 就用什么解 71 | - 解铃还需系铃人 72 | - 这样我们就可以对文件的编码和解码更加了解了 73 | - 还有什么可以做的文件方面的操作么?🤔 74 | - 下次再说 👋 75 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/084-233669-系统命令.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 外部命令 8 | 9 | ## 回忆 10 | 11 | - 这次研究读写文件中的中文编码 12 | - 用什么编 13 | - 就用什么解 14 | - 解铃换需系铃人 15 | - 这样我们就可以对文件编码和解码更加了解了 16 | - 还有什么可以做的文件方面的操作么?🤔 17 | - 比如我想用 python 程序新建文件夹 18 | 19 | ### 搜索 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633142396468) 22 | 23 | ### 啥都能干 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633142482813) 26 | 27 | - 好家伙 28 | - 好像啥都能干 29 | - 赶紧试试 30 | 31 | ### 动手 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633142716077) 34 | 35 | - 天啊?! 36 | - 真的可以 37 | - 其实 python 就可以是一个跨平台的操作系统了 38 | - 不论什么系统,python 都可以完成同样的文件系统操作 39 | - 那这个当前的目录是哪里呢? 40 | 41 | ### 当前路径 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633143134987) 44 | 45 | - 只要善于搜索,啥都能够学会 46 | - 继续搜索相关解决办法 47 | - 真的可以修改当前目录 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633143066769) 50 | 51 | - 真的是啥都能干 52 | - 能干脆执行 shell 的命令么? 53 | 54 | ### system 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633144129626) 57 | 58 | - 这就很爽了 59 | - 等于是把 shell 的命令可以直接当做 python 程序的 api 60 | - 什么是 api 呢? 61 | 62 | ### api 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211103-1635947612287) 65 | 66 | - python 直接调用 shell 命令和批处理 67 | - 就像调用函数一样调用 68 | - 想干什么都可以 69 | - 试试我们原来的那个刷新时间 70 | 71 | ### python 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633144684829) 74 | 75 | - 输出单行应该是没有问题的 76 | - 让他循环起来 77 | 78 | ### 循环输出 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633144906008) 81 | 82 | - 我还想让他水平垂直都居中 83 | 84 | ### 居中操作 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211002-1633145170701) 87 | 88 | - 垂直居中 89 | - echo -e "\033[10;1H" 90 | - 水平居中 91 | - figlet -c 92 | 93 | ### 总结 94 | 95 | - 这次可以用 python 控制文件夹和文件 96 | - python 的 os 包有一整套文件系统控制的函数 97 | - 用这一套可以实现跨系统的同样结果 98 | - 此外 os.system 函数可以运行外部 shell 的命令 99 | - shell 命令就成了我们控制文件系统的 api 100 | - 可以随便调用了 101 | - 当然读写文件的时候 102 | - 还是用 open()函数 103 | - 不过 open 之后我总忘了 close 104 | - 有什么办法避免么?🤔 105 | - 下次再说 👋 106 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/085-192174-with 关键字.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # with 关键字 8 | 9 | ## 回忆 10 | 11 | - 上次可以用 python 控制文件夹和文件 12 | - python 的 os 包有一整套文件系统控制的函数 13 | - 用这一套可以实现跨系统的同样结果 14 | - 此外 os.system 函数可以运行外部 shell 的命令 15 | - shell 命令就成了我们控制文件系统的 api 16 | - 可以随便调用了 17 | - 当然读写文件的时候 18 | - 还是用 open()函数 19 | - 不过 open 之后我总忘了 close 20 | - 有什么办法避免么?🤔 21 | 22 | ### 搜索 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050072740) 25 | 26 | - 好像可以打开 27 | - 第二个链接 28 | 29 | ### 具体代码 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050173668) 32 | 33 | - 这真的可以自动关闭么? 34 | - 去游乐园试试 35 | 36 | ### 游乐园 37 | 38 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050264651) 39 | 40 | - 好像确实可以 41 | - 在 with 的冒号里面的东西 42 | - 都可以使用 f 43 | - 在那个 block 之外再想使用 f 44 | - 他告诉我这个 f 已经 close 了 45 | 46 | ### 查看帮助 47 | 48 | - help() 49 | - with 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050363939) 52 | 53 | - with 语句用来封装一系列语句块的执行 54 | - 他依靠一个上下文管理器 55 | - 具体往下翻翻 56 | 57 | ###继续 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050768979) 60 | 61 | - 找找对应关系 62 | 63 | ### 对应 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630050916154) 66 | 67 | - manager 是 open("oeasy.txt","rb") 68 | - target 是 f 69 | - 开始的时候 f 进入 70 | - 最后的时候要让 f 退出 71 | - 也就是调用了 f.close() 72 | - 我目前是这样理解的 73 | - 继续看 74 | 75 | ### 两个文件 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630051229041) 78 | 79 | - 看起来比较和拷贝文件就可以这样做了 80 | - 而且结束的时候自动文件关闭 81 | - 最后提到了一个 PEP343 82 | 83 | ### PEP343 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630051464479) 86 | 87 | - 什么是 PEP 88 | 89 | ### PEP 90 | 91 | - Python Enhancement Proposals 92 | - python 增强改进建议 93 | - 主要问题就是如果写文件打开了 94 | - 然后写的时候出了问题 95 | - 但是报了错之后的 close 函数就不执行了 96 | - 原来用一种 try...finally...的结构 97 | - 保证 close 在 finally 里面永远执行 98 | - 用 with 的方法 99 | - 保证 close 在最后永远执行 100 | - 而且写的还简单 101 | - python 是不会随意增加关键字的 102 | - 就连 int、str 这些都是类而不是关键字 103 | - 看来 with 确实必要 104 | - 继续看文档 105 | 106 | ### 发现 107 | 108 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630052195612) 109 | 110 | - 有两个新函数 111 | - f.readlines() 112 | - list(f) 113 | 114 | ### 总结 115 | 116 | - 这次了解了 with 方法 117 | - 为了避免 f.close()不执行 118 | - 以后就都用 with 119 | - 还发现了新函数 120 | - 什么意思呢?🤔 121 | - 下次再说 👋 122 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/086-192219-列表-类型.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 列表 - 类型 8 | 9 | ## 回忆 10 | 11 | - 上次了解了 with 方法 12 | - 为了避免 f.close()不执行 13 | - 以后就都用 with 14 | - 还发现了新函数 15 | - f.readlines() 16 | - list(f) 17 | - 什么意思呢?🤔 18 | 19 | ### 构建环境 20 | 21 | - 要 readlines() 22 | - 首先得有 lines() 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072465105) 25 | 26 | - 应该是三行 27 | 28 | ### 尝试 29 | 30 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072543301) 31 | 32 | - 不是因为我们 write 语句有三行 33 | - 就是写了三行 34 | - 重来 35 | 36 | ### 再构环境 37 | 38 | - 写文件 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072720231) 41 | 42 | - 然后再 readlines() 43 | 44 | ### 读取各行 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072750811) 47 | 48 | - 读取成功 49 | - 读到的结果是用方括号括起来的东西 50 | - 每一行都是一个字符串 51 | - 字符串之间使用逗号进行分割 52 | - 看起来确实是按照换行符`\n`来进行分割的 53 | - 可是这个 lines 是什么类型的呢? 54 | 55 | ### 观察类型 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072822900) 58 | 59 | - 我们去 help 一下 60 | 61 | ### 帮助手册 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210827-1630072895148) 64 | 65 | - list 是一个内建的可修改的序列 66 | - 目前里面存储的都是字符串型的变量 67 | - 总共有 3 个字符串变量 68 | - list 就像一个容器 69 | - 里面装了 3 个字符串 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210828-1630118329745) 72 | 73 | ### 总结 74 | 75 | - 这次了解了 f.readlines() 76 | - 读文件的时候 77 | - 按照行读出来 78 | - 生成一个列表 list 79 | - 列表 list 是一个容器 80 | - 但是这个列表 list 到底怎么用?🤔 81 | - 下次再说 👋 82 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/105-199151-调试程序.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 缩进细节 8 | 9 | ## 回忆 10 | 11 | - 这次学习了 if 单分支条件语句中的缩进块 12 | - 缩进的范围是程序逻辑的体现 13 | - 某行缩进与不缩进意味着这行是不是属于 if 的语句块 14 | - 这很好很显眼 15 | - 而且要注意变量声明最好在最前面做 16 | - 比较清晰 17 | - 我们可以 debug 调试 这个程序么?🤔 18 | 19 | ### 改写程序 20 | 21 | - 为什么要调试程序呢? 22 | - 比如我的程序是下面这样的 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631092662985) 25 | 26 | - 把本来输入的变量 27 | - 变成了随机得到的变量值 28 | - random()在 0,1 之间 29 | - random()\*4 在 0,4 之间 30 | - random()\*4+36 在 36,40 之间抖动 31 | 32 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631092700847) 33 | 34 | - 我们一下子就直接得到最终的输出结果了 35 | - 但是如果我们想要深入程序内部 36 | - 一行行看着程序 37 | - 看他到底是怎么执行的 38 | - 这就需要调试 debug 39 | - 什么是 debug 呢? 40 | 41 | ### 调试 42 | 43 | - debug 就是一条一条语句依次执行用来找 bug 44 | - 我们现在开始编程 45 | - pdb3 if_statement.py 46 | 47 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631092912541) 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631092979816) 50 | 51 | - n 就是 next 可以执行下一条 52 | 53 | ### 查看本地变量 54 | 55 | - display t 56 | - 可以查看变量的值 57 | 58 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631093249035) 59 | 60 | - 可以查看帮助么? 61 | 62 | ### 查看帮助 63 | 64 | - 用 h 就可以 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631095791496) 67 | 68 | - 貌似可以设置断点 69 | - 什么是断点? 70 | 71 | ### 设置断点 72 | 73 | - 断点就是调试的时候 74 | - 程序运行时会自动停止的点 75 | - 设置断点 76 | - b 2 77 | - 在第 2 行添加一个断点 78 | - 设置条件断点 79 | - b 4,t>38 80 | - 在第 4 行添加条件断点 81 | - 断点条件为 t>38 82 | - 查看所有断点 83 | - break 84 | - 跳转到断点 85 | - c 86 | - 继续运行 87 | - 对应单词 continue 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631096194319) 90 | 91 | ### 打印变量 92 | 93 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631096269019) 94 | 95 | - 输出 print 变量 96 | - 输出变量类型 type 97 | 98 | ### 总结 99 | 100 | - 这次可以对预分支结构进行调试 debug 101 | - 可以列出程序 102 | - 并逐步执行 103 | - 可以设置断点,并跳转到断点 104 | - 可以输出变量的值和类型 105 | - 这个 if 判断的条件 106 | - 也就是 t>38 应该如何理解?🤔 107 | - 下次再说 👋 108 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/108-203075-映射类和集合类容器比较运算.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 比较运算符 8 | 9 | ## 回忆 10 | 11 | - 这次研究以下类的比较运算符 12 | - 字符串 str 13 | - 字节序列 bytes 14 | - 列表 list 15 | - 元组 tuple 16 | - 从头到尾按顺序比较序列中的每个元素 17 | - 如果有分出大小 18 | - 就是最终的大小 19 | - 如果有一方没有了元素了 20 | - 另一方就大 21 | - 如果没有分出大小就继续向后 22 | - 如果有嵌套的列表之类的东西 23 | - 就比较这两个列表 24 | - 如果此子列表中还有列表 25 | - 就继续比较下去 26 | - 直到分出胜负 27 | - 除了列表之外还有什么容器呢?🤔 28 | 29 | ### 映射类 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631887600616) 32 | 33 | - 映射类主要指的是字典 34 | - 他不能大于小于 35 | - 只能判断是否相等 36 | 37 | ### 动手 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631887701536) 40 | 41 | - 如果他们次序不同呢? 42 | 43 | ### 次序 44 | 45 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631889275927) 46 | 47 | - 映射类其实是没有次序的 48 | - 只有序列是有序的列表 49 | - 除了映射类的字典 dict 之外 50 | - 还有集合类 51 | - set 52 | - frozenSet 53 | 54 | ### 集合 set 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631887816651) 57 | 58 | - 可以判断是否相等 59 | - 或者判断是否不等 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888166200) 62 | 63 | - 集合内部可以合并同类项 64 | - 大于小于如何判断呢? 65 | 66 | ### 大于小于 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888263419) 69 | 70 | - 如果有从属子集关系的话 71 | - 超集大于子集 72 | - 子集小于超集 73 | - 如果没有从属子集关系的话 74 | - 就是不大于也不小于也不相等 75 | - 就是不等于 76 | - 冻结集合呢? 77 | 78 | ### 试一下 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888636356) 81 | 82 | - 冻结集合基本可以理解为集合 83 | - 两者可以比较大小 84 | - 比较运算符有什么规律呢? 85 | 86 | ### 比较的对称性 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888744106) 89 | 90 | - 可以对称转化 91 | - 除此之外还有什么特性么? 92 | 93 | ### 比较的传递性 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888834147) 96 | 97 | - imply 就是暗示的意思 98 | - 可以判断出来 99 | - 除此之外还有什么特性么? 100 | 101 | ### 否定 102 | 103 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210917-1631888920137) 104 | 105 | - 不真就是假 106 | - 不假就是真 107 | - 否定之否定就是肯定 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220102-1641089034994) 110 | 111 | - 标红的最后两条只对序列类容器起作用 112 | - 这应该如何理解 113 | 114 | ### 深入 115 | 116 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220102-1641089034994) 117 | 118 | - 标红的两行 119 | - 对于映射类的 map 和结合类的 set 之类的不起作用 120 | 121 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220102-1641089083378) 122 | 123 | ### 总结 124 | 125 | - 这次研究了以下类的比较运算符 126 | - 映射类 map 127 | - dict 字典 128 | - 集合类 129 | - set 130 | - frozenset 131 | - dict 132 | - 可以比较相等和不等 133 | - 完全一致就等 134 | - 不一致就不等 135 | - 集合类 136 | - set 和 frozenset 规律相同 137 | - 一样就相等 138 | - 不一样就不等 139 | - 有子集关系的话 140 | - 可以比较出大小 141 | - 否则比大小结果都是 False 142 | - 比较运算符还有 143 | - 对称性 144 | - 传递性 145 | - 否定之否定原理 146 | - 除了这些还有什么比较运算符么?🤔 147 | - 下次再说 👋 148 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/110-203370-是否是某类型实例-isinstance.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 比较运算符 8 | 9 | ## 回忆 10 | 11 | - 上次研究了 is 12 | - is 判断是否相等 13 | - 具体用 == 还是 is 和变量类型相关 14 | - int、float、str 之类的相等判断最好用 == 和 != 15 | - 容器类对象的比较可以灵活运用 is 或者 == 16 | - is 为 True 代表两个东西 id 相等 17 | - 或者说用的是同一个盒子 18 | - 在内存中占的是同一块空间 19 | - 还有什么可以做类型判断么??🤔 20 | 21 | ### isinstance 22 | 23 | - 有个函数叫 isinstance 24 | - 怎么用呢? 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632015134175) 27 | 28 | - isinstance 29 | - is 是进行布尔判断 30 | - instance 是实例判断是否是实例 31 | - 两个参数 32 | - 前面是有待于检测的值 33 | - 后面是类型名 34 | - 具体这个函数什么意思呢? 35 | - 查一手手册 36 | 37 | ### 查询手册 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632016158085) 40 | 41 | - 如果是这个类型就是 True 42 | - 否则就是 False 43 | - 后面的参数除了类型名之外 44 | - 还可以是元组 45 | 46 | ### 试试 47 | 48 | - 如果 isinstance 后面的参数是元组的话 49 | - 判断元组中是否包含指定对象的类型 50 | - 如果是就返回 True 51 | - 否则就返回 False 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632016314255) 54 | 55 | - 最后一行让我疑惑 56 | - (1)不是元组么? 57 | 58 | ### 判断 59 | 60 | - 对程序的疑问 61 | - 就用程序来说明 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632016414345) 64 | 65 | - (1)确实不是元组 66 | - (1,)才是元组 67 | 68 | ### 另辟蹊径 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632016734066) 71 | 72 | - 这样也可以解决类型判断的问题 73 | - 不过这个 in 是什么意思呢 74 | 75 | ### 总结 76 | 77 | - 这次研究了 isinstance 78 | - is 是关键字 判断是否相等 79 | - isinstance 是函数 判断是否是某类对象 80 | - 除了 is 和 isinstance 之外 81 | - 还有个 in 82 | - 这个 in 具体有什么说法么??🤔 83 | - 下次再说 👋 84 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/111-203367-是否属于-in.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 比较运算符 8 | 9 | ## 回忆 10 | 11 | - 上次研究了 isinstance 12 | - is 是关键字 判断是否相等 13 | - isinstance 是函数 判断是否是某类对象 14 | - 除了 is 和 isinstance 之外 15 | - 还有个 in 16 | - 这个 in 具体有什么说法么? 17 | - 查找第一手资料 18 | - 帮助手册 19 | 20 | ### 查找帮助 21 | 22 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210918-1631970031254) 23 | 24 | - 这个操作符是 in 和 not in 25 | - 类型是成员测试运算符 26 | - 英文 Membership test operations 27 | - 就是看某个东西在不在容器里是吧 28 | - 这个简单 29 | 30 | ### 动手 31 | 32 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210918-1631970242173) 33 | 34 | - 检查某元素是否在序列里面 35 | - 如果在的话就是 True 36 | - 如果列表元组这种序列都可以用 in 37 | - 那么字符序列和字节序列可以么? 38 | 39 | ### 字节序列和字符序列 40 | 41 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210918-1631970374830) 42 | 43 | - 成员测试运算符 in 44 | - 对于字节序列和字符序列也好用 45 | - 空字符 in 任何字符串 46 | - 空字符 甚至 in 空字符串 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632013818741) 49 | 50 | - 列表可以 in 列表么? 51 | 52 | ### 列表 in 列表 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210918-1631970766575) 55 | 56 | - 列表不能 in 列表 57 | - 列表元素能 in 列表 58 | - 除了序列类这种有次序的 59 | - 没有次序的会如何呢? 60 | 61 | ### 集合 in 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210918-1631970579212) 64 | 65 | - 列表不能 in 列表 66 | - 集合不能 in 集合 67 | - 集合元素 可以 in 集合 68 | - 映射 map 类的 dict 字典又如何呢? 69 | 70 | ### 字典 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632013924260) 73 | 74 | - in 字典的东西不是字典 75 | - 而是字典的 key 76 | - keys 的 list 可以么? 77 | 78 | ### keys 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632014059631) 81 | 82 | - 实践证明 key 的列表是不可以的 83 | - 只有 key 可以 84 | - 字典的本质是 key-value 对的集合 85 | - 确认了有这个 key 86 | - 才能访问这个 key-value 对 87 | 88 | ### 确认存在 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633687607782) 91 | 92 | - 对不存在的 key 的访问 93 | - 要判断一下 94 | - 确认他是 95 | - 不存在的 96 | - 不要出现那种 KeyError 97 | 98 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633687685654) 99 | 100 | - 如果这个 key 存在呢? 101 | 102 | ### 存在的 key 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633687718020) 105 | 106 | - 这个也要提前确认 107 | - 因为不知道是不是真的存在 108 | - 字典的本质是 key-value 对的集合 109 | - 集合是可以删除集合项的 110 | 111 | ### 回到开头 112 | 113 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632016963654) 114 | 115 | - 现在我们可以理解这个含义了么? 116 | - type 得到类型 117 | - 判断是否这个类型是否在这个类型元组中 118 | - 相当于 119 | - isinstance((1,), (list,tuple,dict)) 120 | 121 | ### 总结 122 | 123 | - 这次研究了 in 124 | - 字符序列和字节序列只要有子序列关系的话 125 | - in 就是 True 126 | - 元组和列表有这个元素的话 127 | - in 就是 True 128 | - 子序列是 False 129 | - 集合中有这个元素关系的话 130 | - in 就是 True 131 | - 字典中包含这个 key 的话 132 | - in 就是 True 133 | - 这个 not in 是什么意思呢??🤔 134 | - 下次再说 👋 135 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/116-203376-多分支条件语句-elif.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 比较运算符 8 | 9 | ## 回忆 10 | 11 | - 上次看了条件语言的嵌套 12 | - 条件语句下面还可以有条件语句 13 | - 缩进结构既是样式也是逻辑关系 14 | - 嵌套可以有很多很多层 15 | - 可以把嵌套语句的层数降低么? 16 | - 先回忆上次的代码 17 | 18 | ### 回忆 19 | 20 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220102-1641127126653) 21 | 22 | - 这 if 条件本质上是分段 23 | - 先从中间分开 24 | - 然后左右再分开 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632054786279) 27 | 28 | ### 查询 if 29 | 30 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632055259216) 31 | 32 | - elif 其实就是 else + if 33 | - 这些都和 if 并排 34 | 35 | - 我可以从轻到最重 36 | - 一段段用 elif 分开么? 37 | 38 | ### 多分支 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632055618401) 41 | 42 | - 这样嵌套条件语句就变成了多分支条件语句 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632055896606) 45 | 46 | ### 更多分支 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632056008705) 49 | 50 | - 体重过轻和体重过重其实也可以细分 51 | - 可各个分成三个级别 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632056060645) 54 | 55 | - 这依然不用嵌套 56 | - 用一层的多分支就搞定了 57 | - 对于同一个变量判断来说 58 | - 最好是用多分支而不是嵌套 59 | 60 | ### 区分万物 61 | 62 | - 我们因此可以区分世上各种类别的东西 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632558999500) 65 | 66 | ### 制定策略 67 | 68 | - 根据情况的不同 69 | - 分类讨论各种情况的处理策略 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632559059612) 72 | 73 | ### 编写程序 74 | 75 | - 具体来说就是编写各种程序 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632559114388) 78 | 79 | - 分支很多的情况也很常见 80 | 81 | ### 决策过程 82 | 83 | - 决策过程也像一棵树一样 84 | - 有很多的分支 85 | - 叫做决策树 86 | 87 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632559355530) 88 | 89 | ### 十二星座 90 | 91 | - 比如我们熟悉的十二生肖 92 | - 或者外国的十二星座 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632557981812) 95 | 96 | - 同样的内容 97 | - 使用不同的分类方法 98 | - 就会有不同的解释体系 99 | 100 | ### 分类方法 101 | 102 | - 一年可以分为 103 | - 四季 104 | - 12 个月 105 | - 二十四节气 106 | - 七十二物候 107 | - 甚至更多 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632558086872) 110 | 111 | - 分支多了就容易乱 112 | - 比如有的分支有相应的操作 113 | - 有的分支不需要执行任何操作 114 | - 比如下面 115 | 116 | ### 问题 117 | 118 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210920-1632132889560) 119 | 120 | - 我要做这么一个程序 121 | - 当 num == 0 的时候 122 | - 什么也不干 123 | 124 | ### 代码和问题 125 | 126 | - 代码如下 127 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210920-1632131908178) 128 | 129 | - 报了一个缩进的错误 130 | - 可是我就想要 num == 0 是什么都不做啊? 131 | 132 | ### 总结 133 | 134 | - 这次了解了 elif 135 | - elif 就是 else + if 136 | - 可以构成多分支语句 137 | - 不过在这个某些分支上 138 | - 我想啥都不做 139 | - 却出现了问题 140 | - 能否做到啥都不做呢???🤔 141 | - 下次再说 👋 142 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/121-203872-优先级-precedence.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 逻辑或 or 8 | 9 | ## 回忆 10 | 11 | - 这次了解的是 or 12 | - or 是一个逻辑或运算符 13 | - 有一个是 True 的时候就返回 True 14 | - 全是 False 就返回 False 15 | - 这个运算符变量也可以有数字、字符串、容器之类的 16 | - 逻辑还是零、空串、空容器对应 False 17 | - 一旦出现 True 18 | - 就返回逻辑值 True 对应的变量 19 | - 这些逻辑运算可以配合使用么???🤔 20 | 21 | ### 来一个 22 | 23 | - True or False and False 24 | - 这个东西应该是什么结果呢? 25 | - 不要翻篇 26 | - 自己先计算一下 27 | 28 | ### 实际结果 29 | 30 | - 本以为从左到右运算 31 | - 等价于 True and False 32 | - 最终结果为 False 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632567804726) 35 | 36 | - 但实际的结果为 False 37 | - 这该如何理解呢? 38 | 39 | ### 结合顺序 40 | 41 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632567812832) 42 | 43 | - 不是说好了从左往右结合的么? 44 | - 怎么先算后面的了呢? 45 | - 这要提到运算符的优先级 46 | 47 | ### 优先级 precedence 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632567887013) 50 | 51 | - help>Expressions 52 | - 各种运算符优先级不是相同的 53 | - 就逻辑运算符来说 54 | - not 最高 55 | - and 居中 56 | - or 最低 57 | - 完整的优先级什么样子呢? 58 | 59 | ### 完整优先级 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632569075584) 62 | 63 | - 了解了原理 64 | - 我们来试试 65 | 66 | ### 优先级 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568284055) 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568294428) 71 | 72 | - 确实优先级是 73 | - not 74 | - and 75 | - or 76 | - 相同逻辑运算符的话从左到右 77 | - 有括号的要优先 78 | - 做个练习 79 | 80 | ### 闰年 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568505445) 83 | 84 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568548589) 85 | 86 | ### 规律 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568567185) 89 | 90 | - 这应该如何实现呢? 91 | - 不要翻篇尝试自己做出来 92 | 93 | ### 闰年判断 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632568830456) 96 | 97 | ### 总结 98 | 99 | - 这次了解的是优先级 100 | - 每个运算符都有自己的优先级位置 101 | - 逻辑运算符的优先级从高到低 102 | - not 103 | - and 104 | - or 105 | - 有什么比较复杂的逻辑运算么???🤔 106 | - 下次再说 👋 107 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/122-203873-综合练习-玩骰子-dices.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 逻辑或 or 8 | 9 | ## 回忆 10 | 11 | - 这次了解的是优先级 12 | - 每个运算符都有自己的优先级位置 13 | - 逻辑运算符的优先级从高到低 14 | - not 15 | - and 16 | - or 17 | - 有什么比较复杂的逻辑运算么???🤔 18 | 19 | ### 骰子 20 | 21 | - 每人五个骰子,摇出后,依其点数牌形可分为: 22 | - 散牌(五个骰子点数各不一样) 23 | - 一对(五个骰子中仅有两个骰子点数一样,其余皆不一样) 24 | - 两对(两个对子加一个其他点数,如一对二加一对四加一个三) 25 | - 三条(三个骰子的点数一致,余下两个骰子点数各不相同,如三个四加一个二和一个六) 26 | - 葫芦(也就是扑克牌中的三条带一对:三个骰子点数同为某数,余下两个骰子点数同为另一数,如三个三加一对二) 27 | - 炸弹(其中四个骰子的点数一致,如四个一加一个五) 28 | - 顺子(五个骰子点数呈连续分布,如 12345 和 23456) 29 | - 豹子(五个骰子点数全一样) 30 | - 第一步就是通过五个随机的色子 31 | - 得到相应的级别 32 | - 动手吧! 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632573660781) 35 | 36 | ### 投掷 37 | 38 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632574216698) 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632574224312) 41 | 42 | - 投了骰子之后需要整理 43 | 44 | ### 整理 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632574232094) 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632574238615) 49 | 50 | ### 分级 51 | 52 | - 散牌(五个骰子点数各不一样) 53 | - 一对(五个骰子中仅有两个骰子点数一样,其余皆不一样) 54 | - 两对(两个对子加一个其他点数,如一对二加一对四加一个三) 55 | - 三条(三个骰子的点数一致,余下两个骰子点数各不相同,如三个四加一个二和一个六) 56 | - 葫芦(也就是扑克牌中的三条带一对:三个骰子点数同为某数,余下两个骰子点数同为另一数,如三个三加一对二) 57 | - 炸弹(其中四个骰子的点数一致,如四个一加一个五) 58 | - 顺子(五个骰子点数呈连续分布,如 12345 和 23456) 59 | - 豹子(五个骰子点数全一样) 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632575067386) 62 | 63 | - 两对看起来情况很复杂啊 64 | - 先去游乐场找找思路 65 | 66 | ### 游乐场 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632575270728) 69 | 70 | - 这个思路看起来可行 71 | 72 | ### 获得 counts 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632575470187) 75 | 76 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632575544394) 77 | 78 | - 当获得了 counts 之后 79 | - 其实原来的代码也可以简化 80 | 81 | ### 简化 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632575777196) 84 | 85 | - 这样就有了等级的基本规则 86 | - 同级的也可以比大小 87 | 88 | ### 胜负规则 89 | 90 | - 胜负规则为豹子>顺子>炸弹>葫芦>三条>两对>对子>散牌 91 | - 若属于同一类型,则依次比较类型构成主次要成分的骰子点数大小 92 | - 如炸弹先比较四个相同骰子的点数,再比较散牌 93 | - 葫芦先比较三个相同骰子再比较对牌 94 | - 两对先比较较大的对,再比较稍小的对,最后比较散牌 95 | - 如此类推 96 | - 比较点数时 1 > 6 > 5 > 4 > 3 > 2 97 | 98 | ### 举例 99 | 100 | - 试举例,如双方均为葫芦 101 | - 一人为三个五带对二 102 | - 另一人为三个四带对六 103 | - 前者胜 104 | - 又若双方均为两对,同有对二、对六 105 | - 但一方散牌为五 106 | - 另一方为一 107 | - 则后者胜 108 | - 这真的有点复杂 109 | - 有兴趣的同学可以把随机摇两把 110 | - 然后比大小 111 | 112 | ### 参考 113 | 114 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210925-1632577327031) 115 | 116 | - 可以做个字典 117 | - 当级别相同的时候 118 | - 去比较字典里面的数字 119 | 120 | ### 总结 121 | 122 | - 这次做了一个比较复杂的骰子的例子 123 | - 真的是很复杂 124 | - 综合运用逻辑与或非 125 | - 为什么要强调逻辑与或非 126 | - 难道说还有其他类型与或非???🤔 127 | - 下次再说 👋 128 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/124-205644-移位运算符.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 位运算符 8 | 9 | ## 回忆 10 | 11 | - 这次研究了位运算符 12 | - 按位或| 13 | - 按位异或^ 14 | - 按位与& 15 | - 优先级与&最高,或|最低 16 | - 位运算还可以有其他运算符么?🤔 17 | - 如果有一定也在优先级的大列表中 18 | 19 | ### 查询 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632622694898) 22 | 23 | - 在位运算符紧挨着的地方 24 | - 有一个 shifts 25 | - 是什么意思呢? 26 | 27 | ### 动手 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632623561337) 30 | 31 | - 数字 1 左移 1 位就变成了 2 32 | - 数字 1 左移 2 位就变成了 4 33 | - 数字 1 左移 3 位就变成了 8 34 | - 为什么呢? 35 | - 因为这是二进制 36 | - 如果十进制的话 37 | - 小数点向右移动 1 位 38 | - 相当于数字左移 1 位 39 | - 相当于乘以 10 40 | - 现在是二进制的话 41 | - 小数点向右移动 1 位 42 | - 相当于数字左移 1 位 43 | - 相当于乘以 2 44 | - 同理 45 | - 小数点向右移动 n 位 46 | - 相当于数字左移 n 位 47 | - 相当于乘以 2n 48 | - 数字左移是这么理解的 49 | - 反过头来呢? 50 | 51 | ### 右移 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632623653648) 54 | 55 | - 最后都给移没有了 56 | - 意思大概明白了 57 | - 可是负数可以移位么? 58 | 59 | ### 负数 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632623890256) 62 | 63 | - 不但能移位 64 | - 还能支持大数运算 65 | - 不会溢出 66 | - 左移相当于乘以 2 67 | - 右移相当于整除以 2 68 | - 小数可以么? 69 | 70 | ### 小数 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632623964852) 73 | 74 | - 小数无论单精度还是双精度 75 | - 都是 ieee754 的编码规则 76 | - 连指数带有效数字一起移动没有意义 77 | - 那整数的话本来可以用乘以 2、整除以 2 来做啊? 78 | - 移位运算符有什么意义呢? 79 | 80 | ### 意义 81 | 82 | - 明确寄存器具体位数是 0 还是 1 83 | - reg = 0xa1 84 | - 写成二进制 10100001 读起来挺麻烦 85 | - Reg = (1 << 7) + (1 << 5) + (1 << 0) 86 | - 这样就很明确 87 | - 7、5、0 位置 1 88 | - 其余的 6、4、3、2、1 位置置 0 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632624313644) 91 | 92 | ### 历史 93 | 94 | - 在原来还没有乘法指令的时候 95 | - 使用移位来进行乘法运算 96 | - \*3 就是 97 | - <<1 左移 1 位 98 | - 相当于乘以 2 99 | - 再加上自身 100 | - \*6 就是 101 | - <<2 左移 2 位 102 | - 相当于乘以 4 103 | - 再加上 <<1 左移 1 位 104 | - 相当于加上自身乘以 2 105 | - \*9 就是 106 | - <<3 左移 3 位 107 | - 相当于乘以 8 108 | - 再加上自身 109 | - 后来有了乘法指令 110 | - 但是如果希望用 8 位的乘法指令计算 16 位整数的乘法 111 | - 也需要把数字拆开完成计算 112 | 113 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632624875535) 114 | 115 | ### 总结 116 | 117 | - 这次研究了移位运算符 118 | - << 左移 相当于 ✖️2 119 | - > > 右移 相当于 ➗️2 120 | - 我们从逻辑运算到位运算再到移位运算 121 | - 走了好远 122 | - 最后我们总结一下条件分支流程吧?🤔 123 | - 下次再说 👋 124 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/129-233772-循环细节.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 循环细节 8 | 9 | ## 回忆 10 | 11 | - 这次了解了 break 12 | - break 可以打破循环 13 | - 跳出三界外 14 | - 不在五行中 15 | - 现在的问题是 16 | - 遇洪而开 17 | - 见信而寂 18 | - 无法输出任何字符 19 | - 怎么办?🤔 20 | 21 | ### 原因 22 | 23 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633439264382) 24 | 25 | - 原来是次序问题 26 | - 我还是想要 27 | - 遇洪而开 28 | - 见信而寂 29 | - 每次要字符减一就可以到达了吧?! 30 | 31 | ### 动手 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633439574229) 34 | 35 | - 这样似乎是可以得到最终结果的 36 | - 遇洪而开 37 | - 见信而寂 38 | - 首尾确定 39 | - 字符间距为 1 40 | - break 什么意思来着? 41 | 42 | ### break 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633439693252) 45 | 46 | - 游乐场的帮助手册告诉我们 47 | - break 跳出当前的循环 48 | - 跳出三界外 49 | - 不在五行中 50 | - 继续往后走了 51 | - 那什么时候用 break 呢? 52 | - 我看好像跳出条件放在 while 的循环条件里面也可以啊?! 53 | 54 | ### 跳出用法 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633440033148) 57 | 58 | - 比如说比赛总共十圈 59 | - 你现在第三圈 60 | - 正常的循环十次 61 | - 但是遇到黑白旗 62 | - 后面的都不用跑了 63 | - 跳出循环 64 | - break 的手法非常爆裂 65 | 66 | ### 退出游戏 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633440987789) 69 | 70 | - 不是另开一局 71 | - 而是直接退出 72 | - 这就是 break 的火爆效果 73 | - 我们也可以用 break 控制是否退出游戏 74 | - 我们来玩一个猜数字的游戏 75 | 76 | ### 猜数字 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633442463717) 79 | 80 | - 每次猜一个数字 81 | - 猜中了就告诉你猜中了 82 | - 猜不中就告诉你大了 83 | - 还是小了 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633442480138) 86 | 87 | - 这个游戏怎么写呢? 88 | 89 | ### 循环走起 90 | 91 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633443205828) 92 | 93 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633443234310) 94 | 95 | - 但是用户是无知的 96 | - 有可能出现这种错误 97 | 98 | ### 错误 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633443286317) 101 | 102 | - 用户直接回车 103 | - 或者输入"abc" 104 | - 都会报错 105 | - 怎么避免这类问题呢? 106 | 107 | ### 防御式编程 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633443886356) 110 | 111 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633443896189) 112 | 113 | - 如果我要把输入的数字范围限制在 0-100 之间呢? 114 | 115 | ### 继续防御 116 | 117 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633444124226) 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211005-1633444131493) 120 | 121 | - 这个游戏就比较完善了 122 | - 还有什么游戏呢? 123 | - 以前做过猜丁壳啊? 124 | 125 | ### 猜丁壳 126 | 127 | - 000715 曾经做过猜丁壳的比较判断 128 | - 不过这是一局的判断 129 | - 我们可以做成一个循环赛 130 | - 比如说 bo7 131 | - 七局四胜 132 | - 或者无限循环赛 133 | - 双方分别积分 134 | - 出手由来 135 | - 电脑随机 136 | - 个人按照输入的内容出手 137 | - 如果输入 q 就退出整个比赛 138 | 139 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210919-1632057911165) 140 | 141 | - 这个小游戏你能做么? 142 | 143 | ### 总结 144 | 145 | - 这次做了猜数字 146 | - 猜中了就 break 出来 147 | - 没猜中就继续猜 148 | - 然后复习了防御式编程 149 | - 对于各种错误有自己的预估和处理 150 | - 最后可以自制猜丁壳小游戏 151 | - 还可以做什么游戏呢?🤔 152 | - 下次再说 👋 153 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/130-233773-else-不满足循环条件时.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # else 不满足循环条件时 8 | 9 | ## 回忆 10 | 11 | - 这次做了猜数字 12 | - 猜中了就 break 出来 13 | - 没猜中就继续猜 14 | - 然后复习了防御式编程 15 | - 对于各种错误有自己的预估和处理 16 | - 最后可以自制猜丁壳小游戏 17 | - 还可以做什么呢?🤔 18 | 19 | ### 循环十个数 20 | 21 | - 我们首先先从一个简单的循环开始 22 | - 从 1 到 10 23 | - 前闭后开 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633482904185) 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633482911046) 28 | 29 | ### 循环条件 30 | 31 | - 给他加一个 if 语句 32 | - 对循环条件进行进行`反向`判断 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483115380) 35 | 36 | - 循环的条件是 i<10 37 | - 条件取反是 not i<10 38 | - 跳出循环肯定不满足循环条件 39 | - 换句话说 40 | - 肯定满足循环条件的取反 41 | 42 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483169904) 43 | 44 | - 确实 45 | - 这个循环条件的取反可以用 else 来替代 46 | 47 | ### else 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483250677) 50 | 51 | - 这个 else 就相当于循环条件取反 52 | - 我们看看帮助手册里面怎么说 53 | 54 | ### 帮助手册 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483565139) 57 | 58 | - 根据循环条件判断 59 | - 如果满足 60 | - 执行循环体 61 | - 如果不满足 62 | - 执行 else 子句一次 63 | - 然后循环语句结束 64 | - 如果循环条件根本就不满足呢? 65 | 66 | ### 天生 false 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483686962) 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483693673) 71 | 72 | - 如果循环条件上来就是假的 73 | - 那就一次都不循环 74 | - 然后直接执行 else 一次 75 | - 然后结束 76 | - 如果是 break 退出循环呢? 77 | - else 还会被执行么? 78 | 79 | ### break 退出 80 | 81 | - 把循环条件修改一下 82 | - 再加上一个条件语句 83 | - 如果满足条件就 break,跳出循环 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483872886) 86 | 87 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633483911343) 88 | 89 | - break 之跳出循环 90 | - 不执行 else 子句 91 | - 直接跳出整个循环 92 | - 手册是如何描述这个的? 93 | 94 | ### 手册 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633484018717) 97 | 98 | - without 指的就是不执行 99 | - 不执行 else 子句中的语句 100 | 101 | ### 总结 102 | 103 | - 这次了解了 else 104 | - 当循环条件不满足时 105 | - 执行一次 else 子句中的语句 106 | - 然后退出整个循环 107 | - 如果循环体中有 break 108 | - 那就直接跳出整个循环语句 statement 109 | 110 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633484217904) 111 | 112 | - 这个手册里面提到了 continue 是什么意思?🤔 113 | - 下次再说 👋 114 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/133-233802-iterable-可迭代对象-元组-列表.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 可迭代 iterable 对象 8 | 9 | ## 回忆 10 | 11 | - 这次主要了解的是 for 循环语句 12 | - for 循环可以遍历 13 | - range 对象 14 | - list 对象 15 | - 只要是 iterable 的对象就可以 16 | - iterable 的对象都有什么?🤔 17 | - 想要循环起来,单个的应该不可以 18 | - 我们去回忆下容器类型 19 | 20 | ### 容器类型 21 | 22 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633523631843) 23 | 24 | - 最常用的就是 list 列表 25 | - 我们从 list 开始 26 | 27 | ### 观察手册 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633523705913) 30 | 31 | - list 列表可以用可迭代对象当做构造函数的参数 32 | - iterable 的词源是什么呢? 33 | 34 | ### iterable 35 | 36 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633826870506) 37 | 38 | - iterable 的意思就是 39 | - 可以迭代的 40 | - 可以遍历的 41 | - 可以循环的 42 | - 怎么判断某类的对象是不是 iterable 的呢? 43 | - 如果类实现了**iter**方法 44 | - 他的对象是 iterable 的对象 45 | 46 | ### list 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633523730699) 49 | 50 | - list 类实现了**iter**方法 51 | - 所以 list 类对应的对象 52 | - 就是可迭代对象 53 | - 具体用起来 54 | 55 | ### 遍历列表 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633523884948) 58 | 59 | - 那这个就不能用 while 做么? 60 | 61 | ### while 与 for 比较 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633523884948) 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633524067753) 66 | 67 | - while 也能做 68 | - 但是比较麻烦 69 | - 如果我在循环体中改变列表会发生什么? 70 | 71 | ### 重新判断 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633524393579) 74 | 75 | - 循环体会改变列表 76 | - 每次会重新进行判断 77 | - 如果我想让列表不能改变怎么办? 78 | 79 | ### 元组 80 | 81 | - 元组对象可以迭代么? 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526287022) 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526294918) 86 | 87 | - 可以迭代 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526318369) 90 | 91 | ### 元组可修改么? 92 | 93 | - tuple 就是不可变的 list 94 | - list 就是可变的 tuple 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526073733) 97 | 98 | - 元组对象是不能修改的 99 | - 元组根本 append 方法 100 | - 但是 for 循环条件那里是一个可迭代对象啊 101 | - 可以根据元组修改么? 102 | 103 | ### 转化 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526493039) 106 | 107 | - 先把元组转化为列表 108 | - 再把列表增加元素 109 | - 然后再转回元组 110 | - 这不是修改元组 111 | - 而是替换元组 112 | 113 | ### 转化 114 | 115 | - 元组和列表是可以转化的 116 | - 可变和不可变是可以转化的 117 | - 阴中有阳 118 | - 阳中有阴 119 | 120 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211006-1633526625846) 121 | 122 | ### 总结 123 | 124 | - 这次主要了解的是 for 循环语句 125 | - for 循环可以遍历 126 | - range 对象 127 | - list 列表对象 128 | - tuple 元组对象 129 | - 只要是 iterable 的对象就可以 130 | - 如果我要求列表不能重复插入可以么?🤔 131 | - 下次再说 👋 132 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/136-233927-for-遍历字典 dict.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 字符串和字节序列 8 | 9 | ## 回忆 10 | 11 | - 这次用 for 遍历了 12 | - 字符串 13 | - 字节序列 14 | - 他们都是可迭代的对象 15 | - 回忆了两种打断的方式 16 | - break 彻底打断 17 | - continue 中断本轮,后面继续 18 | - 容器里面还有个字典 19 | - 字典是可迭代 iterable 的对象么?🤔 20 | 21 | ### 字典 22 | 23 | - 回忆 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633660690110) 26 | 27 | - 那字典相关的这些东西都是什么类型的呢? 28 | - help(dict) 29 | - 去找一下 30 | 31 | ### 字典 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633684066867) 34 | 35 | - items、keys 都是像集合一样的对象 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633684134273) 38 | 39 | - values 也一样,是提供一种视图 40 | - 说到底怎么遍历字典呢? 41 | 42 | ### 遍历 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633684287614) 45 | 46 | - 看起来遍历字典 47 | - 就是在遍历他的 keys 48 | - 通过 key 也就能得到相应的 value 49 | - 毕竟字典的本质是 key-value 对的集合 50 | 51 | ### 遍历整个字典 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633684423104) 54 | 55 | - 有没有更简单的遍历方法呢? 56 | - 还记得 items()这个函数么? 57 | - 好像返回值是可迭代对象 58 | 59 | ### items() 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633688784951) 62 | 63 | - 这个确实可以一把确认 key-value 64 | - 但是格式不能自定制 65 | - 我想要自定制输出格式 66 | - 这个返回值是一个元组 67 | - 我给他两个变量可以么? 68 | 69 | ### 输出格式 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633689334386) 72 | 73 | - 这个字典还是比较简单的 74 | - 我们试试比较复杂的字典 75 | 76 | ### continue 77 | 78 | - 如果小于 178 就忽略跳过 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633685001664) 81 | 82 | - continue 83 | - 结束本轮循环 84 | - 进入循环条件 85 | 86 | ### break 87 | 88 | - 如果找到大于等于 183 的就跳出 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633685217021) 91 | 92 | - 直接 break 跳出三界外 93 | - 不在循环中 94 | - 那么如果字典的 value 不是一个数字 95 | - 而是一个元组应该怎么办呢? 96 | 97 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633685502300) 98 | 99 | ### 遍历 100 | 101 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633685502300) 102 | 103 | - 元组里面两个元素 104 | - 女生身高 105 | - 男生身高 106 | - 我现在要找出所有女生身高高于 169 的 107 | 108 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633685695488) 109 | 110 | - 现在人越来越高 😌 111 | - 找出所有城市中女生身高最高的 112 | 113 | ### 查找 114 | 115 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211008-1633686169846) 116 | 117 | - 遍历整个字典 118 | - 然后找到身高最高城市 119 | - 但是如果我想要找到平均身高最高的城市呢? 120 | 121 | ### 再查找 122 | 123 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633819753680) 124 | 125 | ### 总结 126 | 127 | - 这次遍历了字典 128 | - 字典在 for 循环中的遍历中 129 | - 遍历的是字典的 keys() 130 | - 除了 keys()之外,还可以 131 | - 遍历 values() 132 | - 遍历 items() 133 | - keys()最简单明确 134 | - items()最全面 135 | - 好像形成 dict 字典的时候可以用一个 zip 函数 136 | - zip 函数怎么用来着?🤔 137 | - 下次再说 👋 138 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/138-234326-enumerate-编号.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # enumerate 编号 8 | 9 | ## 回忆 10 | 11 | - 上次研究了 zip 12 | - zip 是一个老裁缝 13 | - 几列可迭代对象可以用 zip 缝合为 zip 对象 14 | - zip 对象是可迭代的 15 | - zip 缝合的对象也可以解组为独立的几组元组 16 | - 其实还有一个 enumerate 函数好像也是编组 17 | - 有什么区别么?🤔 18 | 19 | ### 先查手册 20 | 21 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833065561) 22 | 23 | - 看起来是给一个可迭代对象缝上编号 24 | - 动手试试 25 | 26 | ### enumerate 27 | 28 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833106576) 29 | 30 | - 这很简单啊 31 | - 就是缝上编号啊 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633864607401) 34 | 35 | - 如果用 zip 应该怎么做呢? 36 | 37 | ### zip 方法 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833330678) 40 | 41 | - 如果我想从 1 开始呢? 42 | - 需要控制 range 的范围 43 | 44 | ### 控制开头 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833426125) 47 | 48 | - 使用 enumerate 可以控制起始数字么? 49 | 50 | ### 起始数字 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833726451) 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833736030) 55 | 56 | - 构造函数中的参数有个 start 57 | - start 指的是开始数字 58 | - 默认是从 0 开始 59 | - 不过不能设置步长 60 | - 如果想设置步长怎么办? 61 | 62 | ### 回忆步长 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211010-1633833993192) 65 | 66 | - 这样就可以把特定编号缝合到 iterable 的对象上去了 67 | 68 | ### 总结 69 | 70 | - 这次研究了 enumerate() 71 | - enumerate()是个特殊的 zip 函数 72 | - enumerate()把列表和编号缝在一起 73 | - 还可以设置起始值 start 74 | - 几列可迭代对象可以缝合成 zip 对象 75 | - enumerate 可以给缝合好的 zip 对象缝上编号 76 | - 这样可以把 zip 组转化为为有编号的 zip 组 77 | - 可迭代的可迭代对象有点像二位数组的感觉 78 | - 如何遍历二维数组呢??🤔 79 | - 下次再说 👋 80 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/140-234372-遍历文件流.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 二重循环 8 | 9 | ## 回忆 10 | 11 | - 上次研究了二重循环 12 | - 其实很简单 13 | - 就是用 for 或者 while 再循环里面 14 | - 再构建一个循环 15 | - 甚至可以做三重甚至更多重的循环 16 | - 其实还有一种可遍历的对象类型 17 | - 我们还没有做过 18 | - 那就是文件流对象 19 | - 这个东西怎么遍历??🤔 20 | 21 | ### 定义 22 | 23 | - 我们是怎么得到文件的呢? 24 | - 我们首先读一个文件 25 | - 然后看看这个文件具体是什么 type 的 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633956068396) 28 | 29 | - 什么是 TextIOWrapper 呢? 30 | 31 | ### TextIOWrapper 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633957157884) 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633957166532) 36 | 37 | - 继续往后翻 38 | 39 | ### iter 方法 40 | 41 | - 我找到了这个 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633957201999) 44 | 45 | - 这说明 TextIOWrapper 是一个可迭代的对象 46 | - 可以用 for 来遍历他 47 | 48 | ### 遍历 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633957276251) 51 | 52 | - 遍历很好用 53 | - 我们可以给他加一个编号么? 54 | 55 | ### 编号 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633957376053) 58 | 59 | - enumerate 就是给可迭代变量缝合一个编号 60 | - 那么我可以把纵向的列缝合到一起么? 61 | 62 | ### 准备缝合 zip 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633958241633) 65 | 66 | - 首先把文件制作为二位数组 67 | - 然后想办法缝合同一位置的元素 68 | - 其实是转置 69 | 70 | ### 缝合 zip 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633958317886) 73 | 74 | - 这样同声相应 同气相求 75 | - 同样类型的东西就映射到一起了 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211011-1633958585440) 78 | 79 | ### 总结 80 | 81 | - 这次研究了文件流对象的遍历 82 | - 文件流是一个 iterable 的对象 83 | - 可以用 for 来遍历他的每一行 84 | - for 我们已经学了不少东西 85 | - 在官方帮助里面怎么描述?🤔 86 | - 下次再说 👋 87 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/141-253312-for 的总结.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # for 的总结 8 | 9 | ## 回忆 10 | 11 | - 这次研究了文件流对象的遍历 12 | - 文件流是一个 iterable 的对象 13 | - 可以用 for 来遍历他的每一行 14 | - for 我们已经学了不少东西 15 | - 在官方帮助里面怎么描述?🤔 16 | 17 | ### 帮助手册 18 | 19 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635688113652) 20 | 21 | - 一般来说 for 是可以遍历一个可迭代对象或者一个迭代器 iterator 的 22 | - 迭代器产生了了这个表达式的 list 列表 23 | - suite 可以对于每一个迭代器产生的列表项执行 24 | - 执行的时候是有一个赋值过程的 25 | - target = expression_list[i] 26 | - 当所有迭代器生成的对象都被变了之后 27 | - 就运行 else 子句 28 | - 然后整个 for 语句结束 29 | - 感觉这个过程可以用 while 语句来替代 30 | 31 | ### 用 while 替代 for 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635688716607) 34 | 35 | - 万事万物都是双向的 36 | - 那么可以用 for 来替代 while 么? 37 | 38 | ### 用 for 来替代 while 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689002146) 41 | 42 | - 道理是一样的 43 | - 但是有的时候可能会用到 break、continue 44 | - 这两个在帮助手册里面如何描述? 45 | 46 | ### break 和 continue 47 | 48 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689108322) 49 | 50 | - break 51 | - 决绝地彻底斩断一切 52 | - 结束整个 for 语句 53 | - 后面的 else 也不执行 54 | - continue 55 | - 忽略本轮后面的代码 56 | - 如果本轮是最后一轮 57 | - 那么执行 else 子句 58 | 59 | ### 赋值 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689464642) 62 | 63 | - for 循环中每次 i 都会被重新赋值 64 | - 循环体中的赋值会被下一轮的循环赋值所覆盖 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689441288) 67 | 68 | - 这和 while 循环变量的控制方法不同 69 | - 循环之后,循环变量会留下来么? 70 | 71 | ### 循环之后 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689736374) 74 | 75 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689744882) 76 | 77 | - 应该会留下来 78 | - 除非这个可迭代对象是空的 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689802185) 81 | 82 | ### 循环中改变可迭代对象 83 | 84 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635689885990) 85 | 86 | - 这只能发生在可变的可迭代对象上 87 | - 比如说列表 88 | - 有一个计数器 counter 盯着当前的 target 89 | - 每次循环 counter 就递增 90 | - 直到到达了整个可迭代对象的边界 91 | - 如果删除元素可能会引起跳过某些元素 92 | - 我们来做一个试试 93 | 94 | ### 循环中删除 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635690182030) 97 | 98 | - 第三轮符合 if 条件 99 | - 删除 100 | - 删除之后 len(a)也从 5 到了 4 101 | - 所以 4 次之后就结束了 102 | - 循环中是否可以添加呢? 103 | 104 | ### 循环中添加 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635688745146) 107 | 108 | - 添加时可以的 109 | - 会增大循环次数 110 | - 甚至实现死循环的效果 111 | - 除了 append 在结尾添加之外 112 | - 可以 insert 在开头添加么? 113 | 114 | ### 在开头添加 115 | 116 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211031-1635688753097) 117 | 118 | - 在开头添加也是可以的 119 | - 不过要注意要把 if 的触发条件满足的那一项修改一下 120 | - 否则的话 121 | - 会形成无限次在开头插入的效果 122 | 123 | ### 总结 124 | 125 | - 这次研究了帮助手册中的 for 语句 126 | - 深入理解 127 | - for 还有什么可玩的么?🤔 128 | - 下次再说 👋 129 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/145-259389-循环总结.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 循环总结 8 | 9 | ## 回忆 10 | 11 | - 上次研究了字典推导式 12 | - 字典推导式本质上是集合推导式 13 | - 因为字典本质上是 key-value 的集合 14 | - 可以像列表推导式一样生成集合推导式 15 | - 可以用冒号(:)生成 key-value 对的集合推导式就是字典推导式 16 | - 这次我们来总结一下循环的概念 17 | 18 | ### 什么是循环 19 | 20 | - 任何一个复杂的系统都是由三种基本结构组成 21 | - 顺序结构 22 | - 分支结构 23 | - 循环结构 24 | - 顺序结构最简单,程序从上到下依次执行,就如同生活中一条笔直的大马路,一路畅行无阻; 25 | - 分支结构是指当程序执行到某步时,需根据实际情况选择性的执行某部分代码,就如同生活中的十字路口,需要根据具体情况选择走哪条路,每次只能选择一条路,不可能同时走多条路; 26 | - 循环结构是指重复执行某些代码,直到条件不满足为止,就如同生活中的盘山公路,一圈圈绕行,直到到达目的地为止。 27 | 28 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211231-1640920524549) 29 | 30 | ### 循环总结 31 | 32 | - 我们其实是从 while 语句开始的 33 | - 从死循环 34 | - 到循环条件 35 | - 从 break 跳出到 continue 继续 36 | - 还有不执行循环时执行的 else 37 | - 然后进入 for 循环 38 | - 循环可迭代对象 39 | - 线性的(元组/列表/字符串/二进制序列) 40 | - 集合类 41 | - 映射类(字典) 42 | - 各种辅助数据类型 43 | - 缝合器 zip 44 | - 编号 enumerate 45 | - 二重甚至多重循环 46 | - 三种推导式 47 | - 列表 48 | - 集合 49 | - 字典 50 | - 推导式其实可以转化为不加糖的一般形式 51 | 52 | ### 实际应用 53 | 54 | ```python 55 | print('\n'.join([''.join([('IloveU'[(x-y)%len('IloveU')]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30)])for y in range(15,-15,-1)])) 56 | ``` 57 | 58 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211227-1640569282424) 59 | 60 | - 这例子如果转化为普通的循环的形式什么样呢? 61 | 62 | ### 普通形式 63 | 64 | ```python 65 | import time 66 | sentence = "Dear, I love you forever!" 67 | for char in sentence.split(): 68 | allChar = [] 69 | for y in range(12, -12, -1): 70 | lst = [] 71 | lst_con = '' 72 | for x in range(-30, 30): 73 | formula = ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 74 | if formula <= 0: 75 | lst_con += char[(x) % len(char)] 76 | else: 77 | lst_con += ' ' 78 | lst.append(lst_con) 79 | allChar += lst 80 | print('\n'.join(allChar)) 81 | time.sleep(1) 82 | ``` 83 | 84 | - 这里面的 for、if 包括 while 其实都属于复合语句 85 | - compand statements 86 | - 这复合语句又是什么意思呢? 87 | 88 | ### 复合语句总结 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211107-1636285432910) 91 | 92 | - if、while 语句是实现传统流程控制的语句 93 | - try 描述了异常,并给出异常处理方法 94 | - with 语句描述了一系列语句的初始条件和结束时要释放的资源 95 | - 复合语句包括一系列的子句 96 | - 每一个子句头都是一个唯一的关键字 97 | - 结尾都是冒号 98 | - 子句里面有好多语句 99 | 100 | ### 大中小 101 | 102 | - 大括号 - 集合推导式、字典推导式 103 | - 中括号 - 列表推导式 104 | - 小括号 - ? 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211231-1640919600051) 107 | 108 | - 小括号可以得到一个生成器函数 109 | - 那什么是函数呢? 110 | - 下次再说 👋 111 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/146-259358-字符串 raw.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 实验标题 8 | 9 | ## 实验介绍 10 | 11 | 这是一段示例实验介绍。 12 | 13 | #### 知识点 14 | 15 | - 知识点 1 16 | - 知识点 2 17 | 18 | ## 正文标题 19 | 20 | 这是一段示例正文内容。 21 | 22 | ## 实验总结 23 | 24 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211105-1636123930333) 25 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/148-192576-requests-模块.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 导入 request 包 8 | 9 | ## 新的开始 10 | 11 | - 我们安装了 nginx 服务器 12 | - 使用浏览器访问了服务器上的网页 13 | - 网页有各种状态 14 | - 200 成功 15 | - 304 未改变 16 | - 404 找不到 17 | - 可是这个爬虫怎么搞呢?🤣 18 | 19 | ### 过程 20 | 21 | - 浏览的过程是 22 | - 浏览器在客户机上发出请求 request 23 | - 服务器接收请求返回 response 24 | - 浏览器打开 response 并渲染成页面 25 | 26 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412050376) 27 | 28 | - 爬虫其实就是用代码完成这样一个 http 过程 29 | - 客户机能让浏览器发请求就能让爬虫发请求 30 | - 反正都是 0101 的代码 31 | 32 | ### 请求 requests 33 | 34 | - 先从 requests 开始 35 | - 导入这个包 36 | - 如果没有的话要先下载 37 | - pip3 install requests 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412431769) 40 | 41 | ### 查看帮助 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630404683669) 44 | 45 | ### 照猫画虎 46 | 47 | ``` 48 | import requests 49 | response = requests.get("http://localhost/") 50 | ``` 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412591560) 53 | 54 | - 好像返回了 200 的状态码 55 | - 这个 r 到底是什么呢? 56 | 57 | ### Response 响应 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412645897) 60 | 61 | - 原来是一个 response 类的对象 62 | - help 一下 63 | 64 | ### Response 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412922346) 67 | 68 | - Response 对象 包括了一个 http 请求的返回结果 69 | - help 他一下 70 | - help(requests.models.Response) 71 | 72 | ### 只读对象 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630412969842) 75 | 76 | - content 就是可以读出来的内容 77 | - 返回的是字节序列 78 | - 如果我只想要文本怎么办呢? 79 | 80 | ### 文本 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211015-1634305462282) 83 | 84 | - 来看看 r.text 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211015-1634305478003) 87 | 88 | - 他们都是什么类型的呢? 89 | 90 | ### 对比 91 | 92 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211016-1634396395638) 93 | 94 | - content 和 text 95 | - content 是 字节序列 96 | - text 是 字符串序列 97 | 98 | ### 明确 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210831-1630413092545) 101 | 102 | - 通过变量名的前缀明确这两个变量 103 | 104 | ``` 105 | import requests 106 | response = requests.get("http://localhost/") 107 | b_html = response.content 108 | s_html = response.text 109 | ``` 110 | 111 | - 那这个字节序列和字符串之间可以相互转化么? 112 | 113 | ### 转化 114 | 115 | - 字节序列和字符串的转化就是编码和解码 116 | 117 | - 字节序列解码 decode 之后得到字符串 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211016-1634396452318) 120 | 121 | - 字符串 encode 编码之后得到字节序列 122 | 123 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211016-1634396459875) 124 | 125 | ## 总结 126 | 127 | - 导入了 requests 模块 128 | - 完成了 http get 的过程 129 | - 发出了 request 130 | - 得到了 response 131 | - 状态码 200 132 | - 但是读到的内容是 133 | - 字节序列 134 | - 字符串序列 135 | - 如何解析 html 语言呢?🤔 136 | - 下次再说 137 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/151-192644-lxml-文本-text.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 语法 html 属性 text 文本 8 | 9 | ## 回忆 10 | 11 | - 了解 etree 中的元素关系 12 | - 父子 13 | - 兄弟 14 | - 了解元素的标签成员 15 | - tag 16 | - 了解元素中的属性组成员 17 | - attrib 18 | - 属性对象本质是一个字典 19 | - 可以用 get 和索引的方式得到具体的值 20 | - 使用 get 的方式更安全 21 | - 除了标签和属性组成员之外 22 | - 元素类还有文本成员 23 | - 这文本成员怎么理解?🤔 24 | 25 | ### 文本 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462348659) 28 | 29 | - text 文本是 etree 元素的一个成员变量 30 | - 就像 tag 是 etree 元素的一个成员变量一样 31 | - 就像 attrib 是 etree 元素的一个成员变量一样 32 | - text 成员变量的类型是字符串 33 | 34 | ### 动手 35 | 36 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462577839) 37 | 38 | - 可以看到设置了 title 元素的 text 成员 39 | - 标签不仅仅是标签本身 40 | - 开始结束标签里面还有了 text 文本 41 | 42 | ### 追加 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462571298) 45 | 46 | - 可以在元素后面追加个尾巴 tail 47 | - tail 就像 text 48 | - 也是元素的成员变量 49 | - 也是字符串类型的 50 | - 只不过在元素结束标签的后面 51 | 52 | ### 动手 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462713034) 55 | 56 | - 可以用 tail 成员再元素后面追加文本内容 57 | - 也可以在 tostring 函数中 58 | - 用 with_tail=False 参数控制 tail 成员不显示 59 | 60 | ### 转化为文本 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462753784) 63 | 64 | - 看起来这就是不显示标签 65 | - 只显示 text 和 tail 的样子 66 | - 自己动手试试 67 | 68 | ### 动手 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462836223) 71 | 72 | - 确实如此 73 | - 在 etree.tostring()函数中使用 74 | - method = "text" 参数可以只输出文本 75 | - 而不输出标签 76 | - 可以添加 tail 77 | - 就可以取消 tail 78 | 79 | ### 取消 80 | 81 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210901-1630462895805) 82 | 83 | - et_ul.tail = "" 84 | - 可以让这个 tail 成员变成一个空串 85 | - 那 ul 元素后面就没有附加的字符串了 86 | 87 | ## 总结 88 | 89 | - 了解 etree 中的元素的文本成员变量 90 | - text - 字符串类型 91 | - tail - 字符串类型 92 | - 就像原来学的 etree 元素中的成员变量 93 | - tag - 字符串类型 94 | - attrib - 字典类型 95 | - 还可以设置 etree 元素的成员变量 text 96 | - tostring 函数有一些参数可以控制输出 97 | - method = "text" 可以控制输出结果只包含 text 和 tail 98 | - with_tail = False 可以控制输出结果不包含 tail 99 | - pretty_print = True 可以控制输出结果包含缩进信息 100 | - 我们已经在内存构建了一棵树了 101 | - 但是如何遍历这棵树呢?🤔 102 | - 下次再说 103 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/164-250391-爬取图片.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 爬取百度指数 8 | 9 | ## 回忆 10 | 11 | - 这次爬了百度指数 12 | - 可以通过时间维度进行分割 13 | - 也可以通过空间维度进行分割 14 | - 重要的是能够到网上查找源代码 15 | - 这很酷啊 16 | - 还能爬点什么呢?🤔 17 | - 这次我想爬取图片 18 | 19 | ### 向日葵八号 20 | 21 | - 向日葵八号是一颗日本的气象卫星 22 | - 可以在上面找到实时的卫星云图 23 | - https://himawari8.nict.go.jp/ 24 | 25 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635391234830) 26 | 27 | ### 分析 28 | 29 | - 选择一个具体的时间和日期 30 | - F12 检查元素 31 | - 筛选出图片的地址 32 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635391597013) 33 | 34 | - 我们可以看到这是一张缩略图 35 | - 注意他地址所对应的时间是本初子午线的时间 36 | - 而不是我们所在时区的时间 37 | - 我们可以直接 get 到他么? 38 | 39 | ### 直接打开 40 | 41 | - 我们在浏览器中可以直接打开 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635391477515) 44 | 45 | - 甚至可以直接用 wget 的方式获得 46 | 47 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635391639369) 48 | 49 | - 那可以访问到以前的图片么? 50 | 51 | ### 以前的图片 52 | 53 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635391714472) 54 | 55 | - 貌似也可以用 wget 取得 56 | - 那其实也就不用假装成浏览器了 57 | - 因为用脚本写一个循环然后 wget 就直接得到了 58 | - 但是其中要使用到日期的递增 59 | 60 | ### 试试 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635392130928) 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635392166833) 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635392455882) 67 | 68 | ### 遍历日期 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635392472784) 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635392676159) 73 | 74 | ### 书写代码 75 | 76 | ```python 77 | import os 78 | import datetime 79 | day = datetime.date(2020,1,1) 80 | delta = datetime.timedelta(1) 81 | while day.year < 2021: 82 | str= "https://himawari8.nict.go.jp/img/D531106/1d/550/" \ 83 | + str(day.year) + "/" \ 84 | + "%02d"%day.month +"/" \ 85 | + "%02d"%day.day + "/" \ 86 | + "030000_0_0.png" 87 | os.system("wget "+str) 88 | ``` 89 | 90 | - 测试之后 91 | - 证明是好用的 92 | - 但是这个太空中拍摄的图有点看不清地面 93 | - 可以和地面结合起来么? 94 | 95 | ### 寻找 96 | 97 | http://agora.ex.nii.ac.jp/cgi-bin/dt/create_index.pl?lang=ja&year=2021&month=10&day=27&hour=3&basin=wnp&tz=utc 98 | 99 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635395467310) 100 | 101 | - 这个网站上的图片效果不错 102 | 103 | ### 找到地址 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635395595619) 106 | 107 | - http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2021/512x512/HMW821102703.globe.1.jpg 108 | - 分析文件名 109 | - HMW8 向日葵 8 号 110 | - 211027 日期 111 | - 03 地球标准时间(本初子午线) 112 | - 这个情况也可以用 wget 的方式得到 113 | 114 | ### 总结 115 | 116 | - 这次爬了卫星 117 | - 卫星云图具有相应的规律 118 | - 可以通过分析 url 把图片一张张 wget 下来 119 | - 这其实并不是真正的爬取 120 | - 如何通过模拟浏览器来进行爬取呢?🤔 121 | - 下次再说 122 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/165-252877-爬取图片进阶.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 爬取图片进阶 8 | 9 | ## 回忆 10 | 11 | - 上次爬了卫星 12 | - 卫星云图具有相应的规律 13 | - 可以通过分析 url 把图片一张张 wget 下来 14 | - 这其实并不是真正的爬取 15 | - 如何通过模拟浏览器来进行爬取呢?🤔 16 | - 我们这次来爬取纸飞机 17 | 18 | ### 浏览 19 | 20 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635405717917) 21 | 22 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635405726705) 23 | 24 | - 这个网站对于爬虫还是比较友好的 25 | 26 | ### 设置 xpath 27 | 28 | ```python 29 | import requests 30 | from lxml import etree 31 | response = requests.get("https://www.foldnfly.com/") 32 | et_html = etree.HTML(response.content) 33 | list_pa = et_html.xpath("/html/body/main/div/div[2]/div[2]/div[1]/div/div/a") 34 | url = "https://www.foldnfly.com/" + list_pa[0].get("href") 35 | name = list_pa[0].xpath("b")[0].text 36 | print(url,name) 37 | ``` 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635406923686) 40 | 41 | ### 开始遍历 42 | 43 | ```python 44 | import requests 45 | from lxml import etree 46 | response = requests.get("https://www.foldnfly.com/") 47 | et_html = etree.HTML(response.content) 48 | list_pa = et_html.xpath("/html/body/main/div/div[2]/div[2]/div[1]/div/div/a") 49 | url = "https://www.foldnfly.com/" + list_pa[0].get("href") 50 | name = list_pa[0].xpath("b")[0].text 51 | print(url,name) 52 | ``` 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635407157808) 55 | 56 | ### 爬取过程 57 | 58 | ``` 59 | import os 60 | import requests 61 | from lxml import etree 62 | response = requests.get("https://www.foldnfly.com/") 63 | et_html = etree.HTML(response.content) 64 | list_pa = et_html.xpath("/html/body/main/div/div[2]/div[2]/div[1]/div/div/a") 65 | plane_no = 1 66 | for anchor in list_pa: 67 | name = "%02d"%plane_no + "_" + anchor.xpath("b")[0].text.replace(" ","") 68 | os.system("mkdir " + name) 69 | print(name) 70 | url = "https://www.foldnfly.com/" + anchor.get("href") 71 | response2 = requests.get(url) 72 | et_html2 = etree.HTML(response2.content) 73 | list_pic = et_html2.xpath("body/main/div/div[2]/div/div[1]/div/picture/source/source/img") 74 | #print(list_pic) 75 | pic_no = 0 76 | for pic in list_pic: 77 | print(pic.get("src")) 78 | response3 = requests.get(pic.get("src")) 79 | with open(name + "/" + str(pic_no) + ".jpg","wb") as f: 80 | f.write(response3.content) 81 | pic_no += 1 82 | plane_no += 1 83 | ``` 84 | 85 | - 这里需要注意 86 | - 图片地址选取的时候 img 是在 source 里面的 87 | - 但是浏览器和 xpath 好像对于 source 标签支持不好 88 | - 于是我把那两层的 source 换成了// 89 | - 或者手动写清楚 90 | - 就可以爬取到了 91 | - 一层一层尝试 92 | - 一层成功了再进入下一层 93 | 94 | ### 输出结果 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211028-1635417374773) 97 | 98 | - 观察到纸飞机图片来自于一个图床 99 | - 图片本身命名具有较强的规律 100 | 101 | ### 总结 102 | 103 | - 这次爬了纸飞机的网站 104 | - 从首页爬到内容页 105 | - 从内容页第一个示例图开始 106 | - 一个个地遍历 107 | - 经过二重循环完成任务 108 | - 到最后才发现图像的普遍性规律 109 | - 不过有的网站中的图片是嵌入到网页中的 110 | - 这种情况怎么办呢?🤔 111 | - 下次再说 112 | -------------------------------------------------------------------------------- /3584-Oeasy-教您玩转-Python-free/README.md: -------------------------------------------------------------------------------- 1 | # Oeasy 教您玩转 Python 2 | 3 | 简明易懂的 Python3 课程。从零开始,在 Linux 环境中使用 Vim,一步步带你玩转脚本语言 Python,感受编程的乐趣。 4 | 5 | - 作者: [oeasy](https://www.lanqiao.cn/users/1190679/) 6 | - 链接: https://www.lanqiao.cn/courses/3584 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1642383644527_a8307857e9d44f990f5f6263c74c28d0) 9 | -------------------------------------------------------------------------------- /37-HBASE-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # HBASE 基础入门 2 | 3 | HBase 是一个开源的非关系型分布式数据库,是 Hadoop 项目的一部分,运行于 HDFS 文件系统之上,为 Hadoop 提供类似于 BigTable 规模的服务。 4 | 5 | - 作者: [牧云 Melanie](https://www.lanqiao.cn/users/225160/) 6 | - 链接: https://www.lanqiao.cn/courses/37 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1529569045568.png) 9 | -------------------------------------------------------------------------------- /3821-Java-新手入门课-free/06-121605-逢 7 就跳过.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:逢 7 就跳过 2 | 3 | ## 介绍 4 | 5 | 不知道你有没有玩过“逢 7 过”的游戏,游戏规则很简单: 6 | 7 | 几个人轮流报数,凡遇到 7 的倍数,或含 7 的数字就要跳过,否则就算失败。 8 | 9 | 今天我们就用 Java 来打印 1 到 100 之间,所有满足条件的数字。 10 | 11 | ![图片描述](https://doc.shiyanlou.com/courses/uid8504-20190522-1558521315468) 12 | 13 | ## 知识点 14 | 15 | - Java 开发环境 16 | - 变量 17 | - 数据类型 18 | - 运算符 19 | - 流程控制语句 20 | 21 | ## 目标 22 | 23 | 1. 请在 `/home/shiyanlou/Code` 目录下创建 `Jump7.java` 文件(请确保目录正确,否则无法通过挑战) 24 | 2. 在文件中写入代码,打印 1 到 100 之间(包含 1 和 100),不是 7 的倍数、且不含 7 的数字,每行打印一个数字。 25 | 3. 完成挑战后,点击右侧工具栏的「 下载代码 」,把代码下载到本地, **我们在下个挑战中还会用到这段代码**。 26 | 27 | ## 样例 28 | 29 | ![图片描述](https://doc.shiyanlou.com/courses/3821/1656046/5f0f360c17bac62d585846131660f3fd-0/wm) 30 | 31 | ## 提示 32 | 33 | **⚠️ 前方高能,有剧透风险,喜欢挑战的同学请先独立思考,然后借着百度、谷歌来解出题目。** 34 | 35 | 在实际的开发工作中,大部分工作也是靠着经验 + 思考 + 搜索引擎来完成的,你可以提前熟悉这个感觉。 36 | 37 | #### 💡(一) 38 | 39 | 开发中,我们经常要先构思框架,再优化功能。 40 | 41 | 所以在这个挑战中,你可以先用循环,写出打印出 1 到 100 间的数字的程序,之后再往里面加条件判断。 42 | 43 | #### 💡(二) 44 | 45 | 7 的倍数,可以理解为除以 7 余数为 0 的数; 46 | 47 | ```java 48 | a % 7 == 0 49 | ``` 50 | 51 | 在 1 到 100 这个区间里: 52 | 53 | - 个位上是 7 的数,即除以 10 余 7 的数; 54 | 55 | ```java 56 | a % 10 == 7 57 | ``` 58 | 59 | - 十位上是 7 的数,即除以 10 取整数为 7 的数。 60 | 61 | ```java 62 | a / 10 == 7 63 | ``` 64 | 65 | 如果满足这些条件,就跳过;如不满足,则打印。可以用 `if` 或 `||` 来加判定条件~ 66 | 67 | #### 💡(三) 68 | 69 | **请保证文件名和存储路径都满足题目要求。** 70 | 71 | 一定要勇于挑战自己,如果挑战无法完成请**再次复习**前面的实验后试一试。如果完全没有思路,再点开查看参考答案哦! 72 | 73 | PS:完成挑战后,不妨尝试一下~如果有什么问题,记得在群里和小伙伴们讨论一下。 74 | 75 |
76 | 参考答案 77 |

使用 while:

78 |

 79 | public class Jump7{
 80 | 	public static void main(String[] args){
 81 | 		int i = 0;
 82 |         while(i < 100) {
 83 |             i++;	
 84 |             if(i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
 85 |                 continue;			
 86 |             }
 87 |             System.out.println(i);	
 88 |         }
 89 | 	}
 90 | }
 91 |    
92 |

使用 for:

93 |

 94 | public class Jump7{
 95 | 	public static void main(String[] args){
 96 |         for(int i = 1; i <= 100; i++) {
 97 |             if(i % 7 == 0 || i % 10 == 7 || i / 10 == 7) {
 98 |                 continue;
 99 |             }	
100 |             System.out.println(i);
101 |         }
102 | 	}
103 | }
104 |    
105 |
106 | -------------------------------------------------------------------------------- /3821-Java-新手入门课-free/08-121607-最终挑战:提交代码.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:提交我的代码 2 | 3 | ## 介绍 4 | 5 | 我们已经有了 GitHub 账号,现在需要你能新建一个仓库,并向仓库中提交上一个挑战的代码。你需要完整地执行一次对 GitHub 仓库的创建、克隆、提交、推送操作。 6 | 7 | ## 知识点 8 | 9 | - GitHub 操作 10 | - git clone 11 | - git add 12 | - git commit 13 | - git push 14 | 15 | ## 目标 16 | 17 | 1. 在自己电脑中的浏览器上打开 GitHub 页面,登录账号后创建 `shiyanlou-code` 仓库。 18 | 2. 在实验环境中,克隆你的仓库到 `/home/shiyanlou/Code` 目录下。 19 | 3. 进入 `cd /home/shiyanlou/Code/shiyanlou-code` 中,新建 `Jump7.java` 文件,并把你上个挑战的通过代码,复制进文件中保存。 20 | 4. 将全部修改添加到暂存区、创建提交、推送到自己的 GitHub 远程 `shiyanlou-code` 仓库 21 | 5. 本挑战没有标准答案,完成整个上传仓库的流程即可。 22 | 23 | ## 提示语 24 | 25 | 1. `git clone https://github.com/你的GitHub账号/仓库名称` 克隆仓库 26 | 2. 用右侧工具栏的「剪切板」,可以复制代码。 27 | 3. `git add .` 添加修改到暂存区 28 | 4. `git commit -m 备注信息` 创建新的提交版本 29 | 5. `git push` 将提交推送到远程仓库 30 | -------------------------------------------------------------------------------- /3821-Java-新手入门课-free/09-121608-不是结束,而是开始.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 结束语 8 | 9 | ## 不是结束而是开始 10 | 11 | Java 新手入门课程已经结束了,但学习 Java 的路途还很漫长,你才刚刚踏入编程之路,学精学透还需付出更多的努力,**但我们都知道:前途是光明的。** 12 | 13 | 不过一想到,刚来到这里一脸迷茫的你,现在已经可以写出简单的程序,并有了自己的 GitHub 主页了……老师们就欣慰多了。 14 | 15 | 还记得我们的学习方法吗? 16 | 17 | **多写代码 -->> 多思考 -->> 多总结** 18 | 19 | **我们的入门课其实就是送给你一把开启 Java 编程大门的钥匙,让你可以在编程道路上走的更远,建造起自己的高楼大厦。** 20 | 21 | ## 职业道路 22 | 23 | **互联网的发展让真正的技术人才从来不缺好薪水和好职位。** IT 领域的待遇是相当可观的。 24 | 25 | 由于技术的划分,IT 工程师可分为 **研发、测试、运维、DBA 几个大类**,研发工程师又可以分成 **Python、Java、机器学习、C++、C#、Web 前端、Android、iOS 等**。其中,Java 的就业面是最广的,可以做后端开发工程师、前端开发工程、大数据工程师、数据挖掘工程师、数据分析师、测试工程师,运维工程师等等工作。 26 | 27 | 虽然现在是个开放的年代,各个公司都在不拘一格的招纳贤才,**但是真正能动手做事的工程师才是企业的最爱,华而不实的总会被淘汰。**每种职位虽然看上去都是不同的职业发展道路,IT 或程序的思维都是相通的,职位互相之间转换也经常发生,拥有丰富的实践经验永远是应聘成功的重要因素。 28 | 29 | 我们都是喜欢 IT,喜欢计算机,才想要从事这个行业,而不是因为待遇可观这种因素才选择。在电影《编舟记》中,房东看见主人公为编写一部字典彻夜翻看资料的时候,就说道:**“年轻的时候就能找到自己喜欢并且干一辈子的事情是多么幸福多么令人羡慕啊。”** 30 | 31 | **新手课程虽然结束,但编程之旅才刚刚开始。希望大家都能在蓝桥云课成长为有真才实学的 Coder,未来加油!** 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid8504-20190429-1556517671776) 34 | -------------------------------------------------------------------------------- /3821-Java-新手入门课-free/README.md: -------------------------------------------------------------------------------- 1 | # Java 新手入门课 2 | 3 | 极度舒适的 Java 新手入门课程,面向完全没有编程基础的同学。你将在一下午入门 Linux、Java 基础和 Github 常用命令,为未来的编程大楼打下稳固的基础。 4 | 5 | - 作者: [taotao](https://www.lanqiao.cn/users/1700764/) 6 | - 链接: https://www.lanqiao.cn/courses/3821 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid214893-20210422-1619056237904) 9 | -------------------------------------------------------------------------------- /39-Apache-Mahout-基础入门-free/01-785-Mahout 简介.sy.md: -------------------------------------------------------------------------------- 1 | # Mahout 简介 2 | 3 | ## 一、实验介绍 4 | 5 | ### 1.1 实验内容 6 | 7 | > - Mahout 简介 8 | 9 | - Mahout 历史 10 | - Mahout 特性 11 | - Mahout 应用场景 12 | 13 | ### 1.2 实验知识点 14 | 15 | - 了解 Mahout 的历史,特性,应用场景 16 | 17 | ### 1.3 实验环境 18 | 19 | - hadoop1.2.1 20 | - Mahout0.9 21 | - Xfce 终端 22 | 23 | ### 1.4 适合人群 24 | 25 | 本课程难度为一般,属于初级级别课程,适合具有 linux 基础的用户。 26 | 27 | ## 二、Mahout 28 | 29 | ### 2.1 Mahout 简介 30 | 31 | Apache Mahout 起源于 2008 年,它是 Apache Software Foundation (ASF) 开发的一个全新的开源项目,其主要目标是创建一些可伸缩的 `机器学习算法`,供开发人员在 Apache 许可下免费使用。Mahout 包含许多实现,包括集群、分类、CP 和进化程序。此外,通过使用 Apache Hadoop 库,Mahout 可以有效地扩展到云中。 32 | 33 | ### 2.2 Mahout 历史 34 | 35 | Mahout 项目是由 Apache Lucene(开源搜索)社区中对机器学习感兴趣的一些成员发起的,他们希望建立一个可靠、文档翔实、可伸缩的项目,在其中实现一些常见的用于集群和分类的机器学习算法。该社区最初基于 Ng et al. 的文章 “Map-Reduce for Machine Learning on Multicore”, 但此后在发展中又并入了更多广泛的机器学习方法。Mahout 的目标还包括: 36 | 37 | - 建立一个用户和贡献者社区,使代码不必依赖于特定贡献者的参与或任何特定公司和大学的资金。 38 | 39 | - 专注于实际用例,这与高新技术研究及未经验证的技巧相反。 40 | 41 | - 提供高质量文章和示例。 42 | 43 | ### 2.3 Mahout 特性 44 | 45 | 虽然在开源领域中相对较为年轻,但 Mahout 已经提供了大量功能,特别是在集群和 CF(Collaborative Filtering, 协作筛选) 方面。Mahout 的主要特性包括: 46 | 47 | - Taste CF. Taste 是 Sean Owen 在 SourceForge 上发起的一个针对 CF 的开源项目,并在 2008 年被赠予 Mahout. 48 | 49 | - 一些支持 Map-Reduce 的集群实现包括 k-Means、模糊 k-Means、Canopy、Dirichlet 和 Mean-Shift. 50 | 51 | - Distributed Naive Bayes 和 Complementary Naive Bayes 分类实现。 52 | 53 | - 针对进化编程的分布式适用性功能。 54 | 55 | - Matrix 和矢量库。 56 | 57 | - 上述算法的示例。 58 | 59 | ### 2.4 Mahout 应用场景 60 | 61 | Mahout 为推荐引擎提供了一些可扩展的机器学习领域的经典算法实现, 62 | 可以使开发人员更为快捷的创建智能应用程序。 63 | 64 | 例如最经典的就是各种推荐系统,像购物网站上的相关物品推荐,可以根据用户的浏览记录或者购物记录来推荐用户可能感兴趣的商品: 65 | 66 | ![图片描述信息](https://doc.shiyanlou.com/userid46108labid785time1427765633901/wm) 67 | 68 | ## 三、实验总结 69 | 70 | > 本次实验是对 Mahout 的简介。介绍了什么是 Mahout, Mahout 的特性和使用场景等等。 71 | 72 | ## 四、参考文档 73 | 74 | > - 《Hadoop 实战 第 2 版》陆嘉恒,机械工业出版社; 75 | > - [Apache Mahout 简介](http://www.ibm.com/developerworks/cn/java/j-mahout/) 76 | -------------------------------------------------------------------------------- /39-Apache-Mahout-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Apache Mahout 基础入门 2 | 3 | Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。本课程难度为简单,属于入门级别课程,适合本课程难度为一般,属于初级级别课程,适合具有 hadoop 基础的用户。 4 | 5 | - 作者: [henng](https://www.lanqiao.cn/users/46108/) 6 | - 链接: https://www.lanqiao.cn/courses/39 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn39.jpg) 9 | -------------------------------------------------------------------------------- /3946-Python 3 新特性快速上手-free/03-137599-更好的错误信息.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 更好的错误信息 8 | 9 | ## 实验介绍 10 | 11 | Python3.10 对错误信息进行了优化,我们主要将关注语法错误、缩进错误、属性错误、命名错误,我们分别举几个例子,让大家了解 Python3.10 的进步。 12 | 13 | #### 知识点 14 | 15 | - 语法错误 16 | - 缩进错误 17 | - 属性错误 18 | - 命名错误 19 | 20 | ## 语法错误(SyntaxErrors) 21 | 22 | #### 字典未关闭 23 | 24 | 当解析包含未关闭的括号或方括号的代码时,解释器现在将提醒未关闭括号的位置。 25 | 26 | 我们新建一个 `example.py` 文件,写入下面的代码: 27 | 28 | ```python 29 | #example.py 30 | expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, 31 | 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, 32 | ``` 33 | 34 | 大家应该注意到了,我们故意没有在字典右侧加上括号去关闭它。 35 | 36 | 首先,我们在终端中用 Python3.8 运行这个文件,系统已安装 python3.8,可以直接运行。 37 | 38 | ```bash 39 | python3.8 example.py 40 | ``` 41 | 42 | 运行效果如下: 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622103199066) 45 | 46 | 可以看到,Python3.8 的错误信息不够明确。 47 | 48 | 然后我们使用 Python3.10 运行这个文件: 49 | 50 | ```bash 51 | python3.10 example.py 52 | ``` 53 | 54 | 运行效果如下: 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622103171914) 57 | 58 | 可以看到,Python3.10 直接提醒我们没有关闭字典。 59 | 60 | #### 缺号冒号 61 | 62 | 如果我们在运行代码时缺少选择结构的冒号,就会报错。 63 | 64 | ```python 65 | if 5>3 66 | ``` 67 | 68 | 我们首先在 Python3.8 中运行我们的代码,运行效果如下: 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622103785706) 71 | 72 | 可以看到,Python3.8 的错误信息不够明确。 73 | 74 | 然后在 Python3.10 中运行我们的代码: 75 | 76 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622103859825) 77 | 78 | 可以看到,Python3.10 中会提醒我们缺少冒号。 79 | 80 | #### 在本该用 == 进行比较时错用 = 81 | 82 | ```python 83 | '5' = 5 84 | ``` 85 | 86 | 用 Python3.8 运行效果如下: 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622104450787) 89 | 90 | 可以看到,Python3.8 的错误信息不够明确。 91 | 92 | 用 Python3.10 运行效果如下: 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622104484383) 95 | 96 | 可以看到,Python3.10 提醒我们使用 == 替换 = 97 | 98 | ## 缩进错误(IndentationErrors) 99 | 100 | Python3.10 对缩进错误也进行了更好的捕捉反馈 101 | 102 | ```python 103 | def foo(): 104 | if 5>3: 105 | print('yes') 106 | ``` 107 | 108 | Python3.8 运行效果如下: 109 | 110 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622105341027) 111 | 112 | 可以看到,Python3.8 已经有不错的错误提醒 113 | 114 | Python3.10 运行效果如下: 115 | 116 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622105437089) 117 | 118 | 可以看到,Python3.10 提醒我们缩进问题时会有更多信息。 119 | 120 | ## 属性错误(AttributeErrors) 121 | 122 | 在 Python3.10 中,我们使用方法属性错误时,解释器会猜测我们其实想要使用的是什么,并做出提醒,比如我们故意把列表的 append 方法写成 appendd,运行效果如下: 123 | 124 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622105671715) 125 | 126 | ## 命名错误(NameErrors) 127 | 128 | 在 Python3.10 中,我们引用变量名错误时,解释器也会做出提醒。 129 | 130 | ```python 131 | website_name = 'lanqiao' 132 | website_nome #故意写错一个字母 133 | ``` 134 | 135 | 运行效果如下: 136 | 137 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622106175382) 138 | 139 | ## 实验总结 140 | 141 | Python3.10 对错误信息进行了优化,在语法错误、缩进错误、属性错误、命名错误等多个方面都进行了优化,错误信息能够帮助我们更好的调试代码,更快的修复 bug。 142 | -------------------------------------------------------------------------------- /3946-Python 3 新特性快速上手-free/04-137603-与类型提示相关的新功能.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 与类型提示相关的新功能 8 | 9 | ## 实验介绍 10 | 11 | 类型提示又叫类型声明、类型标注、类型注释,从 Python3.5 开始正式引入 typing 模块,从 Python3.6 开始已经获得全面的类型声明的支持,当然这一支持也在不断的进步,本节将介绍在 Python3.10 中关于类型提示方面的主要变化。 12 | 13 | #### 知识点 14 | 15 | - Union 操作符 16 | - 类型别名 17 | 18 | ## Union 操作符(Union Operator) 19 | 20 | 在以前的 Python 版本中,要想添加多种类型参数提醒,需要使用 typing.Union 方法: 21 | 22 | ```python 23 | from typing import Union 24 | def square(number: Union[int, float]) -> Union[int, float]: 25 | return number ** 2 26 | ``` 27 | 28 | 现在可以以更简洁的方式编写类型提示: 29 | 30 | ```python 31 | def square(number: int | float) -> int | float: 32 | return number ** 2 33 | ``` 34 | 35 | 这种用法在 isinstance 函数中也可以使用 36 | 37 | ```python 38 | isinstance(1, int | str) 39 | ``` 40 | 41 | 运行效果如下: 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210528-1622190174832) 44 | 45 | ## 类型别名(Type Aliases) 46 | 47 | 在 Python 的早期版本中,增加了类型别名,以允许我们创建表示用户定义类型的别名。 48 | 49 | ```python 50 | MyType = str 51 | def foo(something: MyType) -> MyType: 52 | return something 53 | ``` 54 | 55 | 在 Python3.10 中,类型别名的语法将改为: 56 | 57 | ```python 58 | from typing import TypeAlias 59 | MyType: TypeAlias = str 60 | def foo(something: MyType) -> MyType: 61 | return something 62 | ``` 63 | 64 | ## 实验总结 65 | 66 | 在复杂的代码库中,类型提示往往可以极大地提高可读性。当然,并不是每个开发者都想使用类型注释,因此 Python 这种动态语言将其设计为可选的功能。当然,越来越多的开发者已经开始大规模使用类型提示。本章节主要介绍了 Python3.10 中新增的 Union 操作符和类型别名。 67 | -------------------------------------------------------------------------------- /3946-Python 3 新特性快速上手-free/05-137604-其他新功能.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 其他新功能 8 | 9 | ## 实验介绍 10 | 11 | Python3.10 还增加了很多新功能以及内置模块的更新、优化,下面再简单介绍几个有趣的改进。 12 | 13 | #### 知识点 14 | 15 | - 带括号的上下文管理器 16 | - 向 zip 添加可选的长度检查 17 | - 字典视图映射 18 | - bit_count 属性 19 | 20 | ## 带括号的上下文管理器 21 | 22 | Python 上下文管理器在打开/关闭文件、处理数据库连接和很多其他事情都非常有用,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。 23 | 24 | 在 Python3.10 中,允许带圆括号的上下文管理器在多行中进行,如果你想用一个 with 语句创建多行,这是很方便的,下面是一个简单的例子: 25 | 26 | ```python 27 | with ( 28 | open("file1.txt",'w') as f1, 29 | open("file2.txt",'w') as f2, 30 | ): 31 | f1.write('hello file1') 32 | f2.write('hello file2') 33 | ``` 34 | 35 | 运行效果如下: 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622101420264) 38 | 39 | ## 向 zip 添加可选的长度检查 40 | 41 | 默认情况下,zip 函数在最短的迭代次数用尽时停止。它将忽略较长的可迭代项中的其余项,从而将结果缩短为最短的可迭代项的长度,例如下面的代码: 42 | 43 | ```python 44 | list(zip(range(3), ['fee', 'fi', 'fo', 'fum'])) 45 | ``` 46 | 47 | 运行效果如下: 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622093648022) 50 | 51 | Python3.10 引入了 PEP 618,也就是让 zip 函数现在具有一个可选的长度检查 strict 参数,默认情况下`strict = False`,可省略。 52 | 53 | 如果希望可迭代项只在长度相等的情况下使用的话,那就建议使用该 `strict=True` 选项,如果可迭代项长度相等的情况下会和默认情况下效果相同。 54 | 55 | ```python 56 | list(zip(('a', 'b', 'c'), (1, 2, 3))) #默认情况 57 | list(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) #加入strict参数 58 | ``` 59 | 60 | 运行效果如下: 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622094259392) 63 | 64 | 如果可迭代项长度不相等,则会引发 ValueError 。 65 | 66 | ```python 67 | list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) 68 | ``` 69 | 70 | 运行效果如下: 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622094402900) 73 | 74 | 如果没有 `strict=True` 参数,则导致可迭代项长度不相等的任何错误都将被忽略,可能在程序的另一部分中表现为难以发现的错误。 75 | 76 | ## 字典视图映射 77 | 78 | 字典的三个方法 dict.keys()、dict.values() 和 dict.items() 会返回不同的视图,现在都增加了 mapping 属性,可以返回原始字典。 79 | 80 | ```python 81 | data={'python':2021,'java':2020} 82 | k=data.keys() 83 | print(k) 84 | print(k.mapping) 85 | ``` 86 | 87 | 运行效果如下: 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622098042894) 90 | 91 | 大家可以自行测试 dict.values() 和 dict.items() 的 mapping 属性,效果一样。 92 | 93 | ## 为整数添加一个有效的 popcount 计算方法 94 | 95 | 汉明重量是一串符号中非零符号的个数,是以理查德·卫斯里·汉明的名字命名的,它在包括信息论、编码理论、密码学等多个领域都有应用。 96 | 97 | 在密码学以及其它应用中经常需要计算数据位中 1 的个数,针对如何高效地实现人们已经广泛地进行了研究。 98 | 99 | Python3.10 为整数类型增加了一个新方法 `int.bit_count()` 可以返回给定整数的二进制位中 1 的个数。 100 | 101 | 我们可以参考 bin 函数来进行理解,代码如下: 102 | 103 | ```python 104 | a = 10 105 | bin(a) # a 的二进制表示 106 | a.bit_count() 107 | ``` 108 | 109 | 运行效果如下: 110 | 111 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622097141705) 112 | 113 | 再来一个例子: 114 | 115 | ```python 116 | b=255 117 | bin(b) # b 的二进制表示 118 | b.bit_count() 119 | ``` 120 | 121 | 运行效果如下: 122 | 123 | ![图片描述](https://doc.shiyanlou.com/courses/uid810810-20210527-1622097192137) 124 | 125 | ## 实验总结 126 | 127 | 本章节介绍了带括号的上下文管理器、zip 新添加的 strict 参数、字典新的映射方法、以及 popcount 算法的整数 bit_count 属性,大家可以继续探索 Python3.10 的更多的变化。 128 | -------------------------------------------------------------------------------- /3946-Python 3 新特性快速上手-free/README.md: -------------------------------------------------------------------------------- 1 | # Python 3 新特性快速上手 2 | 3 | Python 3 会定期进行版本迭代,本课程将追踪 Python 3 版本更新的新特性,是定位为官方更新我们就更新的快速上手指南。 4 | 5 | - 作者: [美国总统](https://www.lanqiao.cn/users/810810/) 6 | - 链接: https://www.lanqiao.cn/courses/3946 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1622793803029_ce9c2cd7b818138c8b9f61838a480daa) 9 | -------------------------------------------------------------------------------- /43-HTML5-简明教程-free/05-177-HTML 图像与框架.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: false 5 | --- 6 | 7 | # HTML 图像与框架 8 | 9 | ## 简介 10 | 11 | 本实验我们将会学习如何插入图像以及如何使用框架结构。框架是网页设计中很常用的技术,可以在一个浏览器中显示多个文档。 12 | 13 | #### 知识点 14 | 15 | - 插入图像 16 | - 框架的使用 17 | 18 | ## 插入图像 19 | 20 | #### 图像标签 21 | 22 | 在 HTML 中,图像由 `` 标签定义。语法为: 23 | 24 | ```html 25 | 26 | ``` 27 | 28 | `` 是空标签,它只包含属性,没有闭合标签。要在页面上显示图像,你需要使用源属性(src)。`src` 的值是图像文件的 URL,也就是引用该图像的文件的的绝对路径或相对路径。`alt` 规定图像的替代文本即当图片未成功显示的时候显示的文本信息。`title` 设置鼠标悬停时显示的内容(一般不用设置)。此外还可以通过设置 `width` 和 `height` 的值来设置图片的宽和高。 29 | 30 | 例子: 31 | 32 | ```html 33 | 程序员 40 | ``` 41 | 42 | #### 相对路径 43 | 44 | 这种路径是以引用文件的网页所在位置为参考基础,而建立出的目录路径。因此,当保存于不同目录的网页引用同一个文件时,所使用的路径将不相同,故称之为相对路径。 45 | 46 | - 图像文件和 HTML 文件位于同一文件夹:只需输入图像文件的名称即可,比如:``。 47 | - 图像文件位于 HTML 文件的下一级文件夹:输入文件夹名和文件名,之间用`/`隔开,比如:``。 48 | - 图像文件位于 HTML 文件的上一级文件夹:在文件名之前加入`../` ,如果是上两级,则需要使用 `../ ../`,以此类推,比如:``。 49 | 50 | #### 绝对路径 51 | 52 | 指当所有网页引用同一个文件时,所使用的路径都是一样的。比如`D:\webStudy\img\syl.png`或者 53 | `https://labfile.oss.aliyuncs.com/courses/1236/syl.png`。 54 | 55 | ## 框架的使用 56 | 57 | 使用框架,你可以在同一个浏览器窗口中显示不止一个页面。 58 | 59 | 语法: 60 | 61 | ```html 62 | 65 | ``` 66 | 67 | #### iframe - 设置高度与宽度 68 | 69 | 属性默认以像素为单位,但是你可以指定其按比例显示 (如:"60%")。 70 | 71 | ```html 72 | 73 | ``` 74 | 75 | ![图片描述](https://doc.shiyanlou.com/courses/43/1347963/f4b4fe443850229d31d4712e0d51a119-0/wm) 76 | 77 | #### iframe - 移除边框 78 | 79 | `frameborder` 属性用于定义 iframe 表示是否显示边框。设置属性值为 "0" 移除 iframe 的边框: 80 | 81 | ```html 82 | 88 | ``` 89 | 90 | #### 使用 iframe 来显示目标链接页面 91 | 92 | iframe 可以显示一个目标链接的页面,目标链接的属性必须使用 iframe 的属性。 93 | 94 | ```html 95 |

实验楼

96 | 97 | ``` 98 | 99 | 注: 因为 `a` 标签的 `target` 属性是名为 `shiyanlou` 的 iframe 框架,所以在点击链接时页面会显示在 iframe 框架中。需要保证 iframe 框架的 `name` 属性的名称与 `a` 标签的 `target` 属性名一致。 100 | 101 | ## 总结 102 | 103 | 本节实验我们学习了 HTML 如何插入图像,了解了相对路径和绝对路径的使用,较为详细的介绍了 iframe 框架的应用,希望大家多多动手实践。 104 | -------------------------------------------------------------------------------- /43-HTML5-简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # HTML5 简明教程 2 | 3 | HTML 超文本标记语言是构成 Web 世界的一砖一瓦,它定义了网页内容的含义和结构。课程将从网站的基础概念开始,带你了解其运行机制。然后,我们会学习 HTML 基础知识,了解各种常用标签的意义以及基本用法。此外,课程还会涉及 HTML5 的内容,这是 HTML 的最新标准,它添加了一些新的语法特征。 4 | 5 | - 作者: [哦嗨哟 L](https://www.lanqiao.cn/users/897174/) 6 | - 链接: https://www.lanqiao.cn/courses/43 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211222-1640137069401) 9 | -------------------------------------------------------------------------------- /44-Node.js-基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Node.js 基础入门 2 | 3 | 本课程将会带领你领略 Node.js 的魅力,从 Node.js 的基本概念入手,学习函数、事件、模块等概念。由浅入深,让你熟练掌握 Node.js 的基本编程。 4 | 5 | - 作者: [哦嗨哟 L](https://www.lanqiao.cn/users/897174/) 6 | - 链接: https://www.lanqiao.cn/courses/44 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1552023199704.png) 9 | -------------------------------------------------------------------------------- /539-Java-函数式编程-free/README.md: -------------------------------------------------------------------------------- 1 | # Java 函数式编程 2 | 3 | 本课程介绍了 Lambda 表达式、函数式接口、Stream 流等相关知识,带你入门 Java 函数式编程。 4 | 5 | - 作者: [齐川同学促销装](https://www.lanqiao.cn/users/162034/) 6 | - 链接: https://www.lanqiao.cn/courses/539 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/course/1544762404253_[539]-[java函数式编程].png) 9 | -------------------------------------------------------------------------------- /57-C-语言简明教程-free/02-2781-输出 I love shiyanlou.tz.md: -------------------------------------------------------------------------------- 1 | # 输出 I love shiyanlou 2 | 3 | ## 介绍 4 | 5 | 在实验环境中编写一个 C 语言小程序,实现输出 “I love shiyanlou!”。 6 | 7 | ## 知识点 8 | 9 | - Linux 下 C 语言程序编写 10 | - C 语言基础 11 | - `printf` 函数 12 | 13 | ## 目标 14 | 15 | - 在右边的实验楼环境 WebIDE 中新建一个文档,命名为 `love.c`,在文档 `love.c` 中编写代码; 16 | - `love.c` 可以在环境中编译运行,输出为 `I love shiyanlou!`。 17 | 18 | ## 提示语 19 | 20 | 很简单的入门程序,完成后请点击文档下方的 “提交结果” 查看是否通过挑战。 21 | 22 | ## 参考答案 23 | 24 | ```c 25 | #include 26 | 27 | int main(){ 28 | printf("I love shiyanlou!"); 29 | return 0; 30 | } 31 | ``` 32 | -------------------------------------------------------------------------------- /57-C-语言简明教程-free/05-2782-摄氏转华氏温度.tz.md: -------------------------------------------------------------------------------- 1 | # 摄氏转华氏温度 2 | 3 | ## 介绍 4 | 5 | 实现一个 C 语言程序,可以读入摄氏温度,输出华氏温度。 6 | 7 | ## 知识点 8 | 9 | - Linux 下 C 语言程序编写 10 | - C 语言基础 11 | - C 语言数据类型 12 | - `scanf` 和 `printf` 函数 13 | 14 | 计算公式如下: 15 | 16 | 华氏度(℉)=32+摄氏度(℃)×1.8 17 | 18 | 注意输入的摄氏温度要做为编译后的可执行文件的参数传入,而不是 `scanf()` 读取,如果使用 `scanf()` 读取则会导致测试系统等待超时。 19 | 20 | 程序片段如下,需要在 TODO 部分补充代码: 21 | 22 | ```c 23 | #include 24 | #include 25 | 26 | int main(int argc, char *argv[]){ 27 | // 存储输入的摄氏温度 28 | int input = 0; 29 | 30 | // 判断是否输入1个参数 31 | if( argc != 2) 32 | return 1; 33 | 34 | // 注意 argv[0] 是执行的程序,argv[1] 是第1个参数 35 | input = atoi(argv[1]); 36 | 37 | // TODO:将输入的 input(摄氏温度)值转为华氏温度并打印输出 38 | 39 | return 0; 40 | } 41 | ``` 42 | 43 | ## 目标 44 | 45 | - 在右边的实验楼环境 WebIDE 中新建一个文档,命名为 `convert.c`; 46 | - 将程序片段复制到文档 `convert.c` 中,并补充文档中的 `TODO` 部分; 47 | - `convert.c` 可以在环境中编译运行,编译后生成的可执行文件接受参数为摄氏温度,输出为华氏温度; 48 | - 例如编译后的可执行文件为 `convert`,则当参数为 `28` 时,输出为 `82.4`,结果如下: 49 | 50 | ```bash 51 | $ convert 28 52 | 82.4 53 | ``` 54 | 55 | - 摄氏温度作为命令行参数输入,不能够使用 `scanf()` 读取。 56 | 57 | ## 提示语 58 | 59 | 实现输入输出。 60 | 61 | 完成后请点击文档下方的 `提交结果` 查看是否通过挑战。 62 | 63 | ## 参考答案 64 | 65 | ```c 66 | #include 67 | #include 68 | 69 | int main(int argc, char *argv[]){ 70 | // 存储输入的摄氏温度 71 | int input = 0; 72 | 73 | // 判断是否输入1个参数 74 | if( argc != 2) 75 | return 1; 76 | 77 | // 注意 argv[0] 是执行的程序,argv[1] 是第1个参数 78 | input = atoi(argv[1]); 79 | 80 | // TODO:将输入的 input(摄氏温度)值转为华氏温度并打印输出 81 | double output = 0; 82 | 83 | output = input * 1.8 + 32; 84 | 85 | //保留一位小数 86 | printf("%0.1f\n",output); 87 | 88 | return 0; 89 | } 90 | ``` 91 | -------------------------------------------------------------------------------- /57-C-语言简明教程-free/08-2783-序列求和.tz.md: -------------------------------------------------------------------------------- 1 | # 序列求和 2 | 3 | ## 介绍 4 | 5 | 实现一个 C 语言程序,可以读入若干个整数,然后计算出读入的整数的和并输出。 6 | 7 | ## 知识点 8 | 9 | - Linux 下 C 语言程序编写 10 | - C 语言基础 11 | - C 程序参数输入与处理 12 | - `scanf` 和 `printf` 函数 13 | - C 语言循环 14 | 15 | 注意输入的序列数字要做为编译后的可执行文件的参数传入,而不是 `scanf()` 读取,如果使用 `scanf()` 读取则会导致测试系统等待超时。 16 | 17 | 程序参数处理的片段如下,可以回忆下上一个挑战中对于参数的处理: 18 | 19 | ```c 20 | #include 21 | #include 22 | 23 | int main(int argc, char *argv[]){ 24 | //... 25 | } 26 | ``` 27 | 28 | ## 目标 29 | 30 | - 在右边的实验楼环境 WebIDE 中新建一个文档,命名为 `sum.c`; 31 | - 将程序片段复制到文档 `sum.c` 中,并补充文档; 32 | - `sum.c` 可以在环境中编译运行,编译后生成的可执行文件接受参数若干个整数,输出为这些整数的和; 33 | - 例如编译后的可执行文件为 `sum`,则当输入的若干个整数为 `2 3 7 8`,输出为 `20`,结果如下: 34 | 35 | ```bash 36 | $./sum 2 3 7 8 37 | 20 38 | ``` 39 | 40 | ## 提示语 41 | 42 | 完成后请点击文档下方的 `提交结果` 查看是否通过挑战。 43 | 44 | ## 参考答案 45 | 46 | ```c 47 | #include 48 | #include 49 | 50 | int main(int argc, char *argv[]){ 51 | //判断参数个数是否大于等于2 52 | if(argc < 2) 53 | return 1; 54 | 55 | int sum = 0; 56 | //累加 57 | for(int i=0;i 48 | #include 49 | 50 | void exchange(int * q1,int * q2,int * q3); 51 | 52 | int main(int argc,char **argv){ // tips: main 函数要能在命令行里接收参数 53 | int a, b, c; 54 | int *p1, *p2, *p3; 55 | 56 | if(argc == 1){ 57 | printf("please enter 3 integer number:"); 58 | scanf("%d%d%d", &a, &b, &c); 59 | } 60 | else if(argc == 4){ //tips: 这里要实现从命令行读入数据,用scanf 只能从键盘输入 61 | a = atoi(argv[1]); 62 | b = atoi(argv[2]); 63 | c = atoi(argv[3]); 64 | } 65 | else 66 | return -1; 67 | 68 | p1 = &a; 69 | p2 = &b; 70 | p3 = &c; 71 | exchange(p1, p2, p3); 72 | printf("the order is :%d,%d,%d\n",a,b,c); 73 | 74 | return 0; 75 | } 76 | 77 | void exchange(int *q1,int *q2,int *q3){ 78 | void swap(int *pt1,int *pt2); 79 | if(*q1<*q2) 80 | swap(q1,q2); 81 | if(*q1<*q3) 82 | swap(q1,q3); 83 | if(*q2<*q3) 84 | swap(q2,q3); 85 | } 86 | 87 | void swap(int *p1,int *p2){ 88 | int temp; 89 | temp = *p1; 90 | *p1 = *p2; 91 | *p2 = temp; 92 | } 93 | ``` 94 | -------------------------------------------------------------------------------- /57-C-语言简明教程-free/15-2785-复制文件内容.tz.md: -------------------------------------------------------------------------------- 1 | # 复制文件内容 2 | 3 | ## 介绍 4 | 5 | 实现一个 C 语言程序,可以支持最简单的复制功能。 6 | 7 | ## 知识点 8 | 9 | - Linux 下 C 语言程序编写 10 | - C 语言基础 11 | - C 程序输入与输出处理 12 | - C 语言文件操作 13 | 14 | 例如复制一份 `/etc/protocols` 文件到 `/tmp` 目录,则程序编译后执行的效果如下所示: 15 | 16 | ```c 17 | # 编译 18 | $ gcc copy.c -o copy 19 | 20 | # 运行 21 | $ ./copy /etc/protocols /tmp/protocols 22 | ``` 23 | 24 | 注意拷贝的文件和目标文件要做为编译后的可执行文件的参数传入,而不是 `scanf()` 读取,如果使用 `scanf()` 读取则会导致测试系统等待超时。 25 | 26 | 程序参数处理的片段如下: 27 | 28 | ```c 29 | #include 30 | #include 31 | 32 | int main(int argc, char *argv[]){ 33 | //... 34 | } 35 | ``` 36 | 37 | ## 目标 38 | 39 | - 在右边的实验楼环境 WebIDE 中新建一个文档,命名为 `copy.c`; 40 | - 将程序片段复制到文档 `copy.c` 中,并补充文档; 41 | - 使用一个文件完成,不要使用单独的头文件; 42 | - `copy.c` 可以在环境中编译运行,编译后生成的可执行文件接受两个参数,分别为拷贝的来源和目标文件路径; 43 | - 需要处理两种错误:拷贝的来源文件不存在,或拷贝的目标文件已经存在。出现错误的时候需要打印一个带有 `error` 的输出信息。 44 | 45 | ## 提示语 46 | 47 | 完成后请点击文档下方的 `提交结果` 查看是否通过挑战。 48 | 49 | ## 参考答案 50 | 51 | ```c 52 | #include 53 | #include 54 | 55 | int main(int argc,char **argv){ //tips: main 函数要能在命令行里接收参数 56 | if(argc<3) 57 | return 1; 58 | 59 | // 获取文件名 60 | char* file1 = argv[1]; 61 | char* file2 = argv[2]; 62 | 63 | FILE *fp1,*fp2; 64 | 65 | char ch; 66 | 67 | // 读取源文件 68 | if((fp1=fopen(file1,"r"))==NULL) 69 | printf("File isn't exist!\n"); 70 | 71 | // 创建目的文件 72 | if((fp2=fopen(file2,"w"))==NULL) 73 | printf("File can't be created!\n"); 74 | 75 | // 读取并写入文件 76 | while((ch=fgetc(fp1))!=EOF) 77 | fputc(ch,fp2); 78 | 79 | fclose(fp1); 80 | fclose(fp2); 81 | return 0; 82 | } 83 | ``` 84 | -------------------------------------------------------------------------------- /57-C-语言简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # C 语言简明教程 2 | 3 | 本课程讲解 C 语言的开发环境以及对 C 语言的剖析,引入大量的 C 语言程序案例,把算法和语法结合起来,通过引导大家由浅入深地编写 C 程序,让大家掌握 C 语言。我们将从中学会 C 语言语法、数组、模块化程序设计指针、文件的输入与输出等。 4 | 5 | - 作者: [LOU3578913851](https://www.lanqiao.cn/users/1215278/) 6 | - 链接: https://www.lanqiao.cn/courses/57 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211217-1639724430517) 9 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/04-2772-挑战:圆的面积.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:圆的面积 2 | 3 | ## 介绍 4 | 5 | 我们通过实验已经学习了基本的 Python 3 语法。现在我们就来用一个挑战来巩固一下我们的实验效果。 6 | 7 | 本挑战中,我们将实现一个程序用来计算半径为 2 的圆的面积并打印输出。 8 | 9 | ## 目标 10 | 11 | 在 `/home/shiyanlou/Code` 创建一个 Python 脚本 `CircleArea.py`: 12 | 13 | ```bash 14 | cd /home/shiyanlou/Code 15 | touch CircleArea.py 16 | ``` 17 | 18 | CircleArea.py 能够计算出一个**半径**为 2 的圆的面积,并且把面积打印出来,保留小数点后 10 位。 19 | 20 | 不要使用 input 等方法获得输入,程序不需要输入任何参数,程序执行如下,直接输出半径为 2 的圆的面积: 21 | 22 | ```bash 23 | python3 /home/shiyanlou/Code/CircleArea.py 24 | ``` 25 | 26 | ## 提示语 27 | 28 | - `import math` 29 | - 使用 `format` 可以控制输出的小数位数,可以使用 `'{:.10f}'.format()` 来进行格式化输出保留 10 位小数 30 | - 注意代码文件的路径必须是 `/home/shiyanlou/Code/CircleArea.py` 31 | - 请**不要**使用 input 获取输入,程序执行不需要任何输入的参数 32 | 33 | ## 知识点 34 | 35 | - 导入模块 36 | - 打印输出 37 | - 运算符和表达式 38 | 39 | ## 参考代码 40 | 41 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大。** 42 | 43 | `/home/shiyanlou/Code/CircleArea.py` 参考代码: 44 | 45 |
46 | 参考答案 47 | 48 | ```python 49 | import math 50 | # 计算圆的面积 51 | area = 2 * 2 * math.pi 52 | # 格式化输出圆的面积,保留10位小数 53 | print("{:.10f}".format(area)) 54 | ``` 55 | 56 |
57 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/05-2039-控制流 If-else.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 控制流 If-else 8 | 9 | ## 实验介绍 10 | 11 | 我们处理现实生活中的问题时会做出决定,就像决定买哪种相机或者怎样更好的打篮球。 12 | 13 | 同样我们写计算机程序的时候也要做相同的事情。 14 | 15 | 我们通过 `if-else` 语句来做决定,我们使用它来改变程序运行的流程。 16 | 17 | #### 知识点 18 | 19 | - if 语句 20 | - else 语句 21 | - 真值检测 22 | 23 | ## If 语句 24 | 25 | 语法如下: 26 | 27 | ```python 28 | if expression: 29 | do this 30 | ``` 31 | 32 | 如果表达式 `expression` 的值为真(不为零的任何值都为真),程序将执行缩进后的内容。务必要使用正确的缩进,在表达式为真的情况将会执行缩进的所有行。 33 | 34 | 一个简单的例子,使用`vim`写入文件 `/home/shiyanlou/number100.py`,程序接受用户输入的一个数并且检查这个数是否小于 100。 35 | 36 | ```python 37 | #!/usr/bin/env python3 38 | number = int(input("Enter a number: ")) 39 | if number < 100: 40 | print("The number is less than 100") 41 | ``` 42 | 43 | 然后我们运行它: 44 | 45 | ```bash 46 | cd /home/shiyanlou 47 | chmod +x number100.py 48 | ./number100.py 49 | ``` 50 | 51 | 操作截图: 52 | 53 | ![5-2-1](https://doc.shiyanlou.com/document-uid212737labid2039timestamp1471332361038.png/wm) 54 | 55 | ```checker 56 | - name: 检查是否完成number100.py 57 | script: | 58 | #!/bin/bash 59 | ls -l /home/shiyanlou/number100.py 60 | error: | 61 | 我们发现您还没有完成程序 /home/shiyanlou/number100.py 62 | - name: 检查 number100.py 是否使用 input 63 | script: | 64 | #!/bin/bash 65 | grep input /home/shiyanlou/number100.py 66 | error: | 67 | number100.py 中没有用 input 来获取键盘输入 68 | ``` 69 | 70 | ## Else 语句 71 | 72 | 在上面的例子中,我们想要这样做:如果输入数大于 100 则打印 "Greater than"。我们使用 `else` 语句来做到这一点,它将在 `if` 语句未满足的情况时工作。 73 | 74 | ```python 75 | #!/usr/bin/env python3 76 | number = int(input("Enter a number: ")) 77 | if number < 100: 78 | print("The number is less than 100") 79 | else: 80 | print("The number is greater than 100") 81 | ``` 82 | 83 | 运行它: 84 | 85 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid212737labid2039timestamp1471332377763.png/wm) 86 | 87 | 另一个非常基础的例子: 88 | 89 | ```python 90 | >>> x = int(input("Please enter an integer: ")) 91 | >>> if x < 0: 92 | ... x = 0 93 | ... print('Negative changed to zero') 94 | ... elif x == 0: 95 | ... print('Zero') 96 | ... elif x == 1: 97 | ... print('Single') 98 | ... else: 99 | ... print('More') 100 | ``` 101 | 102 | 在上面的例子中,`elif` 是 `else if` 的缩写。 103 | 104 | ## 真值检测 105 | 106 | 检测真值的优雅方式是这样的: 107 | 108 | ```python 109 | if x: 110 | pass 111 | ``` 112 | 113 | 不要像下面这样做: 114 | 115 | ```python 116 | if x == True: 117 | pass 118 | ``` 119 | 120 | ## 总结 121 | 122 | 这个实验非常简单,这里只是提一句,Python 中的很多值是具有布尔意义的,所以有时候我们可以写的更优雅一点。 123 | 124 | 同时也要注意下 `if` `elif` `else` 的基本语法结构。 125 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/11-2773-挑战:字符串操作.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:字符串操作 2 | 3 | ## 介绍 4 | 5 | 我们需要实现一个程序用来提取文件中的字符串中的数字,然后打印输出。 6 | 7 | ## 目标 8 | 9 | 首先,打开 Xfce 终端,下载所需的测试文件: 10 | 11 | ```bash 12 | cd /tmp 13 | wget https://labfile.oss-internal.aliyuncs.com/courses/790/String.txt 14 | ``` 15 | 16 | 这个文件 `/tmp/String.txt` 中存储了一个很长的字符串,需要读取并进行处理。 17 | 18 | 然后,我们在 `/home/shiyanlou/Code` 创建 `FindDigits.py` Python 脚本: 19 | 20 | ```bash 21 | cd /home/shiyanlou/Code 22 | touch FindDigits.py 23 | ``` 24 | 25 | `FindDigits.py` 中,我们需要完成以下任务: 26 | 27 | 1. 使用 open 打开文件 `/tmp/String.txt` 并读取其中的字符串 28 | 2. 提取字符串中的所有数字,并组合成一个新的字符串,然后打印输出 29 | 30 | 程序执行过程如下: 31 | 32 | ```bash 33 | python3 /home/shiyanlou/Code/FindDigits.py 34 | ``` 35 | 36 | ## 提示语 37 | 38 | - 可以使用循环来访问字符串中的单个字符 39 | - 可以使用 `isdigit()` 来判断字符是否为数字 40 | - 使用 `print()` 把新的数字组成的字符串输出 41 | - 代码文件必须保存在 `/home/shiyanlou/Code/FindDigits.py` 42 | 43 | ## 知识点 44 | 45 | - 文件读取 46 | - for 循环 47 | - 字符串操作 48 | 49 | ## 参考代码 50 | 51 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大。** 52 | 53 | `/home/shiyanlou/Code/FindDigits.py` 参考代码: 54 | 55 |
56 | 参考答案 57 | 58 | ```python 59 | # 打开并读取文件里的字符串 60 | with open('/tmp/String.txt') as f: 61 | s = f.read() 62 | res = "" 63 | # 循环字符串里的每个字符,判断是否为数字 64 | for char in s: 65 | if char.isdigit(): 66 | res += char 67 | print(res) 68 | ``` 69 | 70 |
71 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/13-2774-挑战:玩转函数.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:玩转函数 2 | 3 | ## 介绍 4 | 5 | 本次挑战中我们将实现一个程序,将分钟转为小时和分钟。 6 | 7 | **注意:**代码中不要使用 `input()` 函数,否则挑战测试会卡住,出现 `Timeout` 的报错。 8 | 9 | ## 目标 10 | 11 | 请在 `/home/shiyanlou/Code` 创建代码文件 `MinutesToHours.py`: 12 | 13 | ```bash 14 | cd /home/shiyanlou/Code 15 | touch MinutesToHours.py 16 | ``` 17 | 18 | 在 MinutesToHours.py 文件中实现一个函数 `Hours()`,将用户输入的 `分钟数` 转化为 `小时数和分钟数`,并要求小时数尽量大。将结果以 `XX H, XX M` 的形式打印出来。 19 | 20 | ## 要求 21 | 22 | 1. 用户能够通过**命令行参数**输入分钟数,不要使用 `input`,命令行参数可以使用 `sys.argv` 来提取。例如程序执行为 `python3 MinutesToHours.py 80`,传入的参数 80 就是分钟数,程序需要打印出相应的小时数和分钟数,输出为 `1 H, 20 M`。 23 | 2. 如果用户输入的是一个负值,程序需要 raise 来抛出 `ValueError` 异常。 24 | 3. `Hours()` 函数调用的时候,需要使用 `try...except` 处理异常。获取异常后,在屏幕上打印出 `Parameter Error` 提示用户输入的值有误。 25 | 26 | ## 操作实例 27 | 28 | ```bash 29 | python3 /home/shiyanlou/Code/MinutesToHours.py 80 30 | 1 H, 20 M 31 | 32 | python3 /home/shiyanlou/Code/MinutesToHours.py 95 33 | 1 H, 35 M 34 | 35 | python3 /home/shiyanlou/Code/MinutesToHours.py -10 36 | Parameter Error 37 | 38 | python3 /home/shiyanlou/Code/MinutesToHours.py abcd 39 | Parameter Error 40 | ``` 41 | 42 | ## 提示语 43 | 44 | - `sys.argv` 获取命令行参数,注意获取的参数为字符串,可以使用 `int()` 将字符串转为整数,此处也可能会出现异常情况,例如输入为 "abcd" 是无法转为整数的 45 | - `raise` 语句 46 | - `try...except` 语句 47 | 48 | ## 知识点 49 | 50 | - 异常 51 | - 文件处理 52 | - if-else 53 | 54 | ## 参考代码 55 | 56 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大。** 57 | 58 | `/home/shiyanlou/Code/MinutesToHours.py` 参考代码: 59 | 60 |
61 | 参考答案 62 | 63 | ```python 64 | import sys 65 | # 转换函数 66 | def Hours(minute): 67 | # 如果为负数则 raise 异常 68 | if minute < 0: 69 | raise ValueError("Input number cannot be negative") 70 | else: 71 | print("{} H, {} M".format(int(minute / 60), minute % 60)) 72 | 73 | # 函数调用及异常处理逻辑 74 | try: 75 | Hours(int(sys.argv[1])) 76 | except: 77 | print("Parameter Error") 78 | ``` 79 | 80 |
81 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/20-2051-Virtualenv.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # Virtualenv 8 | 9 | ## 一、实验介绍 10 | 11 | Virtualenv 是一个创建隔离 Python 环境的工具,可以帮助你在本地目录安装不同版本 Python 模块的 Python 环境,你可以不再需要在你系统中安装所有东西就能开发并测试你的代码。 12 | 13 | #### 实验知识点 14 | 15 | - virtualenv 的安装 16 | - 创建虚拟环境 17 | - 激活虚拟环境 18 | - 使用多个虚拟环境 19 | - 关闭虚拟环境 20 | 21 | ## 二、安装 virtualenv 22 | 23 | 首先安装 pip3,打开 xfce 终端输入下面的命令: 24 | 25 | ```sh 26 | sudo apt-get update 27 | sudo apt-get install python3-pip 28 | ``` 29 | 30 | 用如下命令安装 virtualenv: 31 | 32 | ```sh 33 | sudo pip3 install virtualenv 34 | ``` 35 | 36 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid212737labid2051timestamp1471425612347.png/wm) 37 | 38 | ## 三、用法 39 | 40 | 我们会创建一个叫做 `virtual` 的目录,在里面我们会创建两个不同的虚拟环境。 41 | 42 | ```sh 43 | cd /home/shiyanlou 44 | mkdir virtual 45 | ``` 46 | 47 | 下面的命令创建一个叫做 virt1 的环境。 48 | 49 | ```sh 50 | cd virtual 51 | virtualenv virt1 52 | ``` 53 | 54 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20211222-1640144800690) 55 | 56 | 现在我们激活这个 virt1 环境。 57 | 58 | ```sh 59 | source virt1/bin/activate 60 | ``` 61 | 62 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20211222-1640144808494) 63 | 64 | 提示符的第一部分是当前虚拟环境的名字,当你有多个环境的时候它会帮助你识别你在哪个环境里面。 65 | 66 | 现在我们将安装 `redis` 这个 Python 模块。 67 | 68 | ```sh 69 | pip install redis 70 | ``` 71 | 72 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20211222-1640144821059) 73 | 74 | 使用 `deactivate` 命令关闭虚拟环境。 75 | 76 | ```sh 77 | deactivate 78 | ``` 79 | 80 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20211222-1640144972989) 81 | 82 | 现在我们将创建另一个虚拟环境 virt2,我们会在里面同样安装 `redis` 模块,但版本是 2.8 的旧版本。 83 | 84 | ```sh 85 | virtualenv virt2 86 | source virt2/bin/activate 87 | pip install redis==2.8 88 | ``` 89 | 90 | ![图片描述](https://dn-simplecloud.shiyanlou.com/questions/uid810810-20211222-1640144830682) 91 | 92 | 这样可以为你的所有开发需求拥有许多不同的环境。 93 | 94 | ```checker 95 | - name: 检查是否创建目录 virtual 96 | script: | 97 | #!/bin/bash 98 | ls -l /home/shiyanlou/virtual 99 | error: | 100 | 我们发现您还没有创建 /home/shiyanlou/virtual 101 | - name: 检查是否创建虚拟环境 virt2 102 | script: | 103 | #!/bin/bash 104 | ls -l /home/shiyanlou/virtual/virt2 105 | error: | 106 | 我们发现您还没有在 /home/shiyanlou/virtual/ 下创建虚拟环境 virt2 107 | ``` 108 | 109 | ## 四、总结 110 | 111 | 本节知识点回顾: 112 | 113 | - virtualenv 的安装 114 | - 创建虚拟环境 115 | - 激活虚拟环境 116 | - 使用多个虚拟环境 117 | - 关闭虚拟环境 118 | 119 | 永远记住当开发新应用时创建虚拟环境,这会帮助你的系统模块保持干净。 120 | -------------------------------------------------------------------------------- /596-Python3-简明教程-free/README.md: -------------------------------------------------------------------------------- 1 | # Python3 简明教程 2 | 3 | 简明易懂的 Python3 课程,不仅适用于那些有其它语言基础的同学,对没有编程经验的同学也非常友好。本课程不仅讲解了 Python3 基础知识,还介绍了 PEP8、Virtualenv、测试、项目结构以及 Flask 相关内容 4 | 5 | - 作者: [FrostSigh](https://www.lanqiao.cn/users/212737/) 6 | - 链接: https://www.lanqiao.cn/courses/596 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1638351975197_4074fb15c207f6747a2d08c495b61e5b) 9 | -------------------------------------------------------------------------------- /68-Linux-命令基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # Linux 命令基础入门 2 | 3 | 课程将对常用 Linux 命令进行介绍,并练习其使用方法。这些命令包括常用的目录浏览、文件管理、文本编辑、磁盘管理等。 4 | 5 | - 作者: [jayki](https://www.lanqiao.cn/users/3372/) 6 | - 链接: https://www.lanqiao.cn/courses/68 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn68.jpg) 9 | -------------------------------------------------------------------------------- /70-Python-实现文本解析器-free/README.md: -------------------------------------------------------------------------------- 1 | # Python 实现文本解析器 2 | 3 | 本课程完成一个使用 Python 来解析纯文本生成 HTML 页面的小程序。我们将学习 Python 基础语法知识以及 HTML 标记语言知识,以及如何用 Python 将纯文本分成文本块,并对其进行解析。 4 | 5 | - 作者: [小码农](https://www.lanqiao.cn/users/20417/) 6 | - 链接: https://www.lanqiao.cn/courses/70 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/courses/uid214893-20200316-1584340631813) 9 | -------------------------------------------------------------------------------- /75-C-语言实现简单计算器-free/README.md: -------------------------------------------------------------------------------- 1 | # C 语言实现简单计算器 2 | 3 | 本课程用 C 语言做一个简单的计算器,进行加、减、乘、除操作。本程序涉及的所有数学知识都很简单,但输入过程会增加复杂性。都是 C 语言很基础的东西(输入输出),学了之后能写出一个完整的 C 语言程序。适合涉及 C 语言的基本语法,与输入与输出。适合初学者学习。 4 | 5 | - 作者: [Edward](https://www.lanqiao.cn/users/20406/) 6 | - 链接: https://www.lanqiao.cn/courses/75 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1529482492629.png) 9 | -------------------------------------------------------------------------------- /7635-Apache-Log4j-2-远程代码执行漏洞详解-free/README.md: -------------------------------------------------------------------------------- 1 | # Apache Log4j 2 远程代码执行漏洞详解 2 | 3 | 本课程将带你复现 2021 年 12 月公开的 Log4j2 远程代码执行零日漏洞(CVE-2021-44228)。同时,课程会详细介绍该漏洞原理、利用方式、挖掘方式和修复方法。实验中包含可动手操作的在线实验环境,帮助你更加深刻的理解该漏洞。 4 | 5 | - 作者: [爱安全学院](https://www.lanqiao.cn/users/454817/) 6 | - 链接: https://www.lanqiao.cn/courses/7635 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1640159733988_ebcb4af4fc376356b0cc603277e86081) 9 | -------------------------------------------------------------------------------- /855-R-语言基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # R 语言基础入门 2 | 3 | 本课程主要讲解包括 R 语言的基本数据结构 , tidyverse 生态 , 以及一些用 R 解决实际问题的案例。属于 R 语言小白入门基础课程,难度简单。十分适合想要学习 R 语言的同学进行入门学习。 4 | 5 | - 作者: [kevin_2016](https://www.lanqiao.cn/users/164070/) 6 | - 链接: https://www.lanqiao.cn/courses/855 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1499827625083.png) 9 | -------------------------------------------------------------------------------- /9-MySQL-基础课程-free/04-2769-搭建简易成绩管理系统数据库.tz.md: -------------------------------------------------------------------------------- 1 | ## 搭建一个简易的成绩管理系统的数据库 2 | 3 | ### 介绍 4 | 5 | 现需要构建一个简易的成绩管理系统的数据库,来记录几门课程的学生成绩。数据库中有三张表分别用于记录学生信息、课程信息和成绩信息。 6 | 7 | 数据表结构如下: 8 | 9 | 学生表(student):学生 id 、学生姓名和性别 10 | 11 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid370051labid48timestamp1490234173345.png/wm) 12 | 13 | 课程表:课程 id 和课程名 14 | 15 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid370051labid48timestamp1490234378903.png/wm) 16 | 17 | 成绩表:成绩 id 、学生 id 、课程 id 和分数 18 | 19 | ![此处输入图片的描述](https://doc.shiyanlou.com/document-uid370051labid48timestamp1490234181565.png/wm) 20 | 21 | 服务器中的 MySQL 还没有启动,请注意 MySQL 的 root 账户默认密码为空。 22 | 23 | ### 目标 24 | 25 | 1.MySQL 服务处于运行状态 26 | 27 | 2.新建数据库的名称为 gradesystem 28 | 29 | 3.gradesystem 包含三个表:student、course、mark; 30 | 31 | - student 表包含 3 列:sid(主键)、sname、gender; 32 | - course 表包含 2 列:cid(主键)、cname; 33 | - mark 表包含 4 列:mid(主键)、sid、cid、score ,注意与其他两个表主键之间的关系。 34 | 35 | 4.将上述表中的数据分别插入到各个表中 36 | 37 | ### 提示 38 | 39 | - 建立表时注意 id 自增和键约束 40 | - 每个表插入语句可通过一条语句完成 41 | 42 | ### 挑战参考代码 43 | 44 | 以下内容仅供参考,为了能有更好的学习效果,请尽量按自己的想法来完成练习题。 45 | 46 | ```bash 47 | sudo service mysql start 48 | 49 | mysql -u root 50 | ``` 51 | 52 | ```sql 53 | CREATE DATABASE gradesystem; 54 | 55 | use gradesystem 56 | 57 | CREATE TABLE student( 58 | sid int NOT NULL AUTO_INCREMENT, 59 | sname varchar(20) NOT NULL, 60 | gender varchar(10) NOT NULL, 61 | PRIMARY KEY(sid) 62 | ); 63 | 64 | CREATE TABLE course( 65 | cid int NOT NULL AUTO_INCREMENT, 66 | cname varchar(20) NOT NULL, 67 | PRIMARY KEY(cid) 68 | ); 69 | 70 | CREATE TABLE mark( 71 | mid int NOT NULL AUTO_INCREMENT, 72 | sid int NOT NULL, 73 | cid int NOT NULL, 74 | score int NOT NULL, 75 | PRIMARY KEY(mid), 76 | FOREIGN KEY(sid) REFERENCES student(sid), 77 | FOREIGN KEY(cid) REFERENCES course(cid) 78 | ); 79 | 80 | INSERT INTO student VALUES(1,'Tom','male'),(2,'Jack','male'),(3,'Rose','female'); 81 | 82 | INSERT INTO course VALUES(1,'math'),(2,'physics'),(3,'chemistry'); 83 | 84 | INSERT INTO mark VALUES(1,1,1,80),(2,2,1,85),(3,3,1,90),(4,1,2,60),(5,2,2,90),(6,3,2,75),(7,1,3,95),(8,2,3,75),(9,3,3,85); 85 | ``` 86 | -------------------------------------------------------------------------------- /9-MySQL-基础课程-free/README.md: -------------------------------------------------------------------------------- 1 | # MySQL 基础课程 2 | 3 | 本课程实验内容从 SQL 概念开始,在 MySQL 数据库中学习并实践了 SQL 常用语法及约束、索引、视图、SELECT 查询、修改与删除等基本操作。 4 | 5 | - 作者: [实验楼包工头](https://www.lanqiao.cn/users/20418/) 6 | - 链接: https://www.lanqiao.cn/courses/9 7 | 8 | ![](https://doc.shiyanlou.com/courses/byscript-20211222-1640137080469) 9 | -------------------------------------------------------------------------------- /90-正则表达式基础入门-free/01-779-正则表达式介绍与基础.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 正则表达式介绍与基础 8 | 9 | ## 实验介绍 10 | 11 | 本节实验将介绍正则表达式的一些基本概念和用法。 12 | 13 | #### 知识点 14 | 15 | - 正则表达式的概念 16 | - 特殊符号 17 | 18 | #### 实验环境说明 19 | 20 | 本课程使用 WebIDE 来进行相关的演示操作,若要了解更多关于 WebIDE 的内容,请参阅 [WebIDE 环境使用指南](https://www.lanqiao.cn/courses/1740)。 21 | 22 | 你可以在此处下载本实验所需的文档。 23 | 24 | 在下方的 Linux 终端中输入以下指令: 25 | 26 | ```bash 27 | wget https://labfile.oss-internal.aliyuncs.com/courses/2645/regular_express.txt 28 | ``` 29 | 30 | ## 什么是正则表达式 31 | 32 | 正则表达式(Regular Expression)是一个定义搜索模式的字符序列。 33 | 34 | 在做文字处理或编写程序时,若需要用到查找、替换等功能时,可以使用正则表达式来简单便捷地完成目标。 35 | 36 | 简单而言,正则表达式通过使用一些特殊符号,使得使用者可以方便轻松地实现查找、删除、替换等功能。 37 | 38 | Vi 中经常会使用到正则表达式,为了充分发挥 shell 编程的威力,Linux 使用者需要精通正则表达式。 39 | 40 | ### 正则表达式特殊符号 41 | 42 | 首先是正则表达式的特殊符号: 43 | 44 | ```txt 45 | [:alnum:]代表英文大小写字母及数字 46 | [:alpha:]代表英文大小写字母 47 | [:blank:]代表空格和 tab 键 48 | [:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL 49 | [:digit:]代表数字 50 | [:graph:]代表空白字符以外的其他 51 | [:lower:]小写字母 52 | [:print:]可以被打印出来的任何字符 53 | [:punct:]代表标点符号 54 | [:upper:]代表大写字母 55 | [:space:]任何会产生空白的字符如空格,tab,CR 等 56 | [:xdigit:]代表 16 进位的数字类型 57 | ``` 58 | 59 | #### 特殊符号实例 60 | 61 | 在 WebIDE 中使用 touch 命令或图形界面新建一个 .txt 文件并将下文中的文本内容复制进去。 62 | 63 | ```bash 64 | touch regular_express.txt 65 | ``` 66 | 67 | 也可以使用 wget 指令从本节开头的实验环境说明处下载,这两种方式取得的文件是一样的。 68 | 69 | 文本内容为: 70 | 71 | ```txt 72 | "Open Source" is a good mechanism to develop programs. 73 | apple is my favorite food. 74 | Football game is not use feet only. 75 | this dress doesn't fit me. 76 | However, this dress is about \$ 3183 dollars. 77 | GNU is free air not free beer. 78 | Her hair is very beauty. 79 | I can't finish the test. 80 | Oh! The soup taste good. 81 | motorcycle is cheap than car. 82 | This window is clear. 83 | the symbol '\*' is represented as start. 84 | Oh!My god! 85 | The gd software is a library for drafting programs. 86 | You are the best is mean you are the no. 1. 87 | The world is the same with "glad". 88 | I like dog. 89 | google is the best tools for search keyword. 90 | goooooogle yes! 91 | go! go! Let's go. 92 | 93 | # I am VBird 94 | ``` 95 | 96 | ![1-2-0](https://doc.shiyanlou.com/courses/2645/484222/e79dc5fe8e3eb3bc8aca398276fa171a-0/wm) 97 | 98 | 使用特殊符号查找小写字母: 99 | 100 | ```bash 101 | grep -n '[[:lower:]]' regular_express.txt 102 | ``` 103 | 104 | **红色为匹配成功的字符。** 105 | 106 | ![1-2-1](https://doc.shiyanlou.com/courses/2645/484222/7bc47bed26ed64b39ec88829508263a3-0/wm) 107 | 108 | 使用特殊符号查找数字: 109 | 110 | ```bash 111 | grep -n '[[:digit:]]' regular_express.txt 112 | ``` 113 | 114 | ![1-2-2](https://doc.shiyanlou.com/courses/2645/484222/60895d8256708d16d14f360965740324-0/wm) 115 | 116 | ```checker 117 | - name: check file 118 | script: | 119 | #!/bin/bash 120 | ls /home/project/regular_express.txt 121 | error: /home/project 目录下没有 regular_express.txt 文件 122 | ``` 123 | 124 | ## 实验总结 125 | 126 | 本节实验简单介绍了正则表达式的一些基本概念和特殊符号,以及语系对正则表达式的影响。 127 | 128 | 下一节实验我们将开始 grep 命令与正则表达式的学习。 129 | -------------------------------------------------------------------------------- /90-正则表达式基础入门-free/04-782-正则表达式扩展应用.sy.md: -------------------------------------------------------------------------------- 1 | --- 2 | show: step 3 | version: 1.0 4 | enable_checker: true 5 | --- 6 | 7 | # 正则表达式扩展应用 8 | 9 | ## 实验介绍 10 | 11 | 事实上,基础的正则表达式已经足以满足大部分情况下的使用需求。不过有时候为了进一步简化命令操作,了解一些使用范围更广的扩展表达式会更加方便。本节实验将介绍扩展正则表达式的基本知识。 12 | 13 | #### 实验知识点 14 | 15 | - egrep 命令 16 | - 扩展正则表达式 17 | 18 | #### 实验环境说明 19 | 20 | 本课程使用 WebIDE 来进行相关的演示操作,若要了解更多关于 WebIDE 的内容,请参阅 [WebIDE 环境使用指南](https://www.lanqiao.cn/courses/1740)。 21 | 22 | 本节实验用到的文档与上一节中相同,新打开环境的可通过以下指令进行下载。 23 | 24 | 在下方的 Linux 终端中输入以下指令: 25 | 26 | ```bash 27 | wget https://labfile.oss-internal.aliyuncs.com/courses/2645/regular_express.txt 28 | ``` 29 | 30 | 会员可以直接使用保存的环境继续实验。 31 | 32 | ```checker 33 | - name: check file 34 | script: | 35 | #!/bin/bash 36 | ls /home/project/regular_express.txt 37 | error: /home/project 目录下没有 regular_express.txt 文件 38 | ``` 39 | 40 | ### 使用扩展正则表达式 egrep 41 | 42 | 首先来看一条前面章节学习过的用来去除空白行和注释行的指令: 43 | 44 | ```bash 45 | grep -v '^$' regular_express.txt |grep -v '^#' 46 | ``` 47 | 48 | 可见,通常的 `grep` 指令需要使用两次管线命令。那么如果使用扩展正则表达式,则可以简化为: 49 | 50 | ```bash 51 | egrep -v '^$|^#' regular_express.txt 52 | ``` 53 | 54 | 利用支持扩展正则表达式的 `egrep` 与特殊字符 `|` 的组合功能来间隔两组字符串,如此一来,可以极大地化简指令。 55 | 56 | 此外,也可以使用 `grep -E` 来使用扩展正则表达式,不过一般更建议直接使用 `egrep`,`grep -E` 与 `egrep` 之间类似命令别名的关系。 57 | 58 | ### 扩展规则(一) 59 | 60 | 回忆一下,在非扩展正则表达式中,我们使用 `*` 来表示任意个重复字符(零至无穷多个): 61 | 62 | ```bash 63 | grep -n 'goo*d' regular_express.txt 64 | ``` 65 | 66 | 在扩展正则表达式中,则可以进一步细分为*一个或一个以上*和*零个或一个*字符: 67 | 68 | #### `+` 表示重复一个或一个以上的前一个字符 69 | 70 | ```bash 71 | egrep -n 'go+d' regular_express.txt 72 | ``` 73 | 74 | #### `?` 表示重复零个或一个的前一个字符 75 | 76 | ```bash 77 | egrep -n 'go?d' regular_express.txt 78 | ``` 79 | 80 | 执行上述三条指令,比较三者的不同。 81 | 82 | ![4-3-0](https://doc.shiyanlou.com/courses/2645/484222/8257533d9214ce18f0c46e4dcc15ae24-0/wm) 83 | 84 | ### 扩展规则(二) 85 | 86 | #### `|` 表示用或(or)的方式找出数个字符串 87 | 88 | 查找 gd 或 good: 89 | 90 | ```bash 91 | egrep -n 'gd|good' regular_express.txt 92 | ``` 93 | 94 | #### `()` 表示找出组字符串 95 | 96 | 查找 glad 或 good,注意到由于二者存在重复字母,所以可以将其合并: 97 | 98 | ```bash 99 | egrep -n 'g(la|oo)d' regular_express.txt 100 | ``` 101 | 102 | ![4-4-0](https://doc.shiyanlou.com/courses/2645/484222/81e75b954572c96f7b3920823bd83fab-0/wm) 103 | 104 | #### `()+` 多个重复群组判别 105 | 106 | 查找开头是 A 结尾是 C 中间有一个以上的 `xyz` 或 `xz` 字符串: 107 | 108 | ```bash 109 | echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C' 110 | 111 | echo 'AxyzxyzxyzxyzC'|egrep 'A(xz)+C' 112 | ``` 113 | 114 | 结果显示 `A(xyz)+C` 可以匹配,`A(xz)+C` 没有匹配项。 115 | 116 | ![4-4-1](https://doc.shiyanlou.com/courses/2645/484222/b1477754080b8b69d4fa6c1c113db53b-0/wm) 117 | 118 | ## 实验总结 119 | 120 | 至此,关于正则表达式的基本知识就介绍完了,希望同学们多加练习,最终能够熟练地运用所学的关于正则表达式的知识,达到简化字符串处理的目的。 121 | 122 | #### 参考资料 123 | 124 | 《鸟哥的 Linux 私房菜 基础学习篇(第三版)》 鸟哥 著 王世江 改编 125 | -------------------------------------------------------------------------------- /90-正则表达式基础入门-free/05-2788-Linux 用户信息编辑.tz.md: -------------------------------------------------------------------------------- 1 | # 挑战:Linux 用户信息编辑 2 | 3 | ## 挑战介绍 4 | 5 | Linux 系统管理员通常会对用户数据库文件进行修改以完成对用户的管理工作。 6 | 7 | 菜鸟小明想要对自己电脑里的用户进行管理,在这里提供了一个用户数据库文件 `user` ,请你根据要求协助小明完成用户的管理。 8 | 9 | 首先请打开 WebIDE,在下方的 Linux 终端中输入以下指令: 10 | 11 | ```bash 12 | wget https://labfile.oss-internal.aliyuncs.com/courses/90/user 13 | ``` 14 | 15 | `user` 文件的格式和具体含义如下: 16 | 17 | _用户名:密码:用户标识号(UID):组标识号(GID):用户描述:主目录:登录 Shell_ 18 | 19 | --- 20 | 21 | 之后在 `/home/project/` 目录下新建一个文件 result,文件没有后缀,最终的文件路径为 `/home/project/result` 22 | 23 | 将用户记录的编辑结果**追加**输出到该文件中,如: 24 | 25 | ![5-1-0](https://doc.shiyanlou.com/courses/2645/484222/01c5c51560206e83625d2468202a67c9-0/wm) 26 | 27 | ### 目标 28 | 29 | 1. 要求顺便输出行号。 30 | 31 | 2. 找出登录 Shell 为 `bash` 的用户行记录。 32 | 33 | 3. 找出 GID 是 5 位数及以上的用户行记录。 34 | 35 | 4. 有主目录在 `/var/spo??l` 下的用户,但想不起来 `spo` 到底有几个 `o` ,找出满足条件的用户行记录。 36 | 37 | 5. 已知有个用户其用户名形如 'mi..M' ,中间有多个未知的 `mi`,`mi` 成对出现,不会单独出现多个 `m` 或者 `i`,找出该用户行记录。 38 | 39 | 必须按顺序输出。 40 | 41 | ### 提示 42 | 43 | - Linux 追加命令 `>>` 44 | - grep 与 egrep 命令 45 | 46 |
47 | 参考答案 48 |
49 | 
50 | ```bash
51 | grep -n 'bash' user >> result
52 | 
53 | grep -n '[a-Z][a-Z]*[0-9]*:[a-Z]*:[0-9]*:[0-9]\{5,\}:' user >> result
54 | 
55 | grep -n '/var/spoo*l' user >> result
56 | 
57 | egrep -n '(mi)+M' user >> result
58 | ```
59 | 
60 | 
61 |
62 | -------------------------------------------------------------------------------- /90-正则表达式基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # 正则表达式基础入门 2 | 3 | 本课程介绍了正则表达式基本概念,并在 Linux Shell 环境中实践如何使用正则表达式对文本字符串进行处理。难度一般,适合具有 Linux 基础的同学学习。 4 | 5 | - 作者: [Sylrus](https://www.lanqiao.cn/users/484222/) 6 | - 链接: https://www.lanqiao.cn/courses/90 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/assets/1630050659021_3037dc4a30b4f212db2d055fb05570af) 9 | -------------------------------------------------------------------------------- /944-高级-Bash-脚本编程指南-free/02-3557-挑战:简单的热身.tz.md: -------------------------------------------------------------------------------- 1 | ## 步骤一 2 | 3 | 新建一个 test.sh 输出 `Hello Shiyanlou!` 4 | 5 | ## 步骤二 6 | 7 | 复制 test.sh 为 test2.sh 8 | 9 | 修改 test2.sh 实现将 Hello Shiyanlou 保存为 my.txt 文本 10 | 11 | ## 步骤三 12 | 13 | 新建一个 cleantest.sh 脚本运行实现清空 test.sh 里的内容 14 | 15 | ### 提示 16 | 17 | - 复制为 cp 18 | - 创建的脚本文件都必须在 `/home/shiyanlou/` 下 19 | 20 | ## 参考代码 21 | 22 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大!** 23 | 24 | 此题解法不唯一,这里只是给出其中一种作为参考。 25 | 26 | ### 步骤一 27 | 28 | `/home/shiyanlou/test.sh` 参考代码: 29 | 30 | ```bash 31 | #!/bin/bash 32 | echo "Hello Shiyanlou!" 33 | ``` 34 | 35 | 可以使用 cat 命令: 36 | 37 | ```bash 38 | touch /home/shiyanlou/test.sh 39 | cat > /home/shiyanlou/test.sh << EOF 40 | #!/bin/bash 41 | echo "Hello Shiyanlou!" 42 | EOF 43 | ``` 44 | 45 | ### 步骤二 46 | 47 | 复制 test.sh 为 test2.sh:`cp /home/shiyanlou/test{,2}.sh` 48 | 49 | 修改 test2.sh 的代码为: 50 | 51 | ```bash 52 | #!/bin/bash 53 | echo "Hello Shiyanlou!" > my.txt 54 | ``` 55 | 56 | ### 步骤三 57 | 58 | `/home/shiyanlou/cleantest.sh` 参考代码: 59 | 60 | ```bash 61 | #!/bin/bash 62 | cat /dev/null > test.sh 63 | ``` 64 | 65 | 可以使用 `cat` 命令: 66 | 67 | ```bash 68 | touch /home/shiyanlou/cleantest.sh 69 | cat > /home/shiyanlou/cleantest.sh << EOF 70 | #!/bin/bash 71 | cat /dev/null > test.sh 72 | EOF 73 | ``` 74 | -------------------------------------------------------------------------------- /944-高级-Bash-脚本编程指南-free/07-3562-挑战:矩形的面积和周长.tz.md: -------------------------------------------------------------------------------- 1 | # bash 挑战-矩形的面积和周长 2 | 3 | ## 已知条件 4 | 5 | 矩形的长 a=3,宽 b=2 6 | 7 | ## 目标 8 | 9 | 创建一个 Area.sh,能够计算此矩形的面积,输出面积的值 10 | 11 | 创建一个 Cum.sh,能够计算此矩形的周长,输出周长的值 12 | 13 | ## 注意 14 | 15 | - 文件名一定要一致,以便于验证结果 16 | - 文件创建在 `/home/shiyanlou/` 下 17 | 18 | ## 参考代码 19 | 20 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大!** 21 | 22 | 此题解法不唯一,这里只是给出其中一种作为参考。 23 | 24 | `/home/shiyanlou/Area.sh` 的参考代码: 25 | 26 | ```bash 27 | #!/bin/bash 28 | a=3 29 | b=2 30 | echo `expr $a \* $b` 31 | ``` 32 | 33 | `/home/shiyanlou/Cum.sh` 的参考代码: 34 | 35 | ```bash 36 | #!/bin/bash 37 | a=3 38 | b=2 39 | c=`expr $a + $b` 40 | echo `expr $c \* 2` 41 | ``` 42 | -------------------------------------------------------------------------------- /944-高级-Bash-脚本编程指南-free/09-3564-挑战:最大值.tz.md: -------------------------------------------------------------------------------- 1 | # bash 挑战-最大值 2 | 3 | ## 目标 4 | 5 | 新建一个 test.sh,判断 8 4 5 三个数字的最大值 6 | 7 | ## 输出 8 | 9 | 最大值 10 | 11 | ## 提示 12 | 13 | - 文件创建在 `/home/shiyanlou/` 下 14 | 15 | ## 参考代码 16 | 17 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大!** 18 | 19 | 此题解法不唯一,这里只是给出其中一种作为参考。 20 | 21 | `/home/shiyanlou/test.sh` 参考代码: 22 | 23 | ```bash 24 | #!/bin/bash 25 | max=0 26 | a=8 27 | b=4 28 | c=5 29 | for i in $a $b $c 30 | do 31 | if [ $i -gt $max ] 32 | then 33 | max=$i 34 | fi 35 | done 36 | echo $max 37 | ``` 38 | -------------------------------------------------------------------------------- /944-高级-Bash-脚本编程指南-free/10-3565-挑战:偶数之和.tz.md: -------------------------------------------------------------------------------- 1 | # bash 挑战-偶数之和 2 | 3 | ## 目标 4 | 5 | 新建 test.sh 求 100 以内所有偶数之和 6 | 7 | ## 输出 8 | 9 | 和的值 10 | 11 | ## 提示 12 | 13 | 文件创建在 `/home/shiyanlou/` 下 14 | 15 | ## 参考代码 16 | 17 | **注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大!** 18 | 19 | 此题解法不唯一,这里只是给出其中一种作为参考。 20 | 21 | `/home/shiyanlou/test.sh` 的参考代码: 22 | 23 | ```bash 24 | #!/bin/bash 25 | cnt=0 26 | sum=0 27 | for cnt in `seq 2 2 100` 28 | do 29 | sum=$((cnt+sum)) 30 | done 31 | 32 | echo $sum 33 | ``` 34 | 35 | `seq 2 2 100` 表示列出 1 到 100 的所有偶数 36 | -------------------------------------------------------------------------------- /944-高级-Bash-脚本编程指南-free/README.md: -------------------------------------------------------------------------------- 1 | # 高级 Bash 脚本编程指南 2 | 3 | 基于杨春敏与黄毅的 ABS 译文制作,一本深入学习 shell 脚本艺术的书籍。原版链接:http://www.tldp.org/LDP/abs/html/。 4 | 5 | - 作者: [叶大炮 or 茶叶蛋](https://www.lanqiao.cn/users/8797/) 6 | - 链接: https://www.lanqiao.cn/courses/944 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/1505093960707.png) 9 | -------------------------------------------------------------------------------- /98-TCP-IP-网络协议基础入门-free/README.md: -------------------------------------------------------------------------------- 1 | # TCP IP 网络协议基础入门 2 | 3 | 本课程自顶向下分层介绍 TCP/IP 网络协议基础,其中重点是第 5、6 节。如果想更深入地了解计算机网络知识,你可以学习实验楼的其它相关课程。 4 | 5 | - 作者: [Theyoungys](https://www.lanqiao.cn/users/923797/) 6 | - 链接: https://www.lanqiao.cn/courses/98 7 | 8 | ![](https://dn-simplecloud.shiyanlou.com/ncn98.jpg) 9 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## 实验文档检查单 2 | 3 | - [ ] 我已阅读 [文档格式规范](https://github.com/lanqiao-courses/free-courses/discussions/4),且符合要求。 4 | - [ ] 我已阅读 [仓库存放结构](https://github.com/lanqiao-courses/free-courses/discussions/12),且符合要求。 5 | - [ ] 我已阅读 [实验文档模板](https://github.com/lanqiao-courses/free-courses/discussions/6),且符合要求。 6 | - [ ] 我已经在线上课程中测试步骤,均可顺利执行,无步骤跳跃等情况。参考:[我如何测试修订的实验内容?](https://github.com/lanqiao-courses/free-courses/discussions/9) 7 | 8 | ## 关联 issues 9 | 10 | 请将关联的 issues 复制粘贴到下面,以便我们能够更快处理。如果尚无关联的 issues,请留空。 11 | 12 | - issues 地址: 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![1640587560164](https://cdn.jsdelivr.net/gh/huhuhang/cdn@master/images/2021/12/1640587560164.svg) 2 | 3 | 本项目将会逐步开源 [蓝桥云课](https://www.lanqiao.cn/) 部分优质免费课程,我们期望和用户一起来完善这些实验课程,打造更好的学习体验。 4 | 5 | ## 贡献内容 6 | 7 | 👏 我们期待大家能够参与到开源课程的修订工作,一起完善课程内容。 8 | 9 | ### 我能做什么? 10 | 11 | - **自发修订课程内容**:如果你发现课程内容有错误,或者有值得优化和修订的地方,可以 [开出 issues](https://github.com/lanqiao-courses/courses-free/issues/new/choose),蓝桥云课官方会进行确认。确认问题后,官方会分派 issues 并引导进行修复。凡被合并到 `master` 主分支的内容,我们会主动联系支付稿酬,并有机会成为我们的 [签约作者](https://www.lanqiao.cn/contribute/)。 12 | - **修订课程已知问题**:在仓库的 [Issues 列表](https://github.com/lanqiao-courses/free-courses/issues) 中有官方开出的已知问题。你可以评论 issues 认领,并尝试解决这些问题。凡被合并到 `master` 主分支的内容,我们会主动联系支付稿酬,并有机会成为我们的 [签约作者](https://www.lanqiao.cn/contribute/)。 13 | - **想要提交新的课程**:如果你想要给蓝桥云课制作新的课程,欢迎 [申请成为我们的作者](https://www.lanqiao.cn/contribute/)。 14 | 15 | ### 我要怎么做? 16 | 17 | - 阅读 [贡献者手册](https://github.com/lanqiao-courses/courses-free/discussions/categories/%E8%B4%A1%E7%8C%AE%E8%80%85%E6%89%8B%E5%86%8C)。 18 | 19 | ### 创作简短内容 20 | 21 | 写课程太费时间,想创作简短的技术内容?试试 [轻实验](https://www.lanqiao.cn/questions/229528/)。 22 | 23 | ## 许可协议 24 | 25 | 本作品采用 [知识共享署名-非商业性使用 4.0 国际许可协议](http://creativecommons.org/licenses/by-nc/4.0/) 进行许可,请严格按照协议使用内容,尊重知识产权。如果您是高校教师,可以 [免费申请试用蓝桥云课](https://www.lanqiao.cn/saas/school/)。 26 | 27 | 知识共享许可协议 28 | --------------------------------------------------------------------------------