| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 五 我们经常会忘记,要学会 走路 才能 奔跑,Python基础教程 -> 正文阅读 |
|
[Python知识库]五 我们经常会忘记,要学会 走路 才能 奔跑,Python基础教程 |
目录 1 前言,啰嗦几句但很重要的我们生活中存在很对的规则、法则。比如一些物理运算法则、一些化学反应的公式,一些数学公式等等,这些东西我们人类还不存在的时候就有了,是自然法则,在地球上在不同的国家,不同肤色的人都是通用的。 还有一些法则,比如法律、五线谱、交通规则、各种公司制度等,这些是人们根据自己的生活经验加上自己主观判断总结抽象出来的,就粗浅把它叫做人定法则吧。 为什么我要说这些呢?因为我要让大家避免在初学编程时候遇到最大的困惑,就是“为什么会这样?”的困惑。很多小伙伴因为这个东西,降低了学习体验并且增加了学习难度。 我们在学习自然法则的时候,本能会让我们很好奇,然后问自己,“为什么会这样?”这个问题在自然法则的学习中我们可以找到答案,这样的学习方法是对的。 在学习人定法则的时候,我们同样会很好奇,然后就问自己“为什么会这样”?于是我们发现我们无法找到答案,这个过程会让我们耽误时间,还挺挫败的。比如我第一次知道 绿灯行红灯停 的时候,我会条件反射的想,这是为什么?背后有什么原理?这个问题其实困扰了我很久,为什么不是反过来?为什么不是其他颜色?其实这样的例子有很多,就像我们炒股,国内的颜色系统和国外的刚好反过来。 我们在学习编程语法的时候,这样的问题就多了,因为编程语法它不是自然法则,它是人定法则。如果我们用自然法则的学习方法去学习编程,我们会觉得很挫败,因为我们找不到“为什么会这样?”的答案。所以遇到编程语法的时候,我们要像遇到 绿灯行红灯停 规则一样,知道它,熟练运用它就可以,时刻暗示自己不必纠结 “为什么会这样?” 这样学习编程语法会轻松很多。 好了下面就开始讲解Python编程语言的一些基础语法,主要内容如下:
2 Python 交互器是个学习利器在上面搭建开发环境的课程里,Python交互器已经和大家打过照面了。无论我在学习、还是工作中我都会用到Python交互器。它提高了我研究编程问题、验证程序、学习新的开发框架的效率。后面的一些学习例子也会用Python交互器。 如果我们已经在自己电脑上安装好了Python开发环境,可以在控制台(如果是windows系统,在搜索栏里输入CMD,然后单击进入就可以)直接敲入Python命令,就可以激活Python交互器。 交互器就是和Python交流的窗口,可以通过交互器和Python “沟通”,逐渐学习Python语言体系等。比如下面的例子: 用交互器来算算数: 问问交互器,它们做什么? 根据交互器的提示,使用 keywords 关键字查看Python目前拥有的关键字是哪些? 好了,后面还有很多例子,我们慢慢体会。现在我们开始学习Python的核心语法知识。 3 “=” 这可不是等于的意思“=” 等号,在Python里叫做赋值操作符,它的意思是把 “等号” 右边的信息,放置到 “等号” 左边,如下图: age 是 一个变量,18是一个数字信息。 “=” 的意思就是把,18 这个数值信息放置到 age 这个变量里。后面大量的例子和知识,都需要建立在充分理解 “=” 等号这个操作符意义上面。所以最核心的语法知识,先和大家介绍着 “=” 这个符号。 4 基本数据类型的使用基础数据类型是Python用来保存信息最基础的手段,通过这些基础信息Python能够构建出一些复杂有用的数据结构和数据模型,开发人员用它们来保存、计算软件开发里的业务数据等,下面就来逐一介绍这些基础数据类型。 5 数字(Number)Python里的数字(Number)基础数据类型,其实把Java,或者C语言里的整数类型(int),浮点数类型(float)等都包括进去了,换句话说只要是数字信息,都可以使用Python的数字(Number)数据类型来保存,保存了数字信息的变量,就叫做数字变量。 下面是一些例子: 上面四个变量使用了基础数据类型数字(Number),所以他们是数字变量。这些变量的含义和他们变量名表达的一样,分别是:
关于变量的命名知识,可以穿越到这里(关于变量的知识)复习巩固。 我们一旦用 “=” 赋值操作符完成一个给变量放置信息的操作,我们马上就可以使用它。这个时候就可以使用Python的交互器来体验。如下图: 解读:
我们再来看一下下面这个例子: 解读:这是一种最基本的变量用法。
我觉得看到这里,大家可以自己动手试试。自己动手敲一遍,感觉会完全不一样。关于Python的数字型数据类型还有一些细节,我们来看一下下面这个例子。 先问大家一个问题,num_5 和 num_6 它们相等吗? 如果你说相等,那么恭喜你答对了,如果你说不相等那么恭喜你也答对了。 在数学运算知识体系里面,他们确实是相等的。但在计算机的世界里num_5,num_6虽然他们都是数字类型,但num_5(123)是数字类型里的整数类型,num_6(123.0)是数字类型里的浮点数类型。如果你正在学习的是 C 语言,上面两行代码应该这样写: Int num_5 = 123; float num_6 = 123.0; 为什么整数,和浮点数是不同的类型呢?因为在计算机硬件层面,处理整数的运算和浮点数的运算是不同的,具体怎么个不同法,这里我们就不讨论了,超出了我们教学的大纲内容。 还好我们现在学习的是Python语言,Python把这些细节帮我们自动处理了。唯一我们要注意的是,整数类型 与 浮点数类型之间的转化,我们看下面的例子。 上面的例子很简单
我们可以看到,整数类型 转换到 浮点类型是 “顺水推舟” 的事情,没有任何悬念。但如果反过来呢?
我们会发现一个陷阱,123.9 转换成 整数不应该是 124吗 ? 为什么是 123 呢?其实Python浮点数据类型转整数类型是简单粗暴的,Python直接把小数点后面点信息砍掉,就变成整数了。这不怪Python。 【这个锅我不背】 这是由于,整数和浮点数在计算机硬件层面上的计算方式不一样。在2018年,亚马逊网站出现了一个严重的BUG,促销产品的零头都被磨掉了,根据官方说明,这是因为一个程序员在浮点数转换整型时忽略了这个特性,其实这不仅仅是Python有着问题,Java,C语言都是这样。 6 字符串(String)介绍字符串 把符号串起来,就是字符串。其实任何一种信息,我们都可以理解成字符串,比如下面的代码: 上面的代码给出了10个字符串变量的例子,在Python里面字符串的表达方式,就是 “xxxxxxx” 这样的形式。我们可以看到,字符串这种基础数据类型是非常灵活的,几乎没有任何限制。
甚至我们可以把一本书的内容全部保存到一个变量里。或者一些我们看不懂的符号,当然有些符号例外,关于这些符号是什么?后面会为大家介绍。 字符串数据类型,从字面上来理解,就是把一个个单独的字符,串在一起。在C语言里,字符数据类型和字符串数据类型是两码事,它们拥有不同的特性,字符串 是由 字符 通过数组这样的数据结构组织起来的。其实在Python里面,也是这样,只是Python把这些细节自动处理好了,程序员不用操心它们的区别。 我们可以做几个实验,打开Python交互器,然后尝试下面这些操作: Content = "hello word!" 这行代码很简单,就是把字符串数据 "hello word!" 通过 “=” 赋值运算符,放置到 Content 这个变量里面, 前面说过在Python里面,字符串数据类型,其实就是字符数组,所以我们有了后面的操作。 content[0] content[5] 这样的操作方式,在一个字符串变量后面加个中括号 “[ ]”,在中括号里面价格数字(content[5])的意思就是单独查看某个字符串里面的第几个字符是什么东西。比如: content[0] 里面放的字符是 ‘0’。 content[5] 里面放的字符是 ‘ ’(一个空格)。 我们也可以这样操作。 content[2:6],意思就是看看content字符串里从第2个 到 第6个,之前的字符串是什么。类似这样的操作,在后面为大家介绍Python列表数据结构的时候也会用到。要把这样的操作方式使用的 “炉火纯青”,我们要知道如何计算字符串中,字符的位置,如下图: 我想上图想要表达的意思已经足够清晰了,在字符串(后面要讲解的列表也是一样)里,其实隐含着两个序列,这个序列若从左到右的数,从0开始逐步加1直到字符串结束。从右到左数,从-1开始,然后逐个减1,直到第一个字符结束。 在python或其他开发语言里面这样定义很有用,它方便了我们程序员去定位字符串里的字符、数组里的元素、列表里的元素等等,根据上面的图,我们可以在打开交互器,验证一下。 我相信有的小伙伴已经在思考一个问题了,“我是否能修改这个字符串里面的某个字符?” 其实在学习一门编程语言的时候,有这样的想法再好不过了。Python提供给我们交互器,方便的让我们尝试自己各种各样奇奇怪怪的方法,我们打开交互器尝试一下,如下图: 我们尝试想把 "hello word!" 里的 "!" 替换成 "?",但交互器告诉我们,字符串类型不支持我们这样的操作,为什么呢? 因为Python字符串的“底层”逻辑,是不可变数组(不可变数组 比 可变数组的性能要好,考虑到字符串是一种非常常用的数据类型,所以Python在实现字符串这种数据类型时,使用的是不可变数组。这些知识后面大家会逐渐明朗,这里知道个大概就好)。 如果我们真的想替换 “字符串” 里面的字符该怎么办? 其实Python提供了很多字符串 操作。这些操作在后面会给大家介绍。 类型转换 在我们讨论浮点数转化成整数类型时,会存在一个小陷阱。同样字符串类型转换成数字类型也有一些细节需要注意。 数字类型 -> 字符串 数字类型转字符串也是很自然的事情,毕竟字符串可以很好地 “包容” 数字。我们来看一下这个例子: 2.2 字符串- > 转数字类型 字符串同样可以转数字类型,不过数字不包容很多符号,所以在转化的时候,我们要注意,比如: 在上面的例子里,我们通过交互器,创建了两个字符串变量 str_1 = "123.321" str_2 = "666!" str_1 这个字符串是纯纯的浮点数,数字基础数据类型,所以我们在交互器里执行 float(str_1) 代码时,得到正确的 123.321 这浮点数。 但 str_2 这个字符串,是由数字666加上一个符号“!”组成的,它并不属于纯正的数字,所以在交互器里执行 float(str_2) 交互器会给我们一个错误提示,“ValueError:could not convert string to float ....”。意思就是 “666!” 这个字符串,不能顺利地转换成我们想要的浮点数。 这样的错误无论小白还是大佬都会犯,毕竟我们在实际的软件开发过程中,要处理成百上千的变量信息。这些信息在特定场合相互转化时,就需要注意了。 深入的了解 print()这个内置的函数 print() 这个内置函数,我们已经使用过了,它存在的目的主要是为了初学者能方便的调试程序,或者在程序运行的某个重要时刻向屏幕打印关键信息,我们来看一下它的基础用法: 还是那个 "hello word!" 的例子。如果我们在交互器里,输入 content,屏幕会显示 ‘hello word!’ (注意这里有单引号,它代表这是一个字符串变量,在python里的单引号等同于 双引号“”,有别于其他开发语言)。但如果我们用 print(content) 这样的方式,我们可以看到,交互器显示的是 hello word!,这里的单引号没了! 问题来了,它们有什么区别呢? 在交互器里,直接敲入变量,交互器给我们显示的是变量里面的值是什么样子的。若我们用了print()函数,那么这个函数给我们显示的是经过处理后的变量,这里经过处理可能是转码后的,或者是转义过的等等,我们来看一下这个例子: 这个例子就可以充分的说明,有些时候我们为什么要用 print()了(当然不是为了让电脑叫一声)。选择使用print() 函数还有一个原因,就是它强大的 “格式化” 能力,那什么是格式化呢?,为什么要用格式化呢 ? 为了能让大家更直观的看到问题,这里我选择使用 Pycharm 新建一个 *.py 文件 叫做 c_3.py 来做一说明。关于Pycharm 的安装和配置,大伙可以移步到位这里学习(Pycharm的安装和新建文件)。 好了现在来看代码: 代码的思路是想通过name,age,sex,profession 这几个变量来保存自己的信息。然后使用print()这个函数来介绍一下自己。第9行 的用法和 第12行 的用法不一样,但结果是一样的。在第9行里我们使用了字符串拼接的运算,把这些变量拼接在一起,最后再用print()这个函数打印出来。第12行的代码也是拼接,但我们使用了 print()函数的一种格式化方法,让第12行的代码比第9行的代码要短一些。 当然,格式化方法的目的不是要把代码缩短,而是要让代码的逻辑变得清晰! 我们来看看第12行 print()函数里面内容都有那些有意思的东西。首先看 “%s”,"%d"。这两组符号,他们其实是占位符,意思就是在print()函数输出内容的时候被替换。那这些符号会被替换成什么呢?它们会被替换成 “%” 百分号后面圆括号里面的值。这里面有什么规则吗? 我们看下面的代码:
如果你高兴,甚至整个print()函数里面的字符串,都可以用 %s 来代替。这就是print()字符串格式化的灵活性。我们来看一个正常一点的例子: 这段代码输出的结果: 2021 - 5 - 11 , 15:25:21。细心的小伙伴注意到,上面用的是 %d,在上面用的是 %s,他们有什么区别呢?还有其他用法吗?我们看下面的列表:
一些特殊字符该如何处理? 还记得这个符号吗 “\a” ? 在字符串里它能让你的电脑叫一声,在Python里面有很多这样的符号,它们由 "" 反斜杠,加一个字符组成 比如 "\a" 。它们叫做转义字符。用来表达 字符串 里 字符很难去表达的东西。它们大致可以分为几类。
下表列出了一些有趣,有用的转义字符:
三个单引号括起来的字符串是什么鬼? 三引号括起来的字符串其实是一个宝贝,我们来看下面的例子。比如,我们要打印这首诗: 春种一粒粟,秋收万颗子。 四海无闲田,农夫犹饿死。 锄禾日当午,汗滴禾下土。 谁知盘中餐,粒粒皆辛苦。 那用Python打印这首诗我们可以这样做,看下面代码: 在str_1变量里面,为了打印出诗歌的换行效果,每行诗歌结束的时候,都要加一个 “\n” 换行符。但在str_2变量里面,为了让输出的内容换行,我们直接在字符串里换行了,并没有使用"\n"换行符,虽然换行符也会有效果。 str_1,与str_2的区别就在于,前者使用 '''' 双引号来标识字符串。后者使用''' ''' 三引号来表达字符串的。上面的例子只是打印一首诗,若要打印更复杂的文本结构(Python通过各种各样的转义符来做到),使用 "" 双引是一场灾难,毕竟敲各种各样奇奇怪怪的转义符,还是比较痛苦的。但是如果我们使用 ''' ''' 三引号来表达这些字符串,就可以从 转义符 的使用里解脱出来! 上面例子的代码,在IDE里执行,得到的结果一样。 字符编码 字符编码在最基础的语法里面(跳转链接)和大家介绍过它的来龙去脉,建议大家移步去复习一下。字符编码其实很重要,大部分软件开发工程都会碰到字符编码的问题,特别是输出中文的时候。 在Python2时代,要对UTF8这样的万能字符编码进行使用,需要现实得在Python源文件头部申明。也就是说在Python2时代,要输出中文,这一步不能少。但到了Python3时代,UTF8变成了Python默认值是的编码,这也是Python2,和Python3最大的区别之一。 Python3 对 UTF8支持后,我们可以大大方方的在代码里使用中文,但在其他软件开发的重要环节,比如数据库,比如某些第三方插件,可能默认并不只是UTF8,所以这些细节我们要注意,这样会避免很多中文乱码的问题。 7 布尔值 喵喵喵老前辈经常告诉我们,做事情不要非黑即白,有些事情要学会灰色处理。但在由集成电路板构架出来的计算机世界里,任何事情都是仅有对错组成,哪怕是我们的 ”字符“ 变量也是(通过 01010101 来表达)。布尔值就是用来记录这些电子元件表达对错信息的数据类型。 如果要简单粗暴地去理解,布尔值就是表达对错的,它有两个值 True 表示对,False 表示错。后面我们会讲到逻辑运算符与比较运算符,这些操作产生的结果就是一个布尔值。不要因为布尔值简单而轻视它,布尔值结合复杂的逻辑运算,可以轻轻松松把一个成年人搞崩溃。 8 其他语言的数据类型在Python的99%的使用场景中,涉及到的基础数据类型就三种。数字类型(Number),布尔(Bool),还有字符串类型(String),这就是Python简单易用的原因之一,它把复杂的基础数据类型简化成了三种,在Java里面基础数据类型有:
如果是C语言,这些基础数据类型会更多。其实在Python语言里,数字类型,字符串类型是把这些很基础的数据类型“打包”处理了。 Number 数字类型,打包处理了 ---> byte,short,int,long,float,double,boolean,这些数据类型。 String 数据类型,打包处理 ---> char,String(在C和java里不算是基础数据类型)。 当然Python和C,Java一样,除了基本的数据类型以外,还有复合数据类型。复合数据类型也很简单,它是由特定结构(数据结构)和各种各样的基础数据类型组成的。复合数据的类型就多了,有Python内置自带的,有软件开发工程师设计的等等。我会在进阶内容的知识里,为大家详细的介绍复合数据类型。 9 运算符合运算操作还记得经验老到的程序员,在面对各种工各样奇奇怪怪的需求时的第一反应吗?他们会从下面两个问题着手,来找到解决问题的突破口。
前面我们在介绍Python基础数据类型的时候,建立了回答第一个问题的一部分知识体系。现在我们就来看看要回答第二个问题,需要什么样的知识。 我清晰的记得,第一次看直播打赏的时候(熊猫平台打赏给一个男主播),我就在考虑,如果是我自己来写这个功能,我该如何去实现?因为我知道,小小的打赏按钮后面隐藏着无数的代码操作,对于一般用户来说,只要会点 “打赏” 这个神奇的按钮就可以了。 但作为一个软件工程师,总是会有洁癖的! 根据多年的开发经验,这个小小的 神奇“打赏” 按钮后面应该包括了下面的这些操作:
这些都是我自己的评估,在真实的熊猫平台 点击 “打赏” 按钮背后的操作远远不止这些。平台的软件开发团队,可能开发这个功能就耗费了很多的精力。类似的例子很多,比如双十一秒杀东西,我们在游戏中,主角升级,我们要冲会员才能看视频等等。 但这些操作其实都建立在最基本的数据信息操作上,这些操作我们把它叫做 “原子操作”(意思就是不能再拆分的操作)。在Python里面原子操作可以分为下面这几类:
下面我们来逐个介绍,实践这些操作符,任何一个软件工程师若想要开发出功能强大的“按钮”,那么他都必须很好地掌握下面的这些知识。 10 赋值运算赋值运算符在我们讨论变量的时候就为大家介绍了,它是任何软件开发语言里面使用频率最高的操作符。我们这里再回顾一下: 在Python里面 “=” 是赋值运算符,它的意思是把 “=” 等号左边的信息,放置到右边的变量里面。大部分主流的编程语言,赋值符号都是 “=”。 11 基础的算术运算在我最初学习编程的时候,我在想编程语言那么强大,可以做很多的事情,那么它的运算也会很复杂?但随着学习的深入,我发现,我一开始的忧虑是多余的,编程开发里的基础运算其实就是小学水平的数学运算,我们来看下面的例子,这些例子我相信上小学一年级的小伙伴都能看明白。
这些基本的算术运算简单吧? 下表把常用的算术运算符做了个总结:
前四个运算符 “+”,“-”,“*”,“/”,就是简单的加减乘除,我们日常生活中无处不在用。后面三个运算符其实也很简单,但在我们日常生活中很少用到。我们来注意看看他们在编程语言里的意义。 “%” 取模运算符: 取模运算是一个很“数学”的运算符,属于理解起来有点困难,但用起来真香那种。它的具体计算规则是这样描述的,对于整数 X ,Y 来说取模运算的步骤是这样的:
感兴趣的小伙伴,可以套几个正整数进去计算一下看看,感受一下。我相信99%的人并不关心 “%” 取模运算是怎么个计算方式(算法),只关心它有何用?我们来看一下这个问题 "如何去判断用户输入的数字是奇数?" 这个问题很简单,任何一个整数的最后一位能被2除尽,就是偶数,除不尽就是奇数,那这个代码该怎么写呢? 这个时候,我们就可以使用 “%” 取模运算符,看如下代码: 这段代码很简单,涉及到的 i f 判断语句,后面的课程会详细为大家讲解。这段代码重点是想向大家展示,我们通过 “%” 取模运算可以方便的计算一个整数是奇数,用被计算的整数去与 2 求模,如果结果等于 1,那么这个整数就是奇数。 判断奇数,只是取模运算运用例子的冰山一角,判断素数,在人工智能里面矢量的判断,在图形计算里面一些像素的混合计算,在打游戏的时候,一些技能的临界点计算,都需要使用 “%” 取模这个运算符。随意,随着你编程能力的提升,解决需求复杂度的提升,“%” 取模 这个运算符你是逃不了的。 “**” 指数运算符: 指数运算的计算方法很简单,比如 2*3 它的意思就是 22*2 。在一些比较复杂的科学数据计算里面,指数运算符是比较常用的,比如一些财经类的数学运算等等。 "//" 相除后向下取整运算 我们直接来看下面几个例子: 这个运算符,会把两个数相除,然后把小数部分无差别的抹掉。这样的计算方式在游戏开发里面经常会用到,比如计算一个游戏BOSS的血量。BOSS有些时候受到攻击会有魔法加成,魔法加成的部分也许会涉及到除法操作(“/”)。有些时候在计算机里除法运算做得多了,会出现这样的血量数据: 0.000000121321321423123123134。 这样的数据在判定一个BOSS是否被击败的时候至关重要,这样的数据可能造成,故事脚本模块认为BOSS还未被击败,但主角模块认为BOSS被击败了,然后就卡BUG了。很多有游戏或者交易系统里都会出现这种灵魂BUG。 所以,在一些关键除法上面,使用 “//” 这个操作符是有必要的。 基础运算符,能用在字符串上吗? 上面的基础运算,我们都是基于Python数字基础类型变量来操作的,那么这些基础运算是否可以用在Python字符串基础数据类型上呢? 我们看如下代码: 我们仔细逐行的看上面的例子,我们可以发现字符串是可以进行 “+” 操作的。操作的结果是把两个字符串 拼接 在一起。并且字符串,是可以与一个整数进行 “*” 乘法运算的,运算的结果就是重复的把这段字符串拼接在一起,比如: str_1 = "hello " str_1 * 3 结果就是,"hello hello hello ",但是我们试图尝试让字符串做 “-” 减法,还有字符串与字符串的乘法,Python交互器就给出了错误的操作提示,不支持这样的操作。其实字符串的 “+” 加法是Python对字符串拼接的一种优化操作,很多编程语言都有这样的做法,那字符串有没有其他的操作方式呢?那肯定是有的,并且还不少,我们在后面的课程里面会为大家介绍。 简单总结一下,在下面的这些场景中,我们会用到算术运算符:
那如果我们要解决下面的问题,该怎么办?
为了很好的解决上面的问题,我们需要了解下面的运算符号。 12 比较运算如果说算术运算是算两个信息 “互动” 的结果,那么 “比较” 运算,就是算两个信息的关系,同样很简单,小学数学水平,也是我们生活中无处不在的经验,我们看一下下面的例子: 我们可以看到上面的例子,两个数字型变量分别是num_1 = 12,num_2 = -21。然后下面对它们进行了 “>”,"<","==",三种比较,这些符号和他们要表达的意思是一样的,比大,比小,看看是否相等等等,并且我们发现,比较的结果要么是 True 要么是 Flase,前者要表达的是 “是” 的意思,后者要表达的是 “否” 的意思。 前面我们讨论过Python的两种基本数据类型,数字型(Number),字符型(String),然而Python还有第三种基本数据类型 布尔类型(Boolen),这种类型的变量只会有两种值,就是刚才我们看到的 True 和 False。 比较运算符只会产生布尔类型(Boolen)的基础数据,也就是说比较符号运算只会产生要么是True,要么是False两种结果,不会有第三种,现在我们来看看Python给我们提供了哪些比较运算符:
这些运算符的含义和使用方法都很简单,我们之前提到的,VIP权益检查、玩游戏时BOSS是否被击败等等这些相对复杂的判定方法,都是基于这些简单的比较运算符组合出来的。 好奇的小伙伴会问,这些运算符能不能用在数字类型以外使用?我们来看看下面的例子。 上面这个例子,我们尝试用数字型变量和字符串变量进行比较。 我们先拿 num_1 和 str_1 比大小,Python解释器提示我们:not supported between instances of 'int' and 'str',意思就是Python不支持这两种类型比大小。 我们又拿 num_1 和 str_1 比相等,这次可以比较了,结果为False。这样的现象也很好理解,本来就是不同的东西我们怎么比较? 就比如我们拿咏春拳和CUP比相等一样,没有任何意义,所以结果为False,是符合常识的。 接下来我们有创建了str_2,str_3,str_4这三个字符串变量来做下面的实验。我们拿 str_1 和 str_2比大,发现有结果,并且结果是 True,说明字符串之间是可以比大小的,但比较的规则是什么? 这里我就不卖关子了,字符串之间的比较算法如下: 在两个字符串中,先从它们的第一个字符的ASCII码开始比较(ASCII码是一个八进制的数,所以可以进行数字比较)。若它们的第一个字符串比出结果来了哪个字符大,那么这个字符串就为大!如果它们的第一个字符一样大,那么就比较第二个!如果一个有第二个字符一个没有,有第二个字符的大! 上面的实验 str_2 = "abc",str_3 = "def"。在进行 str_2 > str_3 的时候,Python会先用 “a” 和 “b” 进行比较。“b” 的 ascII 码,大于 “a” 的 ascII码,所以 str_3 是大于 str_2 的,所以 str_2 > str_3 结果为False。 再看最后一个例子,str_2 与 str_4 的等于比较,由于str_2 和 str_4 它们放置的信息都是 “abc”。所以它们做 “==” 等于比较运算的结果等于 True,也就是说在Python,这两个变量的值,是为相等,其实这很符合常理,“abc” 就等于 "abc"嘛。 比较运算还可以有下面的操作: 是的,Python支持比较运算符连着写,比如上面的例子,3>2>1,这还好理解。但最后一个比较运算符就有点让人头痛了(如果把算术运算写进去,那是真头痛)。Python 在处理比较运算符连着用代码时,内部是做了一个转换,怎么转换呢? 在学习逻辑运算符的时候为大家解释。 这样的用法很灵活,但它的代码可读性一点也不好,代码可读性 是用来衡量一个程序员写的代码,其他程序员是否能理解的指标。评估一个程序员厉不厉害,它是重要指标之一,这一定要切记!!! 比较运算符,运算后产生了 True,False这两种布尔值,不要小看它们简单,他们依然可以通过逻辑运算符来构建强大的逻辑判断,现代人工智能技术,比如google的TF框架,很多操作就依赖逻辑运算符。 13 逻辑运算符逻辑运算符只有三种,看下表:
与(and),或(or),非(not)。在逻辑学里面是最基础的逻辑计算,我们生活中有很多类似的问题,我们都要用这三个逻辑运算符来思考或做出决策,甚至有些是无意识的,下面是来自于生活中的例子: 生活中 “与” 的例子: 我们买双色球时,只要6个红色球与1个蓝色球全部买中,那么你可以不用继续学习我们的课程了。双色球的游戏规则里面,7个球都要命中,就能拿头奖,如果有一个球(可以理解成一个条件不满不足)对不上号,那头奖都不是你的。 生活中 “或” 的例子: 你买一注双色球,开奖后满足下列条件之一,就可以中奖5元钱了。
满足上面条件之一,就可中奖5元钱。 生活中 “非” 的例子:
在实际的开发过程中,程序猿会处理大量、复杂的逻辑运算,比如用户身份认证、用户是什么“爵位”、人工智能机器学习模型的设计等等。但无论是什么样的“艰难”抉择,最底层的逻辑都是由三种 “与” “或” “非” 组成的,所以深刻的理解它们对后续软件开发能思路清晰,非常重要。 “与” “或” “非” 构成了逻辑学,逻辑学也可以让程序猿们如虎添翼,关于这方面的知识,可以移步到这里(穿越)。 在继续学习前,我们来看一个有意思的实验,也许有的小伙伴已经猜到是什么了! 我们看上面的例子 3+25 与 (3+2)5 它们会计算出完全不同的值,这个很好理解。因为在前者的运算中,乘法的优先级高于加法。在后者中,括号内的运算优先级高于括号外的。这些都是在数学领域里面的基础知识。 我们再来看这个运算: 3+2*52+8/6 > 99 < 26 == 26 != 99*8/2-16 and 25*0 or 21*9 当Python遇到这样的运算时,Python会顺着从左到右的运算,还是会根据一套隐藏的优先级规则来运算呢? 这就是下面内容的重点,运算的优先级。 14 运算的优先级在各种各样的编程语言里,运算符优先级是约定俗成的,这些优先级的设计考虑是为了程序猿们能更高效、更清晰的编写代码,就像我们的键盘按键布局一样。下表说明了在Python中,运算符的优先级。
上面的列表,告诉我们指数运算符优先级最高为1,比较运算符的优先级为7。我们可以看看下面这个例子: 7 > 2**3 根据Python由县级的约定,Python会先计算 2*3,也就是 22*2 ,运算结果等于8。然后再计算 7 > 8,最后运算结果为 False。 我们可以打开Python交互器试验一下。 那如果我们要 “插队” 打破 默认的优先级约定该怎么办? Python 给出的解决方案和我们小学学的数学知识一样,使用 “()” 括号对来 “插队”。还是上面的例子 7 > 23 如果我们想让 Python 先做比较运算,我们可以这样操作 (7>2)3。这时我们使用交互器看看结果如何? 交互器会先计算 7>2 ,计算的结果为 True。然后在 计算True3。这里有个小细节需要我们注意,我们都知道Bool(布尔)数据类型只有True,False这两个值。在Python里布尔变量和数字类型变量做算术运算时,True会被视为整数 1,False会被视为整数 0 ,所以在这里 True3,其实就是 1*3,最后Python运算下来的结果就是 11*1 = 1。 通过上面的实验,我们可以发现,在算术运算里面我们可以把 布尔(Bool)值也加入进去。看下面的例子: 15 一些奇怪的运算符上面的运算符优先级表,列举出来了Python所有的运算符号,上面也给出了我们常用运算符的含义和例子。还有一些运算符并不是很 “直观” 甚至有点奇怪,我们来逐个看一下。 “=” 赋值运算符的一些变体。 %=, /=, //=, -= ,+= ,*= ,**=。 这7个赋值运算符的变体,都是一个 “=” 赋值运算符加上一个算术运算符,比如 “+=” 这个运算符,这样的变体有什么意义呢? 我们直接打开交互起来试验一下。 上面的代码我们创建了一个变量 num_1 = 10。然后我们使用了一个变体运算符 “+=” ,最后 num_1 的值变成了 15。 我相信你已经看出了变体运算符的含义,“+=” 的意思就是先让右边变量的值和左边变量的值进行加法运算,然后把运算结果 赋值 给左边的变量。所以: num_1 += 5 完全等同于 num_1 = num_1 + 5。 这种问题叫做变量 “自加” ,上面的例子就是解决变量 “自加” 比较好地实践,完全看个人习惯。以此类推 “+=” 这是自加,那么相应的 %=, /=, //=, -= ,*= ,**= 变体符号,大伙应该能知道它们的作用了吧。 除了 “+=” 这样的变体外,还有: 位运算:^ ,| 。 右移,左移: << ,>>。 身份运算:is,is not。 成员运算:in,not in。 这些运算符在某种特定的场景里面会给开发者带来便利,但也很抽象。脱离这些场景来认识这些运算符是低效率的(保证学了就忘记)。所以我决定在后面特定的例子里面,再为大家介绍这些运算符。 到目前为止,我们了解了变量的基础知识,也了解了变量之间的运算。那我们如何把各种各样的变量和运算符号组织起来,编写出正确、舒服的程序代码呢? 我们来看下面的内容。 16 基础语法结构的使用有了保存现实中各种各样信息的变量、有了处理信息的运算符,我们还差一样东西把这些思路通过编程语言有效的组织起来,这就是语法结构。所有编程语言都有这三种基本的语法结构。它们是顺序、选择、循环。 这三种最基础组织代码的方式,组织出来了各种各样的软件和系统,相信我把他们掌握好,不仅仅是Python语言,其它开发语言学习起来也会很轻松,上手会很快。 17 顺序结构计算机CPU执行指令操作的时候,是一行一行指令执行的,所以开发语言的编译器、解释器在执行代码的时候也是自上而下、一行一行代码执行的。这个很好理解,就像我们说话、做事情一样得一句一句地说、一件一件事情的做。 有的小伙伴可能会问,为啥我的电脑可以一边追剧、一边下载东西呢?这两件事情不是同时都在执行吗? 其实这是一种错觉!现代计算机的运算速度,最快可以达到每秒280.6万亿次计算!这是什么概念?假如计算机每次执行的任务是花1元钱,那么1秒钟,计算机可以花2000个马云身价的钱! 所以我们在边看剧,边学习,边下载游戏的时候,计算及实际的状态是这样的: 计算机在1微秒的时候给你看到你需要追剧的画面,趁你的大脑正在解析追剧画面的时候,计算机在下1微秒的时候去继续下载需要的资料。这种切换很快速,我们人类的知觉是感觉不到的,我们只能感觉到这两件事情是同时在进行。 在软件设计方法里有一种设计图叫做时序图,这种图就是专门来刻画在很小的时间单位里,计算机是如何一件一件的做事情的,这些设计图的使用知识会在后续课程里为大家详细的介绍。 我们来看一下下面这一段代码: 上面这段代码的执行顺序就是 2,3,4,6行的执行。其中行的概念在编程语言里很重要,但不同的编程语言,对于行的概念界定不一样。在Python里面输入完代码,然后回车,那么刚刚输入的内容就是一行。在Java里面,一行代码的结束标志是“;”号,这样的“;”号,叫做行结束符(在Python里,回车就是行结束符)。不同开发语言的行结束符会不一样,但意思是一样的。 好奇的小伙伴会问,有没有什么方法打破这种顺序 ? 当然有,这就是臭名昭著的 goto 语法!它能让代码任意的跳行执行,可以让代码跳到上面的若干行,执行完又跳回来。 goto 语法在很多开发语言里,是被建议禁止使用的,因为它太灵活,灵活到难以维护和控制,你设想一下下面的场景,哪个图片的线路比较好维护呢? 在Python里面,要使用goto语法,需要安装额外的开发库。 18 选择结构根据国外人类行为学家的统计,我们每天平均要做3000多个选择(有意识和无意识的),所以在用编程语言解决工作中实际复杂选择的时候,我们会用到大量的选择结构来组织我们的思路和代码、从而完成复杂的程序逻辑,我们先看一下选择结构的流程图。 在Python代码里面,选择语句是这个样子: 一开始接触选择结构,我们逐行来看:
为了更好地理解上面的逐行解释,我们再来看看下面这张图: 这是最基础的选择结构,它能解决大部分“二选一的”问题。但实际开发中会遇到一些稍微复杂一点点的问题,比如下面这个问题。 “根据年龄来判断这个人属于什么样的成长时期?” 为了把问题分析得更清楚,我们先来画一个简易的流程图。(关于流程图,本课程也会详细地为大家介绍) 无法复制加载中的内容 通过流程图,我们可以看到我们在基础的选择结构上做了很多平行的“筛选”条件。现在我们根据流程图,来敲代码:
通过 if,elif 这两个关键字,加上合适的条件语句,我们就可以构建出相对复杂一些的条件语句结构。这样的玩法叫做 “平行选择条件” 的选择结构,根据数据来划分阶段类似这样的问题,比较适合使用 “平行选择条件”的选择结构。 我们现在再看一下这个问题:"给出一个正整数,并且它是偶数!" 同样先看流程图: 好了,结合我们前面所学的知识,开始敲代码! 选择结构嵌套并不难,就是在 if 语句块里面再来一个 if 。在实际的开发过程中,我们要搞清楚的就是哪个 if 和 else 是一对。这在python的语法机制里也不困难,还记得在介绍最基础的语法时,为大家介绍的缩进规则吗? 记不得可以去回顾一下。 通过这样的 if 语句嵌套,形成选择结构,我们通常叫做 “深度选择条件”,这样的选择结构往往用在从大范围里面寻找小范围的的场景。 当然,if 语句还有一种最简单的形式,看代码: 只要满足条件,第6行的 print 函数就会被Python执行,这种用法在代码调试时输出信息时会看到。好了现在我们来总结一下 Python 的选择结构。 Python的 选择结构 有4中用法:
19 循环结构顺序、选择这两种组织代码的方式还算是比较接近我们平常思考问题的方式。但到了循环,这个组织语言的方式就和我们平常的思维习惯有点不一样了(切换思维警告)。了解完循环后,你可能会说。循环咋就那么简单? 上大学的时候,教我们C语言的老师,在讲解循环结构之前,给我们提了一个问题,我印象深刻。老师问:“用代码编写一个x,y,z 这三个正整数变量相加的程序”。这个题目很简单,如果用Python来编写代码如下: 老师又问:“如果不是x,y,z而是x1,x2,x3,x4.......x1000,1000个整数该怎么办!?”这是一个很有启发性的问题。它告诉我们,如果还是按照x,y,z的思路来设计、编写代码,也不是不可以,我们来看下面的代码: 这应该是萌新遇到类似问题的第一个思路,当然实际开发中我们是不会这样做的,我们有更好的方法,若我们要解决这个问题,需要其他的思路。这个思路需要明确两个问题。
我们先来看一下循环结构语法的流程图。 while 关键字循环 在Python里面,一个简单的循环语法结构应该是这个样子: 第一次接触循环语句,我们来逐行的了解一下它:
现在我们结合逐行解释,再来看看这个图: 它的结构也很简单,同样和选择结构一样,可以不断的“嵌套”,然后形成一个复杂的循环“机器”。不过这里需要注意一点,循环的嵌套要慎用,因为它严重的影响代码执行的效率(大家可以想象为什么?)。 我们来看一下这样的循环结构: 上面的代码可能看上去有那么一点点复杂,整个循环结构使用while语句嵌套了3层,每层会执行100次,三层就会执行 100100100 次。虽然计算机的运算速度很快,但这样的指数增长也不得了,在一些数据库查询的场景里面,循环的就不是100条数据,可能是10W,20W,如果在这样数量级的场景里面使用嵌套循环,那么这个地方很可能就是性能瓶颈。 这是尽量少用嵌套循环结构的原因之一,另外一个原因就是嵌套循环代码易读性不高,搞不好把自己“循环” 进去出不来。 for 关键字循环: Python 除了有 while 循环外,还有 for 循环,我们来看 for 循环的例子: 继续逐行解读: 第15行 for 循环从 for 关键字开始,紧跟后面的 i in range(1000) 是个整体,其中 in 也是一个关键词,它的意思是从 range(1000)(range是一个Python的内置函数)生成的1000个整数中,逐个取出来,放到 i 这个变量里。每取出一次,都会执行下面的代码块,直到把1000个整数全部取完。 其实这里的操作,按照Python的说法是完成了一个 “迭代器” 或者 “数据集”的遍历,关于 “迭代器”,“数据集”,“遍历”的概念,会在后面的课程中为大家解读。在Python里,for 循环关键词 就是为了 “数据集”、“迭代器” 的遍历而生的。 同样,for 循环也可以嵌套: 这里 for 循环的嵌套和 上面 while 循环的嵌套效果是一样的,只是关键字不一样,和循环终止的条件语句不一样。同样for循环语句也要少用嵌套它会带来性能问题和代码维护问题。 通常情况下,程序员在分析完程序以后,有了完整的开发思路,然后通过程序语言提供的 顺序结构、选择结构、循环结构、各种各样的表达式、数据类型、变量、基础的运算操作 就组成了我们最基础程序代码。 到目前为止,我们仅仅介绍了Python的一些基础编程知识,有了这些知识我们再来看下面的内容就会轻松很多,学习也会有趣很多。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/25 14:28:19- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |