CH01_初识Python

<hr/>

目录

本章目标

python

Python简介

编程语言是什么

编译型语言和解释型语言的区别

python是什么

python的优缺点

优点

缺点

python的应用领域

web应用开发

自动化运维

人工智能领域

网络爬虫领域

科学计算领域

游戏开发领域

python 3和python 2 的区别

python 3.x print函数代替了 print 语句

python 3.x默认使用UTF-8编码

python 3.x除法运算

python 3.x异常

python 3.x 八进制字面量表示

python 3.x 不等于运算符

python 3.x 数据类型

课后作业


本章目标

  • 掌握python特性

  • 掌握python的优缺点

  • 掌握python的应用领域

  • 掌握python 2.x和 3.x的区别

python

Python简介

Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。

Python 由 Guido van Rossum (吉多·范罗苏姆) 于 1989 年底发明,第一个公开发行版发行于 1991 年。

像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。

官方宣布,2020 年 1 月 1 日, 停止 Python 2 的更新。

Python 2.7 被确定为最后一个 Python 2.x 版本。

编程语言是什么

其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令。

为了有效避开所有影响给计算机传递指令的因素,计算机科学家设计了一些符号,这些符号各有其含义,且之间无二义性,通常称它们为编程语言。编程语言中的每个结构,都有固定的使用格式(称为语法)以及精确的含义(称为语义)。换句话说,编程语言指定了成套的规则,用来编写计算机可以理解的指令。习惯上,我们将这一条条指令称为计算机代码,而用编程语言来编写算法的过程称为编码。

本教程要讲解的 Python 就是一种编程语言,除此之外,你肯定也听说过其他一些编程语言,如 C、C++、Java、Ruby 等。至今,计算机科学家已经开发了成百上千种编程语言,且随着时间演变,这些编程语言又产生了多个不同的版本。但无论是哪个编程语言,也无论有多少个版本,虽然它们在细节上可能有所不同,无疑它们都有着固定的、无二义性的语法和语义。

以上提到的编程语言,都是高级计算机语言,设计它们的目的是为了方便程序员理解和使用。但严格来说,计算机硬件只能理解一种非常低级的编程语言,称为机器语言

比如说,让计算机对 2 个数做求和操作,那么 CPU 可能要执行以下指令:

  1. 将位于内存空间位置在 2001 的数加载到 CPU 中;

  2. 再将位于内存空间位置在 2002 的数也加载到 CPU中;

  3. 在 CPU中,对这 2 个数做求和操作;

  4. 将结果存储在位置为 2003 的内存空间。

而使用 Python 这样的高级语言,对 2 个数求和可以很自然地用 c = a + b 表示,但由此带来的问题是,我们需要设计一种方法,将高级语言翻译成计算机可以执行的机器语言,有两种方法可以实现,分别是使用编译器和解释器。

编译型语言和解释型语言的区别

我们编写的源代码是人类语言,我们自己能够轻松理解;但是对于计算机硬件(CPU),源代码就是天书,根本无法执行,计算机只能识别某些特定的二进制指令,在程序真正运行之前必须将源代码转换成二进制指令。

所谓的二进制指令,也就是机器码,是 CPU 能够识别的硬件层面的“代码”,简陋的硬件(比如古老的单片机)只能使用几十个指令,强大的硬件(PC 和智能手机)能使用成百上千个指令。

然而,究竟在什么时候将源代码转换成二进制指令呢?不同的编程语言有不同的规定:

  • 有的编程语言要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序(Windows 下的 .exe),比如C语言、C++、Golang、Pascal(Delphi)、汇编等,这种编程语言称为编译型语言,使用的转换工具称为编译器。

  • 有的编程语言可以一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,这种编程语言称为解释型语言,使用的转换工具称为解释器。

简单理解,编译器就是一个“翻译工具”,类似于将中文翻译成英文、将英文翻译成俄文。但是,翻译源代码是一个复杂的过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等五个步骤,期间涉及到复杂的算法和硬件架构。解释器与此类似,有兴趣的读者请参考《编译原理》一书,本文不再赘述。

