标签 Python 下的文章

一对一的字典

在Python中,将两种数据关联在一起形成一个元素, 由多个这样的元素组成的数据类型称为字典,又称为dict。
字典中的元素是不考虑排列顺序的。

组成字典元素(item)的两个数据一一对应,分别被称为键(key)值(value),所以字典的元素又称为键值对(key-value)
字典的元素只能通过键来查找对应的值,所以一个键只能对应一个值。

就像在通讯录中,我们通过联系人(键)来查找联系方式(值)。

在Python中,字典的键值对由冒号分割。冒号左边的数据为键,冒号右边的数据为值。
将多个这样的数据以逗号分割,存储到一个大括号中,就形成了一个字典类型。


products = {"口香糖": 15, "可乐": 5.5, "薯片": 45}
print(products)

代码的作用
创建一个字典“products”来存储商品信息,然后为他存储三个元素:
"15元的口香糖","5.5元的可乐","45元的薯片"。
使用print输出了整个字典。

products
一串字母,字典的变量名。

{ }
一对花括号,是字典存储数据的固定格式。

字典的键
三个字符串分别作为字典的三个键。
字典中的键可以由任意不可修改的数据类型组成(数字,字符串,元组)。
字典的键是唯一的,即一个字典不会有两个相同的键

字典的值
三个数字分别作为字典的三个值。字典中的值可以是任意数据类型。

:
三个冒号,用来连接键与值。

,
两个逗号,分割字典中的多个元素。

代码小结
当我们要定义一个dict操作时,可以使用下面的格式

作为一种数据结构,字典和列表一样,也会有查找、删除、添加、修改等功能。
但由于字典的元素,是由键值对(key-value)组成,并且字典是没有顺序的结构,因此在功能的使用上,有所不同。

查找元素
从列表中查找一个元素时,我们通过这个元素的索引,来进行查找。

字典是没有顺序的,也就没有索引,所以只能通过字典的键(key)来查找对应的值(value)

删除元素
从列表中删除一个元素时,我们使用pop()功能,通过这个元素的索引,来进行删除。
在字典中,我们依旧使用pop()功能,通过这个元素的键,来进行删除。

列表是可变的,可以通过索引修改元素,也可以通过append添加内容。
事实上,字典也是一种可变的数据类型。这意味着除了查找与删除,我们也可以对字典进行添加与修改。
但是字典的添加与修改过程与列表不同。

字典的添加与修改


products = {"name": "可乐", "type": "饮品", "price": 5}
products["other"] = "七折"
print(products)

代码的作用
创建一个字典“products”来存储选择的商品信息,然后为它存储三个键值对:
“商品的名字为可乐”,“商品的类型为饮品”,“商品的价格为5”。
第2行:为字典添加一个元素:“其它优惠活动为七折”。

字典名
要修改的字典变量名

中括号
中括号,设置要添加的键

添加的键
指定一个新的键。
字典的键可以是任何不可改变的数据类型(字符串,数字,元组等)。

=
等号=,赋值符号。

添加的值
一个字符串,表示要添加的值

修改元素
字典的键是不能重复的。当我们尝试添加一个已经存在的键时,就会将该元素覆盖。
所以对字典的修改,就是对字典的某个已经存在的键重新赋值。

代码小结
当我们要为字典添加或者修改一个元素时

以上就是对字典的查找、删除、添加与修改操作。
目前为止的两种可以修改的数据类型,即字典与列表。现在我们来比较一下这两种数据类型在操作上的不同之处。

若我们不知道字典有哪些键怎么办?
在字典中,我们还可以通过"keys()"功能获取这个字典所有的键。
keys()是字典的一个功能,它能够提取一个字典所有的键,并存储在一个类似于列表的名为dict_keys的数据中,方便我们查看该字典的键。
需要注意,keys的右边有一对空的括号。

除了使用“keys()”以外,我们也可以通过in运算来检查字典是否包含某个键。

灵活多变的列表

列表又叫List,与元组的结构类似,也可以用于存储多个类型的数据。


friendName = ["Kevin", "Tony", "Asum"]
print(friendName)

代码的作用
这2行代码定义了一个叫做“friendName”的列表,并输出了列表中的内容。

第1行代码给这个列表friendName赋值,包含三个字符串数据:Kevin,Tony,Asum。
第2行代码输出了整个列表。

friendName
变量名,用来存储这个列表。

[]
一对中括号,是定义列表的固定格式。

,
逗号,列表内部数据之间使用逗号分隔开。

空格
两个空格,这里的空格不是必须的。
但为了代码美观,建议在逗号后面加一个空格。

字符串
三个字符串,是friendName这个列表里面包含的具体数据。

代码小结
我们可以使用图中的格式输出列表中的内容。

我们知道元组中可以存储多种类型的数据。
列表与元组一样,列表中的数据元素可以是任何一种类型,如图所示,整型、浮点型、布尔数等。

除此之外,列表中的数据也可以是整型,浮点型,字符串或布尔数的任意组合。
如图所示,列表mixedList中,包含整型、浮点型和字符串三种数据类型。

取单个元素
上节学过,使用索引能够获取元组中的元素,列表与元组类似,也可以使用索引。
如图所示,取第一个元素,使用players[0],取第四个元素,就使用players[3](索引从0开始)。


players = ["小叮当", "qian", "Tang", "Max", "杰老板", "飞飞"]
print(players[2])
print(players[5])

我们知道索引用于取单个元素,如果要提取列表中的多个连续的元素,该怎么操作呢?
先学习切片的概念。

切片

编程中的切片能对元组、列表等有序数据结构进行处理,以截取数据中连续的片段,方便使用。


someLetters = ["a", "b", "c", "d", "e"]
print(someLetters[1:3])

