PDF同英文版
部分译词不准/多义
以实际程序用语为准
整理样式:
分页-空行,
部分页没有copy到内容-不在大纲里的,页标题一般都有
中文
Python learn-PPT汇总:16个600p+
来源:py4e
此为中文提纲**/**小标题(页面重点内容),可对照英文版的PPT看(带目录的pdf版)
翻译使用百度-文档(少量调整,自行修改)
配套资料:Python英文版pdf,视频配套电子书py4E
共16章,中文版译到第三章(2022)
PPT汇总,语雀链接:
https://www.yuque.com/u37800435/yi/sudq8u78mgq5ug3f?singleDoc#
《PPT中文内容Python learn》本文
Yuansis 202402
目录
01简介
02表达式
03有条件
04功能
05迭代
06字符串
07文件
08列表
09词典
10个元组
11 Regex
12-HTTP
13 Web服务
14对象
15数据库
16数据Viz
为什么要编程?
第1章
计算机想要帮助。。。
• 计算机的制造目的只有一个——为我们做事
• 但我们需要用他们的语言来描述我们想要做什么
• 用户很容易——有人已经在电脑中放入了许多不同的程序(指令),用户只需选择他们想要使用的程序
程序员预测需求
• iPhone应用程序是一个市场
• iPhone应用程序下载量超过30**亿**
• 程序员已经离职,成为全职iPhone开发人员
• 程序员知道程序的方法
用户与程序员
• 用户将电脑视为一套工具——文字处理器、电子表格、地图、待办事项等。
• 程序员学习计算机“方法”和计算机语言程序员有时为许多用户编写工具,有时为自己编写一些“助手”来自动化任务
为什么要成为程序员?
• 为了完成一些任务,我们是用户和程序员
-清理调查数据
• 制作供他人使用的东西-编程作业
-修复Sakai软件中的性能问题
-将留言簿添加到网站
什么是Code?软件程序?
• 存储的指令序列
-这是我们计算机中的一小部分智能
-我们找出一些东西,然后对其进行编码,然后将其交给其他人,以节省他们找出它的时间和精力
• 一种创造性的艺术——尤其是当我们在用户体验方面做得很好的时候
人类动作。。。
Python程序。。。
硬件体系结构
定义
• 中央处理器:运行程序-CPU
总是在
想“下一
步
该做什么”。
不
是
大脑
——非常愚蠢
,
但
速度
非常快
• 输入设备:键盘、鼠标、触摸屏
• 输出设备:屏幕、扬声器、打印机、DVD刻录机
• 主内存:快速小型临时存储-重新启动时丢失-又名RAM
• 辅助内存:较慢的大型永久存储-持续到删除-磁盘驱动器/记忆棒
CPU完全发热
硬盘正在运行
Python作为一种语言
早期学习者:语法错误
• 我们需要学习Python语言,这样我们才能将指令传达给Python。一开始我们会犯很多错误,像小孩子一样胡言乱语。
• 当你犯错时,电脑不会认为你“可爱”。上面写着“语法错误”——因为它知道这门语言,而你只是在学习它。看起来Python是残忍无情的。
• 你必须记住,你很聪明,可以学习。这台电脑很简单,速度很快,但不会学习。所以你学Python比用电脑学英语更容易。。。
与Python对话
我们说什么?
Python的元素
• 词汇.变量和保留词(第2章)
• 句子结构-有效句法模式(第3-5章)
• 故事结构-为某个目的构建程序
保留字
不能将保留字用作变量名/标识符
句子或行
编程段落
Python脚本
• 交互式Python适合3-4行长的实验和程序。
• 大多数程序都要长得多,所以我们将它们键入到一个文件中,并告诉Python运行该文件中的命令。
• 从某种意义上说,我们是在“给Python一个脚本”。
• 按照惯例,我们在这些文件的末尾添加“.py”作为后缀,表示它们包含Python。
交互式与脚本
• 互动的
-您直接向Python键入,每次一行,它就会响应
• 剧本
-使用文本编辑器在文件中输入一系列语句(行),并告诉Python执行文件中的语句
程序步骤或程序流程
• 就像配方或安装说明一样,程序是按顺序执行的一系列步骤。
• 有些步骤是有条件的,可以跳过。
• 有时要重复一个步骤或一组步骤。
• 有时,我们会根据需要在整个程序的几个位置存储一组要反复使用的步骤(第4章)。
顺序步骤
有条件的步骤
重复的步骤
总结
• 这是对第1章的快速概述
• 我们将在整个课程中重新审视这些概念
• 着眼大局
致谢/贡献
变量、表达式和语句
第2章
常量
• 固定值,如数字、字母和字符串,被称为“常量”,因为它们的值不会改变
• 数字常量正如您所期望的那样
• 字符串常量使用单引号(’)
或双引号(“)
保留字
不能将保留字用作变量名/标识符
变量
• 变量是内存中的一个命名位置,程序员可以在这里存储数据,然后使用变量“名称”检索数据
• 程序员可以选择变量的名称
• 您可以在以后的语句中更改变量的内容
变量
• 变量是内存中的一个命名位置,程序员可以在这里存储数据,然后使用变量“名称”检索数据
• 程序员可以选择变量的名称
• 您可以在以后的语句中更改变量的内容
Python变量名规则
必须以字母或下划线开头_
必须由字母、数字和下划线组成
区分大小写
记忆变量名
• 由于我们程序员可以选择如何选择变量名,因此有一点“最佳实践”
• 我们命名变量是为了帮助我们记住要存储在其中的内容(“助记符”=“记忆辅助”)
• 这可能会让刚开始学习的学生感到困惑,因为命名良好的变量通常“听起来”很好,它们必须是关键词
句子或行
工作分配声明
我们使用赋值语句(=)为变量赋值
表达式…
数值表达式
• 由于计算机键盘上缺少数学符号,我们用“计算机语言”来表达经典的数学运算
• 星号是乘法
• 幂(提升到幂)看起来与数学中的不同
数值表达式
评估顺序
• 当我们把运算符串在一起时,Python必须知道先做哪一个
• 这被称为“运算符优先级”
• 哪个运算符比其他运算符“优先”?
操作员优先级规则
最高优先级规则到最低优先级规则:
l 括号总是受到尊重
l 幂(提升到幂)
l 乘法、除法和余数
l 加法和减法
l 从左到右
操作员优先级
• 记住从上到下的规则
• 编写代码时使用括号
• 编写代码时,保持数学表达式足够简单,便于理解
• 将一长串数学运算分解,使其更加清晰
•
“类型”是什么意思?
• 在Python中,变量、文字和常量都有一个“类型”
• Python知道整数和字符串之间的区别
• 例如,如果某物是数字,则“+”表示“加法”;如果某物是字符串,则表示“concatenate”
类型问题
• Python知道什么是“类型”
• 某些操作被禁止
• 不能向字符串“添加1”
• 我们可以使用type()函数询问Python某物的类型
几种类型的数字
• 数字有两种主要类型
-整数是整数:
-14、-2、0、1、100、401233
-浮点数字有小数部分:-2.5、0.0、98.6、14.0
• 还有其他数字类型-它们是浮点和整数的变体
类型转换
• 当在表达式中放入整数和浮点时,该整数将隐式转换为浮点
• 您可以使用内置函数int()和float()来控制它
整数除法
整数除法产生浮点结果
字符串转换
• 您还可以使用int()和float()在字符串和整数之间进行转换
• 如果字符串中不包含数字字符,则会出现错误
用户输入
• 我们可以使用input()函数指示Python暂停并读取用户的数据
• input()函数返回一个字符串
转换用户输入
• 如果我们想从用户那里读取一个数字,我们必须使用类型转换函数将其从字符串转换为数字
• 稍后我们将处理错误的输入数据
•
Python中的注释
• Python将忽略#之后的任何内容
• 为什么要评论?
-描述代码序列中将要发生的事情
-编写代码或其他辅助信息的文档
-关闭一行代码-可能是暂时的
总结
• 类型
• 保留字
• 变量(助记符)
• 操作员
• 运算符优先级
• 整数除法
• 类型之间的转换
• 用户输入
• 评论(#)
致谢/贡献
有条件执行
第3章
有条件的步骤
比较运算符
• 布尔表达式提出一个问题并产生“是”或“否”结果,我们用它来控制程序流
• 使用比较运算符的布尔表达式的计算结果为True/False或Yes/No
• 比较运算符查看变量,但不更改变量
比较运算符
单向决策
缩进
• 增加if语句或for语句后的缩进量(在:之后)
• 保持缩进以指示块的范围(哪些行受到if/for的影响)
• 将缩进减少到if语句或for语句的级别,以指示块的结束
• 空行被忽略-它们不影响缩进
• 对于缩进,将忽略行上的注释本身
双向决策
• 有时,如果一个逻辑表达式为真,我们想做一件事,如果该表达式为假,我们想去做另一件事
• 这就像一个岔路口——我们必须选择其中一条路,但不能两者都选
与其他人的双向决策:
可视化块
更多条件结构…
多路
多向谜题
try/except结构
• 你用try和except包围了代码的危险部分
• 如果try中的代码有效,则跳过except
• 如果try中的代码失败,它将跳到except部分
尝试/除外
示例试用/除外
总结
• 比较运算符
==<=>=><=
• 缩进
• 单向决策
• 双向决策:
如果:和其他:
• 嵌套决策
• 使用elif的多路决策
• 尝试/排除以补偿错误
致谢/贡献
功能
第4章
存储(和重复使用)的步骤
Python函数
• Python中有两种函数。
-作为Python的一部分提供的内置函数-print()、input()、type()、float()、int()。。。
-我们定义自己然后使用的函数
• 我们将函数名视为“新”保留字
(即,我们避免
将
其视为变量名)
函数定义
• 在Python中,函数是一些可重用的代码,它将参数作为输入,进行一些计算,然后返回一个或多个结果
• 我们使用def保留字定义函数
• 我们通过使用表达式中的函数名、括号和参数来调用/调用函数
最大函数
类型转换
• 当在表达式中放入整数和浮点时,该整数将隐式转换为浮点
• 您可以使用内置函数int()和float()来控制它
字符串转换
• 您还可以使用int()和float()在字符串和整数之间进行转换
• 如果字符串中不包含数字字符,则会出现错误
我们自己的功能…
构建我们自己的功能
• 我们使用def关键字和括号中的可选参数创建一个新函数
• 我们缩进函数的正文
• 这定义了函数,但不执行函数的主体
定义和用途
• 一旦我们定义了一个函数,我们就可以
随心所欲
地调用(或调用)它
• 这就是存储和重用模式
论据
• 自变量是我们在调用函数时传递给函数作为其输入的值
• 我们使用参数,这样当我们在不同的时间调用函数时,就可以指导它做不同类型的工作
• 我们将参数放在函数名称后面的括号中
参数
参数是我们在函数定义中使用的变量。它是一个“句柄”,允许函数中的代码访问特定函数调用的参数。
返回值
通常,函数会获取其参数,进行一些计算,并返回一个值作为调用表达式中函数调用的值。return关键字用于此操作。
返回值
• “富有成效”的函数是指产生结果(或返回值)的函数
• return语句结束函数执行并“发回”函数的结果
参数、参数和结果
多个参数/自变量
• 我们可以在函数定义中定义多个参数
• 我们只是在调用函数时添加更多的参数
• 我们匹配参数和参数的数量和顺序
无效(无效)函数
• 当函数不返回值时,我们称之为“void”函数
• 返回值的函数是“富有成效”的函数
• 无效功能“没有结果”
发挥作用还是不发挥作用。。。
• 将你的代码组织成“段落”——捕捉一个完整的想法并“命名”
• 不要重复自己——让它工作一次,然后重复使用
• 如果某个东西太长或太复杂,请将其分解为逻辑块,并将这些块放入函数中
• 制作一个你反复做的普通事情的库——也许可以与你的朋友分享。。。
总结
• 论据
• 成果(富有成果的职能)
• 无效(无效)函数
• 为什么要使用函数?
• 功能
• 内置功能
• 类型转换(int,float)
• 字符串转换
• 参数
致谢/贡献
循环和迭代
第五章
重复的步骤
无限循环
另一个循环
打破循环
• break语句结束当前循环并跳到循环后的语句
• 这就像一个循环测试,可以发生在循环体的任何地方
打破循环
• break语句结束当前循环并跳到循环后的语句
• 这就像一个循环测试,可以发生在循环体的任何地方
使用continue完成迭代
continue语句结束当前迭代,跳到循环的顶部并开始下一次迭代
使用continue完成迭代
continue语句结束当前迭代,跳到循环的顶部并开始下一次迭代
不确定循环
• 而循环被称为“不定循环”,因为它们一直持续到逻辑条件变为False
• 到目前为止,我们看到的循环很容易检查,看看它们是否会终止,或者它们是否是“无限循环”
• 有时,要确定循环是否会终止会有点困难
确定性循环
正在遍历一组项目…
确定性循环
• 通常,我们在一个文件中有一个行的项目列表——实际上是一组有限的东西
• 我们可以编写一个循环,使用Python for构造为集合中的每个项运行一次循环
• 这些循环被称为“确定循环”,因为它们执行的次数精确
• 我们说“定循环遍历集合的成员”
一个简单的定环
一个带字符串的定环
一个简单的定环
正在查看。。。
• 迭代变量“迭代”序列(有序集)
• 代码块(主体)对序列中的每个值执行一次
• 迭代变量在序列中的所有值中移动
循环习语:
我们在循环中做什么
注意:尽管这些例子很简单,但这些模式适用于所有类型的循环
制作“智能”循环
诀窍是当你在编写一次只能看到一个条目的代码时,“了解”整个循环的一些信息
循环通过集合
Eg
最大的数字是多少?
最大的数字是多少?
寻找最大价值
更多循环模式…
循环计数
循环求和
求循环中的平均值
循环过滤
使用布尔变量搜索
如何找到最小值
寻找最小值
is和is不是运算符
• Python有一个可以在逻辑表达式中使用的is运算符
• 暗示“与”相同
• 类似,但比==
• 不是也是逻辑运算符
总结
• While循环(不确定)
• 死循环
• 使用break
• 使用continue
• 无常量和变量
• 对于循环(确定)
• 迭代变量
• 循环习语
• 最大或最小
致谢/贡献
正在读取文件
第7章
文件处理
文本文件可以被认为是一系列行
打开文件
• 在我们可以读取文件的内容之前,我们必须告诉Python我们将使用哪个文件以及我们将如何处理该文件
• 这是通过open()函数完成的
• open()返回一个“文件句柄”-一个用于对文件执行操作的变量
• 类似于文字处理器中的“文件->打开”
使用open()
handle=打开(文件名,模式)
返回用于操作文件的句柄
filename是一个字符串
模式是可选的,如果我们计划读取文件,则应为“r”,如果我们要写入文件,则为“w”
什么是手柄?
当文件丢失时
换行符
• 我们使用一个称为“换行符”的特殊字符来指示一行何时结束
• 我们将其表示为字符串
• Newline仍然是一个字符,而不是两个字符
文件处理
文本文件可以被认为是一系列行
文件处理
文本文件每行末尾都有换行符
在Python中读取文件
作为序列的文件句柄
• 打开以供读取的文件句柄可以被视为字符串序列,其中文件中的每一行都是序列中的一个字符串
• 我们可以使用for语句迭代序列
• 记住——序列是有序集
计算文件中的行数
• 以只读方式打开文件
• 使用for循环读取每一行
• 计算行数并打印出行数
读取整个文件
我们可以将整个文件(换行和全部)读取为一个字符串
在文件中搜索
我们可以在for循环中放入if语句,以仅打印符合某些条件的行
哎呀!
文件中的每一行末尾都有一个换行符
print语句为每行添加一行换行符
在文件中搜索(已修复)
我们可以使用字符串库中的rstrip()去除字符串右侧的空白
换行符被视为“空白”,并被剥离
正在跳过并继续
我们可以使用continue语句方便地跳过一行
使用中选择线
我们可以在一行中的任何位置查找字符串作为我们的选择标准
提示输入文件名
错误的文件名
总结
• 辅助存储器
• 打开文件-文件句柄
• 文件结构-换行符
• 使用
for循环逐行读取文件
• 正在搜索行
• 正在读取文件名
• 处理坏文件
致谢/贡献
串
第六章
字符串数据类型
• 字符串是一系列字符
• 字符串文字使用引号
“你好”或“你好”
• 对于字符串,+表示“连接”
• 当一个字符串包含数字时,它仍然是一个字符串
• 我们可以使用int()将字符串中的数字转换为数字
阅读和转换
• 我们更喜欢使用字符串读取数据,然后根据需要解析和转换数据
• 这使我们能够更好地控制错误情况和/或糟糕的用户输入
• 输入数字必须从字符串转换
细看字符串内部
• 我们可以使用方括号中指定的索引来获取字符串中的任何一个字符
• 索引值必须是一个整数,并且从零开始
• 索引值可以是计算的表达式
特征太远
• 如果您试图索引超出字符串的末尾,您将得到一个python错误
• 因此,在构建索引值和切片时要小心
字符串有长度
内置函数len为我们提供了字符串的长度
len**函数**
字符串循环
使用while语句、迭代变量和len函数,我们可以构建一个循环,分别查看字符串中的每个字母
字符串循环
• 使用for语句的确定循环要优雅得多
• 迭代变量完全由for循环处理
字符串循环
• 迭代变量完全由for循环处理
循环和计数
这是一个简单的循环,它遍历字符串中的每个字母,并计算循环遇到“a”字符的次数
在中更深入地观察
• 迭代变量“迭代”序列(有序集)
• 代码块(主体)对序列中的每个值执行一次
• 迭代变量在序列中的所有值中移动
更多字符串操作
切片字符串
• 我们还可以使用冒号运算符查看字符串的任何连续部分
• 第二个数字是切片末端之外的一个数字——“最多但不包括”
•
切片字符串
如果我们去掉切片的第一个数字或最后一个数字,则假设它分别是字符串的开头或结尾
字符串连接
当+运算符应用于字符串时,它的意思是“**串联**”
将in用作逻辑运算符
• in关键字也可以用于检查一个字符串是否“在”另一个字符串中
• in表达式是一个返回True或False的逻辑表达式,可以在if语句中使用
字符串比较
字符串库
• Python有许多字符串函数,这些函数在字符串库中
• 这些函数已经内置到每个字符串中——我们通过将函数附加到字符串变量来调用它们
• 这些函数不会修改原始字符串,而是返回一个已更改的新字符串
字符串库
搜索字符串
• 我们使用find()函数在另一个字符串中搜索子字符串
• find()查找子字符串的第一个出现
• 如果未找到子字符串,find()将返回-1
• 记住字符串位置从零开始
让一切都成为大写
• 您可以制作小写或大写字符串的副本
• 通常,当我们使用find()搜索字符串时,我们首先将字符串转换为小写,这样我们就可以搜索字符串而不考虑大小写
搜索和替换
• replace()函数类似于文字处理器中的“搜索并替换”操作
• 它用替换字符串替换所有出现的搜索字符串
剥离空白
• 有时我们想要取一个字符串并删除开头和/或结尾的空白
• lstrip()和rstrip()删除左侧或右侧的空白
• strip()删除开头和结尾的空白
两种字符串
总结
• 字符串类型
• 读取/转换
• 索引字符串[]
• 切分字符串[2:4]
使
用for和while循环字符串
• 将字符串与连接+
• 字符串操作
• 字符串库
• 字符串比较
• 在字符串中搜索
• 替换文本
• 剥离空白
致谢/贡献
Python列表
第8章
编程
算法
-用于解决问题的一组规则或步骤
数据结构
-在计算机中组织数据的一种特殊方式
什么不是“集合”?
我们的大多数变量都有一个值——当我们在变量中放入新值时,旧值会被覆盖
列表是一种集合
• 集合允许我们将多个值放在一个“变量”中
• 集合很好,因为我们可以在一个方便的包中携带所有许多值。
列出常量
l 列表常量用方括号括起来,列表中的元素用逗号分隔
l 列表元素可以是任何Python对象,甚至可以是另一个列表
l 列表可以为空
我们已经使用列表了!
列表和确定的循环-最好的朋友
查看列表内部
l 就像字符串一样,我们可以使用方括号中指定的索引来获取列表中的任何单个元素
l 列表是可变的
l 字符串是“不可变的”——我们不能更改字符串的内容——我们必须创建一个新的字符串才能进行任何更改
列表是“可变的”-我们可以使用索引运算符更改列表的元素
清单有多长?
len()函数将列表作为参数,并返回列表中的元素数
实际上,len()告诉我们任何集合或序列的元素数(例如字符串…)
使用范围函数
range函数返回一个数字列表,这些数字的范围从零到比参数小一
我们可以使用for和整数迭代器构造索引循环
两个循环的故事。。。
使用连接+
可以使用以下方法对列表进行切片:
Eg
列出方法
从头开始构建列表
l 我们可以创建一个空列表,然后使用append方法添加元素
l 列表保持有序,并在列表末尾添加新元素
列表中有内容吗?
l Python提供了两个运算符,用于检查项是否在列表中
l 这些是返回True或False的逻辑运算符
l 他们不会修改列表
列表按顺序排列
• 列表可以容纳许多项目并按顺序保留这些项目,直到我们更改顺序为止
• 列表可以排序
(即更改其顺序)
• 排序方法(与字符串不同)的意思是“自己排序”
内置函数和列表
l Python中内置了许多将列表作为参数的函数
l 还记得我们建造的环路吗?这些要简单得多。
最好的朋友:字符串和列表
双分割模式
有时我们把一条线分成一种方式,然后抓住其中一块,再把那块分开
列表摘要
Python词典
第九章
什么是集合?
• 收藏很好,因为我们可以在其中放入多个值,并将它们放在一个方便的包中随身携带
• 我们在一个“变量”中有一堆值
• 我们通过在变量中有多个位置来实现这一点
•
什么不是“集合”?
两个收藏品的故事。。
• 列表
值的线性集合
按位置0查找。。
长度-1
• 词典
键值对的线性集合
按“标记”或“键”查找
词典
• Dictionary是Python最强大的数据集合
• Dictionary允许我们在Python中进行类似数据库的快速操作
• 不同编程语言中的相似概念
-关联数组-Perl/PHP
-属性或Map或HashMap-Java
-财产袋-C#/。net
Python中随时间变化的词典
l 在Python 3.7之前,字典不按插入顺序保存条目
l Python 3.7(2018)和更高版本的字典按照插入的顺序保存条目
l “插入顺序”不是“始终排序的顺序”
抽象之下
Python列表、字典和元组是设计为易于使用的“抽象对象”
现在,我们只需要理解和使用它们,并感谢Python的创建者让它们对我们来说很容易
使用Python集合很容易。创建支持它们的代码是很棘手的,并且使用了计算机科学的概念,如动态内存、数组、链表、哈希图和树。
但实现细节将在后面的课程中介绍…
列表(审阅)
• 我们将值附加到列表的末尾,并按位置查找它们
• 我们使用关键字将值插入字典,并使用关键字检索它们
辞典
• 我们将值附加到列表的末尾,并按位置查找它们
• 我们使用关键字将值插入字典,并使用关键字检索它们
比较列表和词典
字典就像列表一样,只是它们使用键而不是位置来查找值
字典文字(常量)
字典文字使用大括号并具有键:值对
你可以用空大括号制作一本空字典
最常用的名字?
具有字典的许多计数器
词典的一个常见用法是计算我们“看到”某物的频率
字典回溯
• 引用字典中没有的关键字是错误的
• 我们可以使用in运算符来查看字典中是否有关键字
当我们看到一个新名字
当我们遇到一个新名字时,我们需要在字典中添加一个新条目,如果这是我们第二次或以后看到这个名字,我们只需在字典中该名字下的计数中添加一
字典的get()
检查一个键是否已经在字典中,如果键不在,则假设默认值的模式非常常见,因此有一个名为get()的方法可以为我们做到这一点
使用get()简化计数
当键还不在字典中时,我们可以使用get()并提供一个默认值零,然后只添加一个
计数模式
确定循环与词典
我们可以编写一个遍历字典中所有条目的for循环——实际上它遍历字典中的所有键并查找值
检索键和值的列表
您可以从字典中获取键、值或项(两者都有)的列表
额外奖励:两个迭代变量!
我们使用two迭代变量循环遍历字典中的键值对
每次迭代,第一个变量是关键字,第二个变量是该关键字的相应值
总结
l 什么是收藏品
l 列表与词典
l 字典常量
l 最常见的单词
l 使用get()方法
l 编写字典循环
l 回顾:元组
致谢/贡献
多元组
第10章
元组类似于列表
元组是另一种序列,其功能与列表非常相似——它们具有从0开始索引的元素
但是元组是“不可变的”
与列表不同的是,一旦创建了元组,就无法更改其内容——类似于字符串
与Tuples无关的事情
两个序列的故事
元组更高效
• 由于Python不必构建可修改的元组结构,因此在内存使用和性能方面,它们比列表更简单、更高效
• 所以在我们的程序中,当我们制作“临时变量”时,我们更喜欢元组而不是列表
元组和赋值
• 我们还可以将元组放在赋值语句的左侧
• 我们甚至可以省略括号
元组和字典
字典中的items()方法返回(键,值)元组的列表
元组是可比较的
比较运算符用于元组和其他序列。如果第一个项相等,Python将继续下一个元素,依此类推,直到找到不同的元素。
对元组列表进行排序
• 我们可以利用对元组列表进行排序的能力来获得字典的排序版本
• 首先,我们使用items()方法和sorted()函数按关键字对字典进行排序
使用sorted()
我们可以更直接地使用内置的函数sorted来实现这一点,该函数将序列作为参数并返回排序后的序列
按值而不是关键字排序
• 如果我们可以构造一个形式为(value,key)的元组列表,我们可以按值排序
• 我们使用for循环来创建元组列表
更短的版本
总结
• 元组语法
• 不可变性
• 可比性
• 排序
• 赋值语句中的元组
• 按关键字或值对字典排序
致谢/贡献
正则表达式
第11章
正则表达式
理解正则表达式
• 非常强大,相当神秘
• 一旦你理解了它们,就会很有趣
• 正则表达式本身就是一种语言
• 一种“标记字符”语言——用字符编程
• 这是一种“老派”语言——紧凑型
正则表达式快速指南
正则表达式模块
• 在程序中使用正则表达式之前,必须使用“import-re”导入库
• 您可以使用re.search()查看字符串是否与正则表达式匹配,类似于对字符串使用find()方法
• 您可以使用re.findall()来提取字符串中与正则表达式匹配的部分,类似于find()和slicing:var[5:10]的组合
像find()一样使用re.search()
像startswitch()一样使用re.search()
通配符
• 点字符与任何字符匹配
• 如果添加星号字符,则该字符为“任意次数”
微调匹配
根据数据的“干净”程度和应用程序的用途,您可能需要缩小匹配范围
数据匹配与提取
• re.search()根据字符串是否与正则表达式匹配返回True/False
• 如果我们真的想提取匹配的字符串,我们使用re.findall()
当我们使用re.findall()时,它返回一个包含零个或多个子字符串的列表,这些字符串与正则表达式匹配
警告:过度?匹配
重复字符(*和+)向两个方向向外推(贪婪),以匹配尽可能大的字符串
非贪婪匹配
并不是所有的正则表达式重复代码都是贪婪的!如果添加一个?角色,+和*冷静一点。。。
微调字符串提取
您可以为re.findall()细化匹配,并使用括号分别确定要提取匹配的哪一部分
微调字符串提取
括号不是匹配的一部分,但它们告诉从哪里开始和停止提取哪个字符串
字符串分析示例…
双分割模式
有时我们把一条线分成一种方式,然后抓住其中一块,再把那块分开
Regex版本
甚至更酷的Regex版本
垃圾邮件可信度
转义符
如果您希望一个特殊的正则表达式字符(大多数情况下)行为正常,请在它前面加上“\”
总结
• 正则表达式是一种神秘但功能强大的语言,用于匹配字符串并从这些字符串中提取元素
• 正则表达式具有表示意图的特殊字符
致谢/贡献
网络程序
第12章
一本关于网络架构的免费书籍
如果您觉得这个主题领域很有趣和/或需要更多详细信息
www.net-intro.com
传输控制协议(TCP)
建立在IP(互联网协议)之上
假设IP可能会丢失一些数据-如果数据丢失,则存储并重新传输数据
使用传输窗口处理“流量控制”
提供可靠的管道
TCP连接/socket
TCP端口数字
• 端口是特定于应用程序或特定于进程的软件通信端点
• 它允许多个网络应用程序共存于同一服务器上
• 有一个众所周知的TCP端口号列表
通用TCP端口
Python中的套接字
Python内置了对TCP套接字的支持
应用程序协议
既然TCP(和Python)为我们提供了一个可靠的套接字,我们想如何处理套接字?我们想解决什么问题?
应用程序协议
邮政
-万维网
HTTP-**超文本传输协议**
Internet上占主导地位的应用层协议
发明用于Web-检索HTML、图像、文档等。
扩展到除了文档之外还检索数据-RSS、Web Services等。基本概念-建立连接-请求文档-检索文档-关闭连接
超文本传输协议 http
超文本传输协议是允许浏览器通过Internet从服务器检索web文档的一组规则
什么是协议?protocal
各方都遵守的一套规则,以便我们能够预测彼此的行为
Eg
不要互相碰撞
在美国的双向道路上,请在道路右侧行驶
在英国的双向道路上,请在道路左侧行驶
从服务器获取数据
每次用户单击具有href=值的锚标记以切换到新页面时,浏览器都会连接到web服务器并发出“GET”请求,以获取指定URL处的页面内容
服务器将HTML文档返回到浏览器,浏览器将文档格式化并显示给用户
互联网标准
所有互联网协议(内部工作)的标准都是由一个组织制定的IETF
互联网工程任务组
www.ietf.org
标准被称为“RFC”-“征求意见”
发出HTTP请求
连接到服务器,如www.dr-chuck.com“
请求文档(或默认文档)
得到http://www.dr-chuck.com/page1.htmHTTP://1.0
得到http://www.mlive.com/ann-arbor/HTTP://1.0
得到http://www.facebook.comHTTP://1.0
电影中的精确破解
矩阵重新加载
Bourne Ultimatum
虎胆龙威4
…
让我们编写一个Web浏览器!
Python中的HTTP请求
关于字符和字符串…
ASCII
表示简单字符串
每个字符由存储在8位存储器中的0到256之间的数字表示
我们将“8位内存”称为内存的“字节”(即,我的磁盘驱动器包含3 TB的内存)
ord()函数告诉我们一个简单ASCII字符的数值
ASCII
多字节字符
为了表示计算机必须处理的广泛字符,我们用多个字节表示字符
UTF-16–固定长度-两个字节
UTF-32–固定长度-四个字节
UTF-8–1-4字节
-向上兼容ASCII
-ASCII和UTF-8之间的自动检测
-建议
使用UTF-8编码
系统间交换
的数据
Python中的两种字符串
Python 2与Python 3
Python 3和Unicode
l 在Python 3中,所有内部字符串都是UNICODE
l 在Python程序中使用字符串变量并从文件中读取数据通常“非常有效”
当我们使用套接字与网络资源通信或与数据库通信时,我们必须对数据进行编码和解码(通常为UTF-8)
Python字符串到字节
l 当我们与外部资源(如网络套接字)交谈时,我们发送字节,因此我们需要将Python 3字符串编码为给定的字符编码
l 当我们从外部资源读取数据时,我们必须根据字符集对其进行解码,以便在Python 3中正确地将其表示为字符串
Python中的HTTP请求
使用urlib简化HTTP
在Python中使用urllib
由于HTTP非常常见,我们有一个库,它为我们完成所有套接字工作,并使网页看起来像一个文件
像文件一样。。。
阅读网页
打开链接
谷歌的第一行代码?print
解析HTML
(也称为Web剪贴)
什么是Web剪贴?
• 当程序或脚本假装是浏览器,检索网页,查看这些网页,提取信息,然后查看更多网页时
• 搜索引擎抓取网页——我们称之为“蜘蛛网”或“网络爬行”
为什么要刮?scrape
• 拉取数据——尤其是社交数据——谁链接到谁?
• 从一些没有“导出功能”的系统中取回您自己的数据
• 监视站点以获取新信息
• 蜘蛛网为搜索引擎制作数据库
抓取网页
• 关于网页抓取有一些争议,有些网站对此有点挑剔。
• 不允许重新发布受版权保护的信息
• 不允许违反服务条款
简单的方法-BeautifulSoup工具
• 你可以艰难地进行字符串搜索
• 或者使用www.crummy.com上名为BeautifulSoup的免费软件库
BeautifulSoup安装
总结
l TCP/IP为我们提供了应用程序之间的管道/套接字
l 我们设计了应用程序协议来利用这些管道
l 超文本传输协议(HTTP)是一种简单而强大的协议
l Python对套接字、HTTP和HTML解析有很好的支持
致谢/贡献
使用Web服务
第13章
Web上的数据
随着对HTTP请求/响应的充分理解和支持,使用这些协议在程序之间交换数据就自然而然地发生了变化
我们需要想出一种一致的方法来表示应用程序之间和网络之间的数据
有两种常用的格式:XML和JSON
通过“网络”发送数据
同意“电汇格式”
XML
正在标记要通过网络发送的数据。。。
XML“元素”(或节点)
• 简单元素
• 复杂元素
Xml **可扩展标记语言**
主要目的是帮助信息系统共享结构化数据
它最初是标准通用标记语言(SGML)的一个简化子集,设计成相对易于阅读
XML基础知识
• 开始标记
• 结束标记
• 文本内容
• 属性
• 自动关闭标签
空白处
XML术语
l 标记指示元素的开始和结束
l 属性-XML的开头标记上的关键字/值对
l 序列化/反序列化-将一个程序中的数据转换为通用格式,该格式可以以独立于编程语言的方式在系统之间存储和/或传输
XML**作为树**
XML**文本和属性**
XML**作为路径**
XML**架构**
描述什么是可接受的XML的“合同”
XML架构
XML文档的法律格式描述
l 以对文件结构和内容的约束表示
l 通常用于指定系统之间的“契约”——“我的系统只接受符合此特定模式的XML。”
l 如果某个特定的XML片段符合Schema的规范,则称之为“验证”
许多**XML**模式语言
文档类型定义(DTD)
标准通用标记语言(ISO 8879:1986 SGML)
W3C的XML架构-(XSD)
XSD XML架构(W3C规范)
l 我们将重点关注万维网联盟(W3C)版本
l 它通常被称为“W3C模式”,因为“模式”被认为是通用的
l 更常见的是,它被称为XSD,因为文件名以.XSD结尾
XSD结构
xs:元素
xs:序列
xs:complexType
XSD
约束
XSD数据类型
ISO 8601日期/时间格式
json
对象表示法
• Douglas Crockford-“发现”JSON
• JavaScript中的对象文字表示法
面向服务的方法
l 大多数非琐碎的web应用程序都使用服务
l 他们使用来自其他应用程序的服务
-信用卡费用
-酒店预订系统
l 服务发布应用程序使用服务必须遵循的“规则”(API)
多个系统
最初,两个系统合作并解决问题
随着数据/服务变得有用,多个应用程序希望使用该信息/应用程序
API
有很多API
有些组织提供公共API并出售对这些API的访问权限
我们将探索基于OpenStreetMap数据的地理编码API
您需要一个帐户才能访问此API
随着时间的推移,有一个免费的请求级别
你支付的费用高于使用率
API代理
为了避免让你获得一个帐户,我有一个隐藏得很好的网络服务器,可以作为Geoapify数据的代理
此代理不需要密码,但它有速率限制,并且使用边缘缓存服务进行大量缓存以提高性能
总结
l 面向服务的体系结构-允许将应用程序分解为多个部分并分布在网络中
l 应用程序接口(API)是用于交互的合同
l Web服务为通过网络进行协作的应用程序(API)提供基础设施-SOAP和REST是两种类型的Web服务
l XML和JSON是序列化格式
致谢/贡献
14
Python对象
Charles Severance
警告
这节课主要是关于物体的定义和力学
这个讲座更多的是关于“它是如何工作的”,而不是关于“你如何使用它”
除非把这一切放在一个真正的问题的背景下看,否则你不会了解全貌
所以,请不要怀疑,在接下来的40张左右的幻灯片中学习技巧…
让我们从程序开始
面向对象的
• 程序由许多协作对象组成
• 而不是“整个程序”——每个对象都是程序中的一个小“岛”,并与其他对象协同工作
• 一个程序是由一个或多个协同工作的对象组成的,这些对象利用了彼此的能力
对象
l 对象是一个独立的代码和数据
l Object方法的一个关键方面是将问题分解为更小的可理解部分(分而治之)
l 物体的边界允许我们忽略不需要的细节
l 我们一直在使用对象:字符串对象、整数对象、字典对象、列表对象。。。
定义
l 类-模板
l 方法或消息-类的已定义功能
l 字段或属性-类中的一点数据
l 对象或实例-类的特定实例
术语:类别
术语:实例
术语:方法
一些Python对象
示例类
dir()和type()
寻找能力的笨拙方法
dir()命令列出了功能
l 忽略带下划线的-这些由Python本身使用
l 其余是对象可以执行的实际操作
l 它就像type()-它告诉我们一些关于变量的信息
l 尝试使用字符串的dir()
对象生命周期
http://en.wikipedia.org/wiki/Constructor_(计算机科学)
对象生命周期
l 创建、使用和丢弃对象
l 我们有被调用的特殊代码块(方法)
-创建时(构造函数)
-销毁时(销毁器)
l 大量使用构造函数
l 很少使用析构函数
建造师construct
构造函数的主要目的是在创建对象时设置一些实例变量,使其具有正确的初始值
建造师
在面向对象编程中,类中的构造函数是在创建对象时调用的一组特殊语句
许多实例
l 我们可以创建很多对象-类是对象的模板
l 我们可以将每个不同的对象存储在其自己的变量中
l 我们称之为具有同一类的多个实例
l 每个实例都有自己的实例变量副本
遗产inherit
http://www.ibiblio.org/g2swap/byteofpython/read/inheritance.html
遗产
当我们创建一个新类时,我们可以重用现有类并继承现有类的所有功能,然后添加我们自己的一点来创建我们的新类
一次写入-多次重复使用
新类(子类)具有旧类(父类)的所有功能,然后还有更多功能
术语:继承
定义
l 类-模板
l Attribute–类中的变量
l 方法-类中的函数
l 对象-类的特定实例
l Constructor–创建对象时运行的代码
l 继承-扩展类以生成新类的能力。
总结
l 面向对象编程是一种非常结构化的代码重用方法
l 我们可以将数据和功能分组在一起,并创建一个类的许多独立实例
致谢/贡献
其他来源信息
• Didriks的“Snowman Cookie Cutter”在CC by下获得许可
https://www.flickr.com/photos/dinnerseries/23570475099
• 照片来自电视节目Lassie。Lassie看着Jeff(Tommy Rettig饰)在自行车上工作main
https://en.wikipedia.org/wiki/Lassie#/media/File:Lassie_and_Tommy_Rettig_1956.JPG
15
关系数据库和SQLite
Charles Severance
SQLite浏览器
随机存取
当你可以随机访问数据时。。。
如何使数据布局最高效?
排序可能不是最好的主意
关系数据库
术语
• 数据库-包含许多表
• 关系(或表)-包含元组和属性
• 元组(或行)-一组字段,通常表示一个“对象”,如人或音乐曲目
• 属性(也是列或字段)-与行表示的对象相对应的数据的可能多个元素之一
SQL
结构化查询语言是我们用来向数据库发出命令的语言
-创建数据(也称为插入)
-检索数据
-更新数据
-删除数据
带数据库的Web应用程序
• 应用程序开发人员-构建应用程序的逻辑、应用程序的外观-监视应用程序是否存在问题
• 数据库管理员-当程序在生产中运行时监视和调整数据库
• 通常两个人都参与“数据模型”的构建
数据库管理员
数据库模型
通用数据库系统
• 广泛使用的三大数据库管理系统
-Oracle—大型、商业、企业规模,非常非常可调整
-MySql-更简单但非常快速和可扩展-商业开源
-SqlServer-非常好-来自Microsoft(也包括Access)
• 许多其他较小的项目,免费和开源
-HSQL,SQLite,Postgres。。。
SQLite在很多软件中。。。
SQLite**浏览器**
•
• SQLite浏览器允许我们直接操作SQLite文件
• SQLite嵌入在Python和许多其他语言中
让我们创建数据库
https://www.py4e.com/lectures3/Pythonlearn-15-Database-Handout.txt
简单启动-单个表
SQL
结构化查询语言是我们用来向数据库发出命令的语言
-创建数据(也称为插入)
-检索数据
-更新数据
-删除数据
SQL:插入
Insert语句将一行插入表中
SQL:删除
根据选择条件删除表中的行
SQL:更新
允许使用where子句更新字段
检索记录:选择
select语句检索一组记录-您可以使用WHERE子句检索所有记录或记录的子集
使用ORDER BY排序
您可以将ORDER BY子句添加到SELECT语句中,以使结果按升序或降序排序
SQL摘要
这不太令人兴奋(到目前为止)
• 表格看起来很像具有行、列和命令的大型快速可编程电子表格
• 当我们有多个表,并且我们可以利用表之间的关系时,力量就来了
复杂的数据模型和关系
http://en.wikipedia.org/wiki/Relational_model
数据库设计
• 数据库设计是一种具有特殊技能和经验的艺术形式
• 我们的目标是避免真正严重的错误,设计干净易懂的数据库
• 其他人可能会在以后对事情进行性能调整
• 数据库设计从图片开始。。。
构建数据模型
• 为我们的应用程序绘制数据对象的图片,然后弄清楚如何表示对象及其关系
• 基本规则:不要将相同的字符串数据放入两次,而是使用关系
• 当“真实世界”中有一件事时,数据库中应该有该事的一个副本
对于每一条“信息”。。。
• 该列是一个对象还是另一个对象的属性?
• 一旦我们定义了对象,我们就需要定义对象之间的关系
表示数据库中的关系
数据库规范化(3NF)
数据库理论太多了——如果没有过多的谓词演算,就无法理解
不复制数据-引用数据-指向数据
将整数用于键和引用
在我们将要引用的每个表中添加一个特殊的“key”列。按照惯例,许多程序员将此列称为“id”
整数参考模式
三种钥匙key
• 主键-通常是一个整数自动递增字段
• 逻辑键-外部世界用于查找的内容
• 外键-通常是指向另一个表中一行的整数键
关键规则
最佳实践
• 永远不要将逻辑键用作主键
• 逻辑键可以而且确实会发生变化,尽管变化很慢
• 基于匹配字符串字段的关系不如整数有效
外键
• 外键是指一个表的列中包含指向另一个表主键的键。
• 当所有主键都是整数时,那么所有外键都是整数-这很好-非常好
建立关系(在表格中)
使用跨表联接
Relation power关系权力
• 通过删除复制的数据,并将其替换为对每一位数据的单个副本的引用,我们构建了一个信息“网”,关系数据库可以非常快速地读取这些信息,即使是对于非常大的数据
• 通常,当您想要一些数据时,它来自由这些外键链接的多个表
JOIN操作
• 作为选择操作的一部分,JOIN操作跨多个表进行链接
• 您必须告诉JOIN如何使用ON子句在表之间建立连接的键
多对多关系
多对多
• 有时我们需要建立一种多对多的关系模型
• 我们需要添加一个带有两个外键的“连接”表
• 通常没有单独的主键
从新数据库开始
插入用户和课程
复杂性提高速度
• 复杂性使速度成为可能,并使您能够随着数据大小的增长而快速获得结果
• 通过规范化数据并用整数键将其链接,关系数据库必须扫描的总数据量远低于简单地将数据展平的情况
其他SQL主题
• 索引提高了字符串字段等内容的访问性能
• 对数据的约束-(不能为NULL等。)
• 事务-允许将SQL操作分组并作为一个单元执行
总结
• 关系数据库使我们能够扩展到非常大的数据量
• 关键是要有任何数据元素的一个副本,并使用关系和联接将数据链接到多个位置
• 这大大减少了在对大量数据执行复杂操作时需要扫描的数据量
• 数据库和SQL设计是一种艺术形式
致谢/贡献
16
检索和可视化数据
Charles Severance
多步骤数据分析
许多数据挖掘技术
https://aws.amazon.com/redshift/
….
“个人数据挖掘”
我们的目标是让您成为更好的程序员,而不是让您成为数据挖掘专家
Open Geo
l 根据用户输入的数据制作带注释的开放式街道地图
l 使用代理的GeoAPI API
l 缓存数据库中的数据以避免速率限制并允许重新启动
l 使用开放式街道地图在浏览器中可视化
页面排名
l 编写一个简单的网页爬虫
l 计算谷歌页面排名算法的简单版本
l 将生成的网络可视化
搜索引擎体系结构
Web爬网
索引建筑
搜索
Web**爬网程序**
Web爬网程序
检索页面
在页面中查找链接
将链接添加到“待检索”网站列表
重复
Web爬网策略
l 一个选择策略,该策略说明要下载哪些页面,
l 重新访问策略,其规定何时检查对页面的更改,
l 礼貌政策,说明如何避免网站过载,以及
l 说明如何协调分布式Web爬网程序的并行化策略
robots.txt
l 网站与网络爬虫通信的一种方式
l 一种非正式和自愿的标准
l 有时人们会制作一个“蜘蛛陷阱”来捕捉“坏”蜘蛛
谷歌架构
Web爬网
搜索
搜索索引
邮件列表-Gmane
l 爬网邮件列表的存档
l 进行一些分析/清理
l 将数据可视化为单词云和线条
警告:此数据集>1GB
遗憾的是,这些数据的原始来源(gmane.org)已经关闭
我们在关闭之前复制了一个子集的数据
致谢/贡献