python是什么

编程语言有“高低”之分,而高级语言又有很多种,比如 C++、Java、C#、PHP、JavaScript 等,Python 也是其中之一。从本节开始,我们将正式开始学习 Python 这门高级编程语言,但是在此之前,我们有必要先讨论一下“Python 是什么”。

Python 英文原意为“蟒蛇”,直到 1989 年荷兰人 Guido van Rossum (简称 Guido)发明了一种面向对象的解释型编程语言,并将其命名为 Python,才赋予了它表示一门编程语言的含义。

说道 Python,它的诞生是极具戏曲性的,据 Guido 的自述记载,Python 语言是他在圣诞节期间为了打发时间开发出来的,之所以会选择 Python 作为该编程语言的名字,是因为他是一个叫 Monty Python 戏剧团体的忠实粉丝。

Python 语言是在 ABC 教学语言的基础上发展来的;遗憾的是,ABC 语言虽然非常强大,但却没有普及应用,Guido 认为是它不开放导致的。

基于这个考虑,Guido 在开发 Python 时,不仅为其添加了很多 ABC 没有的功能,还为其设计了各种丰富而强大的库,利用这些 Python 库,程序员可以把使用其它语言制作的各种模块(尤其是C语言和 C++)很轻松地联结在一起,因此 Python 又常被称为“胶水”语言。

这里的库和模块,简单理解就是一个个的源文件,每个文件中都包含可实现各种功能的方法(也可称为函数)。从整体上看,Python 语言最大的特点就是简单,该特点主要体现在以下 2 个方面:

  • Python 语言的语法非常简洁明了,即便是非软件专业的初学者,也很容易上手。

  • 和其它编程语言相比,实现同一个功能,Python 语言的实现代码往往是最短的。

看似 Python 是“不经意间”开发出来的,但丝毫不比其它编程语言差。事实也是如此,自 1991 年 Python 第一个公开发行版问世后:

  • 2004 年起 Python 的使用率呈线性增长,不断受到编程者的欢迎和喜爱;

  • 2010 年,Python 荣膺 TIOBE 2010 年度语言桂冠;

  • 2017 年,IEEE Spectrum 发布的 2017 年度编程语言排行榜中,Python 位居第 1 位。

直至现在(2019 年 12 月份),根据 TIOBE 排行榜的显示,Python 也居于第 3 位,且有继续提升的态势(如表 2 所示)。

显然,Python 已经将 C++ 语言甩在了后边,直逼 C 语言和 Java,而且未来有可能超越它们,成为编程语言排行榜冠军。 我们不妨再看一下 Python 历年来的市场份额变化曲线,Python 的未来大势可期。

python的优缺点

优点
  1. 语法简单

  2. 开源的

  3. 免费的

  4. 高级语言

  5. 解释型语言,能跨平台

  6. 面向对象的编程语言

  7. 功能强大(模块众多)

  8. 可作扩展性强

缺点

1.运行速度慢

  1. ​ 运行速度慢是解释型语言的通病,Python 也不例外。

  2. ​ Python 速度慢不仅仅是因为一边运行一边“翻译”源代码,还因为 Python 是高级语言,屏蔽了很多底层细节。这个代价也是很大的,Python 要多做很多工作,有些工作是很消耗资源的,比如管理内存。

  3. ​ Python 的运行速度几乎是最慢的,不但远远慢于 C/C++,还慢于 Java。

  4. ​ 其次是有些应用场景可以容忍速度慢,比如网站,用户打开一个网页的大部分时间是在等待网络请求,而不是等待服务器执行网页程序。服务器花 1ms 执行程序,和花 20ms 执行程序,对用户来说是毫无感觉的,因为网络连接时间往往需要 500ms 甚至 2000ms。

2.代码加密困难

  1. ​ 不像编译型语言的源代码会被编译成可执行程序,Python 是直接运行源代码,因此对源代码加密比较困难。

  2. ​ 开源是软件产业的大趋势,传统程序员需要转变观念。

python的应用领域

web应用开发