代码的作用
这段代码做的事情是定义了一个叫做"someLetters"的列表。

第2行代码截取了列表中的第二个和第三个元素。

定义列表
第1行两侧的一对中括号[],表明数据类型为列表,列表中的每个元素都是字符串。
将列表赋值给变量名someLetters,因此,列表名称为someLetters,列表内容为["a", "b", "c", "d", "e"]。

[]
第2行中列表+中括号([]),括号中既有数字也有冒号(:),表明要对列表进行切片。

:
利用切片取元素时,需要使用冒号,用于分隔切片开始的位置和切片终止的位置。

数字
切片要遵循“左闭右开”原则,就是取左边的数据,不取右边的数据,与数学中的区间类似[1, 3),取左不取右。

注意:切片与索引类似,也是从0开始,即第一个元素的索引为0。

例如,第2行中的someLetters[1:3],索引从0开始,这里就是取第2个元素到第4个元素。

又需要遵循“左闭右开”原则,则取第2个到第3个元素,输出['b', 'c']。

代码小结
当我们想要使用切片的时候,我们可以使用这样的格式

切片时,开始位置和结束位置的数字,还有三种填写情况。

  1. 只填写结束位置的数字;

  2. 只填写开始位置的数字;

  3. 两侧数字都不填写。


  4. 开始位置数字不填,默认从第一个元素开始切片。根据“左闭右开”原则,如图,从第一个元素(含)开始,取到第三个元素(含)。


  5. 结束位置数字不填,默认从开始位置切片,取到最后一个元素。

注意:不填写结束位置的数字时,列表中最后一个元素也会被提取。如图,表示从第二个元素(含)开始,到最后一个元素(含)结束。

  1. 开始位置和结束位置都不填写时,就是取列表中的所有元素。如图,[:]直接取出所有元素,但这种用法不常见,了解即可。

学习了列表的切片方法后,元组也可以使用切片来截取一段数据,如图所示。

学习了索引和切片访问列表中数据的方式后,如果,某个列表中的数据定义错误了,想要进行修改,该怎样操作呢?

列表的修改


friendName = ["Kevin", "Tony", "Asum"]
print(friendName)
print(friendName[0])
friendName[0] = "Jessica"
print(friendName)

# output

# ['Kevin', 'Tony', 'Asum']
# Kevin
# ['Jessica', 'Tony', 'Asum']

代码的作用
这5行代码定义了一个叫做“friendName”的列表,并输出了不同的结果。

第1行给列表friendName赋值了三个数据:Kevin,Tony,Asum
第2行输出整个列表。
第3行输出列表中的第一个数据,也就是字符串"Kevin"。
第4行通过代码friendName[0]修改了列表的第一个数据,给它赋值字符串"Jessica"
第5行输出了列表friendName

friendName
变量名,用来存储这个列表。

[ ]
一对中括号,用来表示一个列表。

[0]
中括号加数字,作为索引,用来定位列表中的某个数据。
本例中,索引0表示第一个数据。

Jessica
一个字符串,重新给friendName这个列表中的第一个数据赋值。

代码小结
当我们要对列表中的数据进行修改时,可以使用图中格式

列表和元组有很多相似点,但列表的修改不能应用于元组中,元组具有不可变的特性。
元组的内容定义完成后,里面的内容就不能修改

由于,元组是不可修改的,强行修改会出现以下 bug:
类型错误:
当对元组进行修改时,就会提示元组类型数据更改(TypeError: 'tuple' object does not support item assignment)

了解以上知识点后,我们需要对元组和列表进行区分:

相同点:

  1. 可以使用索引定位到某个元素;
  2. 可以使用切片取一个片段;
  3. 可以存储不同的数据,如,字符串、整型、浮点型、布尔数等。

不同点:元组内容是不可修改的。

例如:程序员在编写程序时,也会犯错,因此像元组这样不可变的数据结构可以有效防止写代码的人因为自己的错误,误修改了里面的数据。

列表的便捷操作

学习如何在列表中追加元素、插入元素和删除元素。

列表的追加

追加(Append):追加一般用于描述在列表的末尾添加元素的行为。

Python 提供了给列表追加元素的功能。
当我们想在列表的尾部追加一个元素的时候,可以在列表名后使用 append() 语句。


friendName = ["Max", "Jeremy", "Christina"]

friendName.append("Vane")

print(friendName)

代码的作用
这三行代码定义了一个名为 friendName 的列表,并给这个列表追加了一个元素,最后输出了这个列表。

列表名
friendName 是一个列表名,用来表示先前定义的列表。

句点
一个句点,表明将会使用列表的某个内置功能。
这是一个固定的搭配格式,只能使用英文句号,不能替换成其他符号。

append
append,类似print,表明我们要在这个列表的尾部添加新的元素。

( )
一对英文括号,这是 append 功能的固定格式。括号内是具体要添加到列表末尾的元素。

追加元素
在列表 friendName 中追加一个元素,使用 append() 一次只能追加一个元素。

使用 append() 可以追加不同数据类型,包括:字符串、整型、浮点型、元组以及列表等。
在第 4 行代码中,虽然追加的是列表,但是也看作一个元素

代码小结
当在列表尾部追加一个数据时,使用如下格式:

列表的插入

在 Python 中,可以使用 insert() 语句来执行插入元素的操作。


rank = ["Max", "Jeremy", "Christina"]

rank.insert(1,"May")

print(rank)

代码的作用
在这段代码中,定义了一个名为 rank 的列表,在这个列表中间插入了一个字符串"May",并在最后输出了这个列表。

列表名
rank 是一个列表名,用来表示先前定义的列表。

句点
句点,表明将会使用列表的某个内置功能。

insert
insert,类似print。表明我们要在这个列表的某个位置插入新的元素。

( )
一对括号,这是insert功能的固定格式。括号内是插入的元素位置以及要插入的元素。

两项内容
我们需要在 insert() 的括号中填入两项内容:
第一项是元素插入的位置;
第二项是插入的具体数据。

索引
第一个数字位置表示索引,也就是这个元素要插入到列表中的位置。
索引是从 0 开始。
本例中索引 1 表示插入到第二的位置。

逗号
一个逗号,用来分隔插入的位置以及插入的具体数据。

插入元素
插入的元素可以是不同数据类型,包括:字符串、整型、浮点型、元组以及列表等。
在本例中,我们向列表中插入一个字符串"May"。

插入元素以后,排在此元素之后的原有元素自动后移一位。
在本例中,"May"插入到列表rank中的第二项中,原有的"Jeremy"和"Christina"就自动后移一位。

代码小结
当在列表中插入一个数据时,使用如下格式:

列表删除元素

学习的两个列表内置语句:append() insert(),这两个语句都可以往列表中添加新元素。
如果列表中存在不需要的元素,想要删除它,可以使用 pop(),删除列表中的元素。


primeNumber = [1, 3, 5, 7, 9, 10]

primeNumber.pop()

print(primeNumber)

代码的作用
这段代码定义了一个名为 primeNumber的列表,并且删除了这个列表中最末尾的一个元素,最后输出了这个列表。

列表名
primeNumber 是一个列表名,用来表示先前定义的列表。

句点
一个句点,表明将会使用列表的某个内置功能。

pop( )
pop(),作用是删除列表中指定索引处的元素。
括号内的数字表示要删除数据的索引,不填写数字则表示默认删除列表中的最后一个数据

pop() 括号内的数字表示要删除数据的索引,在本例中索引值为1,就删除了列表primeNumber中的第二项元素。

代码小结
当我们需要从列表中删除一个数据,使用如下格式:

pop()在删除列表指定的元素后,可以赋值给变量存储下来。
本例中,删除的是列表primeNumber中最后一项元素 10,将整型 10 赋值给变量lastData,接着通过print()输出变量lastData。

我们前面的例子在定义一个列表时,都是使用的常量来作为列表中的元素。
变量也同样可以作为定义列表的元素,并且列表的各种操作也同样适用于变量数据。
图例中展示了变量作为列表元素时,代码的使用方式。

数据结构

之前学习的变量可以存储1个数据,当我需要存储10个数据的时候怎么办呢?
写10个变量可以解决这个问题,但是太冗长。

也可以如图所示,用这样一个变量来存储10个数据。
在Python中,有几种内置的“容器”,可以按不同的方式存储多个数据的集合。

这样的“容器”,称之为“数据结构”。

数据结构是计算机存储和组织数据的方式。

数据结构有很多种,其中使用最多的,是元组(tuple)、列表(list)、字典(dict)这三种。

储存多个数据的元组

假设我们想要存储日期的数据,将“1月1日”,“1月2日”,“1月3日”,“1月4日”存储在一起,这时就可以使用元组(tuple)。

元组,是一种由多个数据组成的有序数据集合。它就像一排抽屉,我们可以在抽屉里面放不同的东西。

“1月1日”,“1月2日”,“1月3日”,“1月4日”使用元组存储在一起,可以写成如图的样子。

来具体学习元组的代码写法。


calendar = ("1月1日", "1月2日", "1月3日", "1月4日")
print(calendar)

代码的作用
这2行代码定义了一个calendar的元组,然后打印了这个元组。

第1行给一个元组赋值了"1月1日", "1月2日", "1月3日", "1月4日"这四个日期;

第2行打印了calendar这整个元组。

( )
一个括号,是定义元组的固定格式。

元组的变量名
这串字母calendar是元组的变量名。

四个字符串
四个字符串,这里的四个字符串数据是元组包含的四个元素。

,
三个逗号,逗号是用来分隔元组里面各个元素的固定符号。
逗号右边的空格可有可无,这里添加空格是为了代码风格考虑。

代码小结
当我们想要使用元组的时候,可以使用这样的格式

元组里可以存储各种各样的数据类型,一个元组可以完全由整型、浮点型、字符串、布尔数构成。
也可以由这几种数据类型的常量混合组成。

元组中的数据是有顺序的。也就是说,如图在calendar这个元组里面,排在第一位的是"1月1日",第二位是"1月2日",第三位的是"1月3日"。第四位的是"1月4日"。

当我们输出calendar[0]的时候,就得到了这个元组的第一个数据。像这样访问它内部数据的机制,叫做“索引”。

索引

索引是在数据结构中用来定位和寻找数据的检索方式。

可以通俗理解为索引是数据的位置。
索引都是从0开始的。因此,第一个数据的索引为0,第二个数据的索引为1,以此类推。

可以通过中括号[]和索引的方式,直接访问到某一个位置的元素。
如图,通过索引,直接输出了第一个元素和第二个元素。

倘若一个元组的元素非常多,我们想要寻找某一个数据,是不是在元组中,用肉眼看的方式非常麻烦。
元组这样的数据结构,有一种运算方式,叫in运算符,可以进行快速判断。

in运算


numbers = (0,1,2,3,5,8,13,21,34,55,89,144,233,377)
result = 5 in numbers
print(result)

代码的作用
这3行操作,判断了5是否是元组中的一个元素。
第1行,定义了一个元组numbers。
第2行,进行一次in运算,判断5是否是元组numbers中的一个元素,将运算结果赋值给result
第3行,输出运算结果是True

常量
判断这个数据,是否是元组中的一个元素。

元组
需要判断的5,是否是这个元组中的一个元素。

in运算符
in运算,进行5 是否是 numbers 中的元素的运算。

result
将in运算后的结果赋值给变量result,然后进行输出。