Python 经常被用于 Web 开发,尽管目前 PHP、JS 依然是 Web 开发的主流语言,但 Python 上升势头更猛劲。尤其随着 Python 的 Web 开发框架逐渐成熟(比如 Django、flask、TurboGears、web2py 等等),程序员可以更轻松地开发和管理复杂的 Web 程序。

例如,通过 mod_wsgi 模块,Apache 可以运行用 Python 编写的 Web 程序。Python 定义了 WSGI 标准应用接口来协调 HTTP 服务器与基于 Python 的 Web 程序之间的通信。

举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛使用 Python 语言。另外,我们经常访问的集电影、读书、音乐于一体的豆瓣网(如图 1 所示),也是使用 Python 实现的。

不仅如此,全球最大的视频网站 Youtube 以及 Dropbox(一款网络文件同步工具)也都是用 Python 开发的。

自动化运维

很多操作系统中,Python 是标准的系统组件,大多数 Linux 发行版以及 NetBSD、OpenBSD 和 Mac OS X 都集成了 Python,可以在终端下直接运行 Python。

有一些 Linux 发行版的安装器使用 Python 语言编写,例如 Ubuntu 的 Ubiquity 安装器、Red Hat Linux 和 Fedora 的 Anaconda 安装器等等。

另外,Python 标准库中包含了多个可用来调用操作系统功能的库。例如,通过 pywin32 这个软件包,我们能访问 Windows 的 COM 服务以及其他 Windows API;使用 IronPython,我们能够直接调用 .Net Framework。

通常情况下,Python 编写的系统管理脚本,无论是可读性,还是性能、代码重用度以及扩展性方面,都优于普通的 shell 脚本。

办公人员日常处理数据表格时,就可以基于这些操作实现办公自动化,Word和Excel作为工作中最常用的软件,实现自动化可以节省很多时间。

人工智能领域

人工智能是项目非常火的一个研究方向,如果要评选当前最热、工资最高的 IT 职位,那么人工智能领域的工程师最有话语权。而 Python 在人工智能领域内的机器学习神经网络深度学习等方面,都是主流的编程语言。

可以这么说,基于大数据分析和深度学习发展而来的人工智能,其本质上已经无法离开 Python 的支持了,原因至少有以下几点:

  1. 目前世界上优秀的人工智能学习框架,比如 Google 的 TransorFlow(神经网络框架)、FaceBook 的 PyTorch(神经网络框架)以及开源社区的 Karas 神经网络库等,都是用 Python 实现的;

  2. 微软的 CNTK(认知工具包)也完全支持 Python,并且该公司开发的 VS Code,也已经把 Python 作为第一级语言进行支持。

  3. Python 擅长进行科学计算和数据分析,支持各种数学运算,可以绘制出更高质量的 2D 和 3D 图像。

python案例实现打开图片,自动获取人脸。

网络爬虫领域

Python 语言很早就用来编写网络爬虫。Google 等搜索引擎公司大量地使用 Python 语言编写网络爬虫。

从技术层面上将,Python 提供有很多服务于编写网络爬虫的工具,例如 urllib、Selenium 和 BeautifulSoup 等,还提供了一个网络爬虫框架 Scrapy。

使用 Python3 抓取图片之家网站信息,完成一个图片之家工具。该项目练习 Python3 基础及网络编程,以及 docopt,requests,prettytable 等库的使用。

科学计算领域

自 1997 年,NASA 就大量使用 Python 进行各种复杂的科学运算。

并且,和其它解释型语言(如 shell、js、PHP)相比,Python 在数据分析、可视化方面有相当完善和优秀的库,例如 NumPy、SciPy、Matplotlib、pandas 等,这可以满足 Python 程序员编写科学计算程序。

游戏开发领域

很多游戏使用 C++ 编写图形显示等高性能模块,而使用 Python 或 Lua 编写游戏的逻辑。和 Python 相比,Lua 的功能更简单,体积更小;而 Python 则支持更多的特性和数据类型。

比如说,国际上指明的游戏 Sid Meier's Civilization(文明,如图 2 所示)就是使用 Python 实现的。