in运算的结果,是一个布尔值(True/False)。

代码小结
当我们要输出一段完整文字就需要这几个部分

判断语句

判断语句是程序的三大语句结构之一。

它的作用是根据判断的条件是否成立(真或假),来决定后续代码执行顺序。

单选选择的判断-if判断


yourAge =  20
myAge = 18

if yourAge > myAge:    
    print("你的年龄比我大")

代码的作用
这段代码将两个人的年龄进行判断,并且输出了结论。
第1行和第2行代码,将年龄分别赋值给两个变量。
第4行代码将两个变量进行判断。
第5行代码,输出"你的年龄比我大"。

if
使用 if (中文翻译为如果),表明我们要在这里进行语句判断。

判断条件
if 后的判断条件通常是一个布尔表达式。
即该表达式有两种结果:True False
本例中,yourAge > myAge 的运算结果为 True

冒号
判断语句的固定格式,用来表示这行判断条件的结束。

四个空格
用四个空格标记当 if 判断条件为True(真)时,需要执行的语句。
在这里,先记住这个格式,稍后会讲解这里空四格的原因。

执行部分
if 判断条件为True(真)时,程序就会执行if 判断内的代码。
在这里我们使用 print() 语句输出"你的年龄比我大"。

执行顺序
if 判断的执行顺序,梳理成流程图后,再来整理一下运行流程。
第一种情况,程序运行到 if 判断时,如果条件为真,则进入执行部分;完成后,程序接着运行 if 判断下面的代码。

第二种情况,程序运行到 if 判断时,如果条件为假,程序就直接跳开 if 判断的执行部分,运行后面的代码。

代码小结
通过以下格式在代码中使用 if 判断语句

关键字

关键字是程序语言中有特殊意义的单词,它们都不能被用来作为变量名,函数名,类名等。

此外,由于变量名区分大小写,所以 if 不能作为变量名,但 IF 、If、iF可以。

缩进

Python 中不同层级的代码之间强制要求缩进,并且相同层级的代码要求缩进的空格数量一致。

在这里第 1 到 3 行代码属于同一层级,第 4 和第 5 行代码属于同一层级。

在Python中,缩进的数量不做强制的要求,可以 1 个空格,可以 2 个空格
建议每个缩进用 4 个空格,这是一种比较美观易读的代码风格。

代码块

同一层级的代码集合叫做代码块,代码块中的代码会按由上至下的顺序执行。
在 Python 中,通过缩进来划分代码块。
if 判断后面跟随条件,如果条件成立,程序执行归属于 if 判断的一个代码块。
这时候就需要使用缩进组织代码块,区分代码的层级。

在连续的多个 if 判断中,每一个 if 判断内都有一个代码块。
只有当 if 条件成立时,程序才会执行这个 if 判断里面的代码块。
如果条件不成立,程序就会跳开这个 if 判断,继续运行接下来的代码。

多个if判断
例如:Tony的年龄是12岁,Kevin的年龄是11岁。判断谁的年龄更大,然后输出他的名字。

我们需要考虑两种情况:

  1. 如果 Tony 比 Kevin 大,输出 Tony 的名字;
  2. 如果 Tony 比 Kevin 小,输出 Kevin 的名字。

在这里,连续使用两个 if 判断就可以得到结果,编写出来的代码如图所示。

有了判断语句,我们就可以打破代码的默认执行顺序了(按由上至下的顺序执行)。
如图,两段代码里都有一行代码是不会执行的。
判断语句“里面”的代码块只有当判断布尔表达式为真的时候才会执行。

if 判断时,最容易出现以下两种 bug:

  1. 缩进问题
    同一代码块缩进需要保持一致,建议每个缩进用 4 个空格。


  2. 语法错误
    if 判断中,布尔表达式后面的冒号常常被遗漏,这是判断语句的固定格式。


学习了 if 判断,如果布尔表达式成立,就执行后面的代码块。
假设,if 判断后面的布尔表达式不成立,我们想要执行另外的代码块,这该怎么办呢?

在图例中,我们使用了两个 if,来保证对比情况都会有对应的输出。
为了更便捷地写出代码,我们可以使用 if-else 来优化这段程序。

if 后面的语句是当判断条件成立时,需要执行的操作。
else 后面的语句是判断条件不成立时,执行的操作。

双选选择的判断-if-else


yourScore = 80
myScore = 90

if yourScore > myScore:
    print("你的得分比我高")
else:
    print("你的得分不比我高")

代码的作用
本例中比较了变量 yourScore 和变量 myScore。
如果 yourScore 大于 myScore,就输出"你的得分比我高"。
第7行代码进行 else 判断,否则就输出"你的得分不比我高"。

if 判断
if 后面的布尔表达式,在这里不成立。
if 里面的代码块,也就是第5行代码,不会被执行。

else
一个关键字 else,如果之前的 if 判断条件不成立,就执行 else 的代码块。

冒号
在 else 之后使用冒号,表示后续缩进的代码块在判断条件不成立的时候会被执行。

缩进
缩进生成 else 内的代码块,这里我们还是空四格。

执行顺序
把 if-else 语句的执行顺序,梳理成流程图后,再来整理一下程序运行流程。

第一种情况,程序运行到 if 判断时,如果条件为真,执行 if 的代码块。
完成后,运行 if-else 后面的代码。

第二种情况,程序运行到 if 判断时,如果条件为假,程序就直接跳开 if 判断的执行部分,运行 else 的代码块。
完成后,运行 if-else 后面的代码。

代码小结
使用if-else的格式

if-else 语句有两个特性。
第一,else 需与 if 搭配使用,它无法独立出现。
必须先有 if,然后才能使用 else,否则程序就会报错。

第二,if 与 else 成互斥关系。
互斥关系也就是说,程序不会既执行 if 内的代码块,又执行 else 内的代码块。
else 是把 if 判断条件无法囊括的情况全部揽到了自己这里。

学习了两种判断语句 if 和 if-else。

if 语句属于单向判断。
只要条件成立,就会运行 if 内的代码块;条件不成立,程序就会跳开 if 判断。

if-else语句属于双向判断。
如果 if 的条件不成立,就执行 else 内的代码块。
if 和 else 是两个互斥关系,程序只会执行其中的一个。

当我们在同时使用 if 和 if-else 语句时,要注意 if 和 else 的关系。
例如,图例中的代码,包含了 2 个 if 判断和 1 个 if-else语句,这三个判断互不影响。
在这里,else 是与第 3 个 if 搭配成 if-else 语句,与前两个 if 无关

在判断语句中,除了使用布尔表达式可以作为条件,还有其他的数据类型也可以作为判断条件。
图中代码能够正常运行是因为 myAge 被赋值了一个整型 20,所以它被判定为 True,于是程序继续执行了下一步代码。

在这里,变量myAge就是“非零非空”数据

“非零”这个概念比较好理解,数字 0 被判断为False,其他数字(包含正数和负数)都被判断为True。
“非空”是什么意思呢?要理解“非空”先要理解“空值”这个概念。

空值

空值,又叫 NULL 值,在 Python 中写作 NoneNone 是关键字。
它代表这个数值不是整型,不是字符串,不是浮点型,表示没有值。
注意,它和 0 不一样,因为 0 的值是 0,而空值的值是None。

了解了“空值”后,“非空”就更好理解了。
当一个变量里有值,并且这个值不是空值,我们就说这个变量非空。
非空值可以是整型、字符串、浮点型和布尔数。

非值

当一个变量里有值,并且这个值不是空值(None),我们就说这个变量“非空”。
同时我们也把所有不是空值的值称为“非空值”。

布尔表达式和非零非空数据,都可以作为判断语句的条件。
在判断语句中,对非零值判断为真;对数字0的判断为假;对 None 的判断为假。

接触 if-else 判断时,最容易出现以下两种 bug:

  1. 语法错误
    else 后面的冒号常常被遗漏,这是if-else的固定格式,有冒号程序才知道下面是 else 的代码块。

  2. 缩进问题
    if 和 else 为互斥关系,else 的代码块需要通过缩进形成。为了保持风格统一,每个缩进用 4 个空格。


复杂的多项选择 - elif

但是生活中,N 选一的情况更为多见。
在Python中,也可以通过添加更多的选择,实现从“二选一”到“多选一”的进阶

如图所示,为了实现完整的判断,我们使用了三个 if,来保证所有的得分对比情况(大于、等于、小于)都会有对应的输出。

但是对于这种3个或以上的条件,无法使用一个if-else 结构来优化代码。
这时可以使用Python判断语句中的第三个关键字 elif(else if的缩写)。

if 后的语句是当 if 判断条件成立时,执行的操作。
elif 后的语句是当 if 判断不成立时,再判断一次,如果成立,执行的操作。
else 后的语句是当以上所有判断条件都不成立时,执行的操作。

elif


day = 3

if day == 1:
    print("元气满满地工作")
elif (day >= 2) and (day <= 5):
    print("继续搬砖吧")
else: 
    print("世界这么大,出去走走吧")

代码的作用
本例第3、4行代码判断了如果变量 day 等于1,就输出"元气满满地工作"。
第5、6行代码判断了如果变量 day 大于等于2并且小于等于5,就输出"继续搬砖吧"。
第7、8行代码判断了如果之前的条件都不满足,就输出"世界这么大,出去走走吧"。

if 判断
if 后面的布尔表达式,在这里不成立。
if 里面的代码块,也就是第4行代码,不会被执行。

elif
一个关键字,是 else 和 if 的缩写。
如果之前的 if 判断条件不成立,就再做一次新的判断,执行 elif 后面的代码。

布尔表达式
两次比较运算,如果变量 day 大于等于2,如果变量 day 小于等于5。
本例中结果都为 True 。

一次逻辑运算 and(“与”运算)。
本例中参与运算的分别是 True 和 True ,运算结果为 True 。

括号,用来框定代码运算的顺序,表明先进行比较运算,再进行逻辑“与”运算。

冒号
就像 if 和 else 一样,elif 语句的最后也需要一个冒号。
在 elif 之后使用冒号,表示后续缩进的代码块在判断条件成立的时候会被执行。

缩进
缩进生成 elif 内的代码块,这里还是空四格。

else
一个关键字 else,如果前面的 if 和 elif 的判断条件都不成立,就执行 else 后面缩进的代码块。

执行顺序
把 if-elif-else 判断的执行顺序,梳理成流程图后,再来整理一下程序运行流程。

第一种情况,程序运行到 if 判断时,如果条件为真,执行 if 的代码块。
完成后,运行 if-elif-else 后面的代码。

第二种情况,程序运行到 if 判断时,如果条件为假,程序就直接跳开 if 判断的执行部分,再次运行到 elif 的判断,如果条件为真,执行 elif 的代码块。
完成后,运行 if-elif-else 后面的代码。

第三种情况,程序运行到 elif 判断时,如果条件为假,程序就直接跳开 elif 判断的执行部分,运行 else 的代码块。
完成后,运行 if-elif-else 后面的代码。

代码小结
通过 elif 进行条件判断时,我们可以使用这样的格式

if-elif-else 语句有3个特性。

  1. 如果不满足 if 的条件,就判断是否满足 elif 的条件,满足就执行 elif 内的代码块,不满足就执行 else 内的代码块。

  2. elif 需与 if 搭配使用,它无法独立出现。必须先有 if ,然后才能使用 elif ,否则程序就会报错。


  3. if 、elif 与 else 成互斥关系。
    互斥关系指的是,程序不会同时执行 if 内、 elif 内和 else 内的代码块,只会执行其中一个。
    else 是把 if 和 elif 判断条件无法囊括的情况全部划分到自己这里。