除此之外,Python 可以直接调用 Open GL 实现 3D 绘制,这是高性能游戏引擎的技术基础。事实上,有很多 Python 语言实现的游戏引擎,例如 Pygame、Pyglet 以及 Cocos 2d 等。

以上也仅是介绍了 Python 应用领域的“冰山一角”,例如,还可以利用 Pygame 进行游戏编程;用 PIL 和其他的一些工具进行图像处理;用 PyRo 工具包进行机器人控制编程,等等。有兴趣的读者,可自行搜索资料进行详细了解。

python实现超级玛丽游戏。

python 3和python 2 的区别

python 3.x print函数代替了 print 语句

在 Python2.x 中,输出数据使用的是 Print 语句,例如:

>>> print "3,4"
 3,4
或者
>>> print(3,4)
 (3,4)

但是在 Python 3.x 中,print 语句没有了,取而代之的是 print 函数,例如:

>>> print(3,4)
 3 4

python 3.x默认使用UTF-8编码

相比 Python 2.x 默认采用的 ASCII 编码,Python 3.x 默认使用 UTF-8 编码,可以很好地支持中文或其它非英文字符。

#Python 2.x
>>>str ="C语言中文网"
 >>>str
 'C\xe8\xaf\xad\xe8\xa8\x80\xe4\xb8\xad\xe6\x96\x87\xe7\xbd\x91'
​
 #Python 3.x
 >>>str ="C语言中文网"
 >>>str
 'C语言中文网'

不仅如此,在 Python 3.x 中,下面的代码也是合法的:

>>>中国="China"
 >>>print(中国)
China

python 3.x除法运算

和其他语言相比,Python 的除法运算要高端很多,它的除法运算包含 2 个运算符,分别是 / 和 //,这 2 个运算符在 Python 2.x 和 Python 3.x 的使用方法如下:

/ 运算符:在 Python 2.x 中,使用运算符 / 进行除法运算的方式和 Java、C 语言类似,整数相除的结果仍是一个整数,浮点数除法会保留小数点部分,例如:

>>>1/2
 0
 >>>1.0/2
 0.5

但是在 Python 3.x 中使用 / 运算符,整数之间做除法运算,结果也会是浮点数。例如:

>>>1/2
 0.5

//运算符 :使用运算符 // 进行的除法运算叫做 floor 除法,也就是输出不大于结果值的一个最大的整数(向下取整)。此运算符的用法在 Python 2.x 和Python 3.x 中是一样的,举个例子:

#Python 2.x
 >>> -1//2
 -1
​
 #Python 3.x
 >>> -1//2
 -1

python 3.x异常

在 Python 3.x 版本中,异常处理改变的地方主要在以下几个方面:

  1. 在 Python 2.x 版本中,所有类型的对象都是直接被抛出的,但是在 Python 3.x 版本中,只有继承 BaseException 的对象才可以被抛出。

  2. 在 Python 2.x 版本中,捕获异常的语法是“except Exception,var:”;但在 Python 3.x 版本中,引入了 as 关键字,捕获异常的语法变更为 “except Exception as var:”。

  3. 在 Python 3.x 版本中,处理异常用 “raise Exception(args)”代替了“raise Exception,args”。

  4. Python 3.x 版本中,取消了异常类的序列行为和 .message 属性。

有关 Python 2.x 版本和 Python 3.x 版本处理异常的示例代码如下所示:

#Python 2.x
 >>> try:
 ...  raise TypeError,"类型错误"
... except TypeError,err:
 ...  print err.message
 ...
类型错误
​
#Python 3.x
 >>> try:
 ...     raise TypeError("类型错误")
 ... except TypeError as err:
 ...     print(err)
 ...
类型错误

python 3.x 八进制字面量表示

在 Python 3.x 中,表示八进制字面量的方式只有一种,并且必须写成“0o1000”这样的方式,原来“01000”的方式不能使用了。举个例子:

#Python 2.x
 >>> 0o1000
 512
 >>> 01000
 512