现在,已经学习了三种判断语句:
if if-elseif-elif-else

通过 if 、else 、elif 的搭配使用,我们可以覆盖条件判断中的所有情况,让程序按照我们预定的逻辑来执行很多自动化的工作。

if 语句属于单向判断。
只要条件成立,就会运行 if 内的代码块;条件不成立,程序就会跳开 if 判断。

if-else 语句属于双向判断。
如果 if 的条件不成立,就执行 else 内的代码块。
if 和 else 是两个互斥关系,程序只会执行其中的一个。

if-elif-else 语句属于多向判断(3个或以上的条件)。
如果 if 的条件不成立,就执行 elif 再判断一次,如果 elif 的条件也不成立,就执行 else 内的代码块。
if 、elif 、 else 是互斥关系,程序只会执行其中的一个。
并且,当判断的条件超过3个时,中间的多个条件都可以使用 elif,无论中间有多少个 elif ,它和其他 if 、elif 都是互斥关系。

嵌套语句

嵌套语句在很多地方都有应用,这里主要了解 if 的嵌套。

if 嵌套:
在基础条件满足的情况下,再在基础条件里面增加额外的判断条件,即条件里套条件。

if嵌套


time = 13
num = 2

if (time >= 9) and (time <= 23):
    print("在打折时间内")

    if num >= 2:
        print("全场八折")

代码的作用
本例第1、2行代码分别将时间13和数量2赋值给了变量 time 和 num 。
第4、5行代码判断了如果变量 time 大于等于9并且小于等于23,就输出"在打折时间内"。
第7、8行代码在变量 time 大于等于9并且小于等于23成立的条件下,判断了如果变量 num 大于等于2,就输出"全场八折"。

外层条件
第一层判断条件 if 。
首先判断了如果变量 time 大于等于9并且小于等于23,就输出"在打折时间内"。

内层条件
第二层判断条件 if 。
在第一层判断变量 time 大于等于9并且小于等于23成立的条件下,判断了如果变量 num 大于等于2,就输出"全场八折"。

缩进四格
Python是以缩进的空格数来区分代码块的。
如果外层条件和内层条件的代码块都采用同样的缩进,Python 就没办法区分内外层条件是如何嵌套的。
在这里,外层条件 if 语句内的代码块缩进四个空格

缩进八格
在将内层条件 if 语句写进外层条件的执行分支时,内层条件 if语句内的代码块要在原有缩进的基础上,再增加相应的缩进。
在这里,内层条件 if 语句内的代码块在外层条件内的代码块缩进的基础上再加四个空格,也就是八个空格。

注意⚠️ :缩进在Python语法规则中扮演重要的角色

执行顺序
把 if 嵌套的执行顺序,梳理成流程图后,再来整理一下程序运行流程。
如图所示,嵌套的原则是先确定外层条件再确定内层条件,只有当外层条件成立时,才有可能进入到内层条件当中继续执行。

需要注意的是,在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范。
每嵌套一层都需要在原有缩进的基础上,再增加相应的缩进。

代码小结
当要使用 if 嵌套时,就可以用这样的格式

不仅是 if 嵌套 ,在Python中,if 、if-else 和 if -elif-else 之间也可以相互嵌套。
嵌套原则与 if 嵌套类似。

如图所示,这是一段能实现分组和判断成绩的代码。
1个外层条件 if-else 语句判断变量 gender 的值,确定男女分组,2个内层条件 if-else 语句判断变量 score 的值,确定成绩情况。

值得注意的是,虽然使用嵌套可以大大提高代码的逻辑性和层次感。
但是,任何东西都不能过度使用。
一般来说,超过3层以上的嵌套会使代码变得难以阅读,不符合Python简洁表达的理念。

本系列文章的定义只是作为课程学习后的摘抄记录的笔记,非教程。

编程中的文本

print()

print()是Python里的输出函数,可用于输出内容。


print(101010)
print(1024)

格式
在这里,还需要注意 Python 的代码规范:

1. 空行
是指在代码之间用空行分隔,表示一段新的代码的开始。在编写时不插入空行,Python运行也不会出错。

2. 顶格
同一级别的代码需要顶格开始写,不能有空格,不然程序会报错。

字符串

使用 print() 语句输出一串英文。


print("hello world!")

使用 print() 语句输出英文的时候,需要加上引号。
这是因为 "hello world!" 这种用双引号括起来的结构,在 Python 中是一种数据类型,它的正式名称叫做字符串。
表示文本的数据类型。所有用引号括起来的数据,数据可以是英文、中文、数字、表情包等等,都是字符串。
注:在 Python 中,使用单引号或是双引号都可以创建字符串。为了统一格式的情况下,使用一种即可。


print("(≧∇≦)ノ")

print("2021")

print("夜曲")

print("hello world!")

print('hello world!')

代码小结

当要输出字符串就需要这几个部分

注释


Python中使用#(井号)用于注释。
#位于注释行的开头,在 # 后空一格,与文本分开,这样内容不会堆积,看起来整洁和美观,然后接着是注释内容。
也可以在一条语句的末端进行注释。

变量与赋值

变量

变量是编程语言中能存储数据的抽象概念,它可以存储各种数据。

变量名只能由字母、数字、下划线组成。

需要注意的是:
1. 不能以数字开头;
2. 不能包含空格;
3. 大小写敏感,变量A和变量a是不同的。

常量

常量是指在程序运行时不能被修改的数据。

比如整数 175,小数 52.5,字符串 "Tony" 都是常量,它们是不能被修改的。

赋值

如同把饮料倒入水杯一样,在 Python 中, 把一个常量放入变量的过程就叫做赋值。

赋值需要用到等号“=”,所以等号“=”又叫做“赋值运算符”。


name = "Tony"

program = "夜曲编程"

常量
图中的字符串 "Tony" , "夜曲编程" 都是常量,可以将它们分别赋值给不同的变量。

赋值
赋值符号“=”代表把一个数据装入变量的过程。
比如,我们把 "Tony" 装入 name ,这个过程就叫赋值。

变量
图中的 name 、 program 都是变量,一个类似容器的东西,可以用来存储不同的数据。

代码小结

要给一个变量赋值就需要这三个部分


name = "Downey"
name = "Tony"
print(name)

如果给一个变量多次赋值新的常量,在两次赋值之后,输出了最后一次赋值的值 Tony。
变量作为一个存储数据的“地方”,其中的东西是可以改变的,但是它每次只能存放一个东西,当我们放入别的东西时,之前的东西就会被丢弃,只留下最后一次放入的东西。

此外,在 Python 中,除了用常量给变量进行赋值,还可以用一个变量给另一个变量赋值。


ABC = 1024
abc = ABC
print(abc)

学习在使用变量时,常见的代码报。

如图所示,这个报错提示说明:

1. 出错的行数是第1行;

2. 出错的具体代码是 1name = "Downey",
1name 的下方有一个小箭头表示 bug 在这里;

3. 错误类型是 SyntaxError,表示语法错误,
invalid syntax 是无效语法,说明变量定义出错了,仔细检查不难发现,变量命名错误,不能以数字开头。


这个报错提示说明:

1. 出错的行数是第2行;

2. 出错的具体代码是 print(name111);

3. 错误类型是 NameError,表示名称错误,
“name 'name111' is not defined”是名称“name111”未定义,仔细检查不难发现,我们定义的变量是 name 而不是 name111。

格式化输出

格式化输出让我们可以对字符串里的内容进行灵活替换。


name = "Tony"
print(f"My name is {name}")

name = "Mike"
print(f"My name is {name}")

# output
# My name is Tony
# My name is Mike

f
字符串之前的小写字母 f 表示这个字符串需要进行格式化输出。
注意⚠️ ,不可以使用大写字母 F

双引号
通过使用双引号" ",我们分别定义了两个字符串"My name is {name}"。

大括号
大括号 { } 标记了字符串中需要被替换的内容。

需要替换的内容
大括号括起来的,是需要替换的内容。
在这个例子里,就是变量 name 被赋予的值。

代码小结

要对一个字符串进行格式化输出时,就可以使用这样的格式

转义字符

转义字符是一种特殊的字符,它们以反斜线 \ 开头,例如换行符 \n

当字母 n 与反斜线 \ 结合后,它们的含义和功能相比之前发生了转变,因此这样的字符被称为转义字符。

如图所示,除了 \n 之外,转义字符还有很多。

字符串 加 换行符 \n 的格式


print("第一行内容,\n第二行内容,\n第三行内容,\n第四行内容。")

# output
# 第一行内容,
# 第二行内容,
# 第三行内容,
# 第四行内容。

编程中的"数字"

Python中,字符串用来表示文本,用什么表示数字呢?

整型就是整数的数据类型,用来表示整数的。

整数在Python的世界中,和数学中的定义一样: 是正整数、负整数和零的统称,是没有小数点的数字。

整型

在Python中,整型是用来表示整数的数据类型, 是编程语言里用来呈现和存储整数的一种方式。

和字符串不同的是,整型直接通过数字来表示,无需添加引号。

如果用来表示负数,可以在数字前添加一个负号(-)。

同样的,使用print()也可以输出一个整型数据。


print(2022)
print(365)
print(-100)

浮点型

在Python中,浮点型是用来表示浮点数的数据类型,是编程语言里用来呈现和存储小数的一种方式。

它通过数字和小数点来表示,无需添加引号。

如果表示负数,可以在数字前添加一个负号(-)。


print(10.24)
print(7.01)
print(-3.9)

四则运算

整型和浮点型,都是表示数字的数据类型。

在Python中,表示数字的数据类型,可以进行加、减、乘、除的四则运算。

下面的代码用来计算两个数字之和,并且输出计算的结果。


a = 1 + 2
print(a)

完成一次四则运算就需要图中几个部分

乘法和除法在Python中的运算方式与数学中的运算方式一样,但使用的运算符号有所差异。

在Python中,乘号是*,除号是/。

乘法和除法在Python中的使用方式。


a = 2
b = 4
print(a * b) 
print(a / b)

浮点型的运算方式和整型的运算方式基本一样,但运算结果的数据类型,有3种情况:

1. 整型之间加、减、乘法的计算结果是整型。


a = 2
b = 4
print(a * b) #8

2.整型之间除法的计算结果,都是浮点型。
就算刚好整除,也会得到一个浮点型数据。


a = 4
b = 2
print(a * b) #2.0

3. 浮点型的计算结果是浮点型,只要参与运算的双方有一个是浮点型,那么结果也是浮点型。


a = 4.0
b = 2
print(a * b) #8.0
print(a + b) #6.0

简单总结下,当整型和整型进行加、减、乘法运算时,运算结果是整型。
当整型和整型相除,或者有浮点型参与运算时,运算结果都是浮点型。