​
 #Python 3.x
 >>> 01000
   File "<stdin>", line 1
     01000
         ^
 SyntaxError: invalid token
 >>> 0o1000
 512

python 3.x 不等于运算符

Python 2.x 中的不等于运算符有 2 种写法,分别为 != 和 <>,但在 Python 3.x 中去掉了 <>,只有 != 这一种写法,例如:

#Python 2.x
 >>> 1!=2
 True
 >>> 1<>2
 True
​
 #Python 3.x
 >>> 1!=2
 True
 >>> 1<>2
   File "<stdin>", line 1
     1<>2
       ^
 SyntaxError: invalid syntax

python 3.x 数据类型

Python 3.x 中对数据类型也做了改动,比如说:

Python 3.x 去除了 long 类型,现在只有一种整形 int,但它的行为就像是 Python 2.x 版本中的 long。Python 3.x 新增了 bytes 类型,对应 Python 2.x 版本的八位串,定义 bytes 字面量的方法如下所示:

>>>b=b'China'
 >>>type(b)
 <type 'bytes'>

字符串对象和 bytes 对象可以使用 .encode() 或者 .decode()方法相互转化,例如:

>>>s=b.decode()
 >>>s
 'China'
 >>>b1=s.encode()
 >>>b1
 b'China'

Python 3.x 中,字典的 keys()、items() 和 values() 方法用返回迭代器,且之前的 iterkeys() 等函数都被废弃。同时去掉的还有 dict.has_key(),改为用 in 替代。

课后作业

1.略

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
TIM2_CH1_CAPTURE_STA是一个用于记录TIM2通道1输入捕获状态的变量。在使用STM32的输入捕获功能时,我们需要在捕获到边沿信号时记录当前定时器的值,以便后续计算时间差或者频率等信息。TIM2_CH1_CAPTURE_STA通常是一个32位的变量,其中高16位用于记录捕获次数,低16位用于记录捕获状态。具体的定义和使用可以参考以下代码: ```c #define TIM2_CH1_CAPTURE_STA_COUNT 0XFFFF //捕获计数器的最大值 #define TIM2_CH1_CAPTURE_STA_RISING 0X01 //上升沿捕获标志 #define TIM2_CH1_CAPTURE_STA_FALLING 0X02 //下降沿捕获标志 uint32_t TIM2_CH1_CAPTURE_STA = 0; //捕获状态变量 uint32_t TIM2_CH1_CAPTURE_VAL; //捕获值 void TIM2_IRQHandler(void) { if ((TIM2_CH1_CAPTURE_STA & TIM2_CH1_CAPTURE_STA_FALLING) == 0) //还未捕获到下降沿 { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET) //捕获到上升沿 { TIM2_CH1_CAPTURE_STA |= TIM2_CH1_CAPTURE_STA_RISING; //标记上升沿已经被捕获 TIM_SetCounter(TIM2, 0); //清空定时器计数器 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); //清除中断标志位 } } else //已经捕获到上升沿 { TIM2_CH1_CAPTURE_VAL = TIM_GetCapture1(TIM2); //获取捕获值 TIM2_CH1_CAPTURE_STA |= TIM2_CH1_CAPTURE_STA_FALLING; //标记下降沿已经被捕获 TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); //清除中断标志位 } } int main(void) { //初始化TIM2通道1输入捕获 TIM_ICInitTypeDef TIM2_ICInitStructure; TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM2_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM2, &TIM2_ICInitStructure); //使能TIM2通道1输入捕获中断 TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); //启动TIM2 TIM_Cmd(TIM2, ENABLE); while (1) { if ((TIM2_CH1_CAPTURE_STA & TIM2_CH1_CAPTURE_STA_FALLING) != 0) //已经捕获到下降沿 { uint32_t capture_time = TIM2_CH1_CAPTURE_VAL + TIM2_CH1_CAPTURE_STA_COUNT * TIM_GetCounter(TIM2); //计算捕获时间 uint32_t capture_freq = SystemCoreClock / capture_time; //计算捕获频率 TIM2_CH1_CAPTURE_STA = 0; //清空捕获状态 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

功夫熊猫大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值