加法(+),减法(-),乘法(*),除法(/),在编程世界里有一个统一的称谓——运算符。
除了这四种常见的四则运算符之外,介绍另外两种运算符 —— 取整(//)和取模(%)。

取整和取模

当两个数无法整除的时候,我们会得到一个余数,例如:
7÷3=2......1,2被称作商,1被称作余数。


print(7//3) 
print(7%3) 

取整运算用于求取两个数相除之后的商。取整运算的符号是//。
取模运算用于求取两个数相除之后的余数。取模运算的符号是百分号 %。

代码小结
当我们取整取模时,就需要使用这样的格式

加上之前学习的赋值运算符(=),一共学习了7个运算符。

它们是:
赋值 =
加法 +
减法 -
乘法 *
除法 /
取整 //
取模 %

四则运算,遵循“先乘除,后加减”的运算顺序。
倘若运算中,包含了取整取模,就要遵循“先乘除取整取模,后加减”的运算顺序。
也就是,取整取模和乘除是同一等级,都会优先参与运算。

在Python中,整型数据可以和浮点型数据进行运算。
而一般情况,字符串是不可以和整型以及浮点数数据进行运算的。如图所示,若进行运算,计算机会报错“TypeError”。
仅有两种情况下,字符串可以进行运算:

1. 整型和字符串相乘
整型*字符串,输出的结果,是将字符串重复几次拼接在一起。
如图,5*"123",输出是将"123"重复5次拼接在一起;"Kevin"*5,输出是将"Kevin"重复5次拼接在一起。

2.字符串和字符串相加
字符串+字符串,输出的结果,是这几个字符串的拼接。
如图,"123"+"123",输出是将"123"和"123"拼接在一起;"Kevin"+"123",输出是将"Kevin"+"123"拼接在一起。

编程中的"真"与"假"

在编程中,这种“真”、“假”状态我们用布尔数来表示,“真”是True,“假”是False。

布尔数

布尔数是一种数据类型,它只有“真”(True)和“假”(False)两种值。
True 和 False 不加引号。

在Python中,可以通过直接赋值的方式,得到布尔数。
True 和 False 属于常量,赋值给变量。


Read = True
Adult = False
print(Read)
print(Adult)

另一种方式,是通过比较运算得到。
如下,3赋值给a,1赋值给b,进行大小的比较。
a > b,是“真”的,输出True;
a < b,是“假”的,输出False。

类似这样进行比较的行为,就是比较运算。


a = 3
b = 1
print(a > b)
print(a < b)

代码小结
进行比较运算的时候,就需要这样的格式

类似">","<"这样,对二者进行比较的,我们称为比较运算符。

除了">","<"这两个比较运算符以外,还有:

== 等于符号,注意是两个等号,要和=赋值区分开 ;
>= 大于等于符号;
<= 小于等于符号;
!= 不等于符号;

比较运算,可以根据单个条件,输出True或False的结果。

当对一个事物的判断涉及到多个条件的时候,就需要使用逻辑运算把多个条件连接起来。

比如,我国男飞行员的身高要求是169 - 185厘米,换成逻辑表达就是“飞行员的身高必须要>=169厘米,并且,<=185厘米。

这里的“并且”就是一个逻辑运算。

逻辑运算

逻辑运算,是针对多个“真”、“假”命题进行判断的运算。

“并且”、“或者”和“非”是常见的三种逻辑运算。

“并且”、“或者”和“非”这三种逻辑运算。在Python中,会用逻辑运算符来表达,包括:
and(并且)
or(或者)
not(非)。

掌握了逻辑运算符的概念之后,分别学习这三个运算符的运算规则。
and运算符表示“并且”。
意思是仅当and左右两边的布尔数均为True时,运算结果才为True。
其它情况下,运算结果都为False。

or运算符表示“或者”。
意思是只要当or左右两边的布尔数有一个为True时,运算结果就为True。
也就是说,只有当or左右两边的布尔数均为False时,运算结果才为False。

not运算符表示“非”
与and和or不同,not运算符只会运算一个布尔数,表示对这个布尔数进行取反。
也就是说,not True 运行结果是False,not False运行结果是True。

学习了逻辑运算的规则,学习一下具体的代码写法。


a = True
b = False
print(a and b)
print(a or b)
print(not a)

实例中,第1行代码给变量a赋值了布尔数True(真);
第2行代码给变量b赋值了布尔数False(假);
第3行代码输出了a和b进行and逻辑运算的结果。
第4行代码输出了a和b进行or逻辑运算的结果
第5行代码输出了a进行not逻辑运算的结果。

布尔数常量
True, 一个常量,“真”值。
False,一个常量,“假”值。

逻辑运算符
and,一种逻辑运算符号,表示“并且”。
or,一种逻辑运算符号,表示“或者”。
not,一种逻辑运算符号,表示“非”。

空格
and 和 or 运算符的两旁必须加空格,not 运算符后也必须加空格

代码小结
当完成一次逻辑运算,就需要这几个步骤

当涉及多个条件时,在Python中常会将比较运算和逻辑运算混合使用。
在此时,Python会优先执行比较运算,再按从左到右的顺序执行逻辑运算。

如果想控制代码执行的顺序,需要对希望优先执行的运算使用括号。
如图,使用括号后,运算顺序将完全不同,运算结果也会不相同。

其次,即使括号的使用不影响代码执行的顺序,但也能让代码更加清晰易读,是一种提倡的代码风格。
如图,对比较运算使用括号,不影响代码执行顺序,因为Python本身优先执行比较运算。
但在此,让代码更加清晰,更易理解。

刚学习过进行比较运算,和逻辑运算的一串运算式子。
在Python有一个统一的名字——布尔表达式。

布尔表达式

无论是进行简单的比较运算,还是进行了逻辑运算,或者是混合使用。
在Python中,只要运算结果是True或False。这样的运算式,都被统一称为布尔表达式。

以上就是布尔数,6个比较运算符和3个逻辑运算符。
需要对数字的大小进行比较时,使用比较运算符。对布尔数进行逻辑运算时,使用逻辑运算符。