Python3 - 开始python编程(四)

Python3 - 开始python编程(四)

if 语句,for 循环和 while 循环如何帮助您做出更好的决策并使重复的任务变得简单。在上一篇文章中,我们了解了运算符和None。今天,我们将利用这些知识来使我们的程序更智能。

条件分支

我们每天都在做决定。早晨起床时,我们可能会喝杯咖啡,但对我来说,喝杯咖啡需要决定是否煮一杯。首先,我需要检查我是否有咖啡,其次,我需要检查我是否有糖,其次我要检查我是否有牛奶,最后我要检查我是否有干净的咖啡杯。

如果对上述任何一个问题的回答是否定的,那么我要么什么都不做,要么我做一杯咖啡所需的事情。

在编程中也是如此,我们可以使用if语句做出这些决定。

if 语句如下所示:

1
2
3
4
has_coffee = True
made_cup = False
if has_coffee:
    made_cup = True

我们在顶部有两个布尔变量:”has_coffee”和”made_cup”。我们使用语法”if has_coffee”来检查 has_coffee 的值。如果咖啡的评估结果为 true,那么我们将执行下面的代码缩进 4 个空格。如果”has_coffee”为假,我们将跳过下面缩进的所有内容,并且”made_cup”的值仍为假。

因为 Python 允许我们使用强类型变量,所以我本可以使用”has_coffee:bool = True”来代替,以表示”has_coffee”应为布尔值。这并不意味着我们以后不能再使用 int,float,list 或 dict 覆盖它,而只是帮助我们跟踪应使用的值。

我还在变量名称中使用了链接动词,以帮助我记住这是一个布尔值。我在学习 Swift 时从 Apple 那里获得了一个不错的东西。

每当我做布尔值时,我总是尝试使用诸如”is_sunny”,”did_rain”或”user_is_at_least_thirteen”之类的东西。不管我使用什么,它都应说明变量的用途,以便其他人在查看您的代码时毫无疑问地知道如何使用它。有时像这样的上下文线索可以帮助您记住程序中先前设置的其他变量。

现在,我将为您提供更多的功能和做出更好决策的能力,因为如果原始的 if 评估结果为 false,则 if 语句还有另一段内容可以让您执行某些操作。

1
2
3
4
5
has_coffee = False
if has_coffee:
    made_cup = True
else:
    made_cup = False

如果初始评估结果为假,则Else子句允许您执行某些操作。在这种情况下,”has_coffee”设置为”False”,而尚未创建”made_cup”。

当我们处理if语句时,我们首先检查if has_coffee。由于我们没有咖啡,因此我们跳到”else”子句,并将”madecup”设置为”False”。一些开发人员会在其他情况之间添加elif(这是_else if的缩写)的语句。外观如下:

1
2
3
4
5
6
7
8
age = 16
if age < 13 :
    age_description = "You are young."
elif age <= 18:
    age_description = "You are a teenager."
else
    age_description = "You are an adult."
# age_description is equal to "You are a teenager."

在上面的示例中,我们首先将“年龄”设置为”16”。 “if”语句首先检查“年龄是否小于 13”。由于我们的年龄是 16 岁,因此不正确,因此我们移至下一个语句”elif age <= 18”。这次评估结果是正确的,因此我们将age_description =“您是青少年。因为我们到达了我们要寻找的分支,所以我们停止检查年龄变量和if`语句中的return。换句话说,”else”语句甚至从未被看到。

这是另一种查看方法,它仍然是有效的语法,比上面的示例更难阅读:

1
2
3
4
5
6
7
8
9
10
age = 25

if age < 13:
    age_description = "You are young."
else:
    if age <= 18:
        age_description = "You are a teenager."
    else:
        age_description = "You are an adult."
# ageDescription is equal to "You are an adult."

这称为嵌套 if 语句。在这里您可以看到我们先检查“age<13”和“age<= 18”是假的,因此我们继续进行设置的 else 语句 age_description =“You are an adult"

我将让您在看一遍,看看您是否可以确定”made_cup”的值应该是什么。这将测试您对上一篇文章中有关运算符和运算顺序的了解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
likes_coffee_with_sugar = True
likes_coffee_with_milk = False
likes_coffee_black = not likes_coffee_with_milk
has_coffee = True
has_milk = True
has_sugar = False

if (
    (likes_coffee_with_milk and has_milk)
    and (likes_coffee_with_sugar and has_sugar)
    and has_coffee
):
    made_cup = True

elif (
    (likes_coffee_with_milk and has_milk)
    or (likes_coffee_with_sugar and has_sugar)
    or likes_coffee_black
    and has_coffee
):
    made_cup = True

else:
    made_cup = False

此语法正确。尽管它不遵循严格的PEP 8 准则,但只要语法正确,它就易于使用并自动格式化代码。

如果我们遵循这一点,我们将进行检查以查看某人是否喜欢含某种成分的咖啡,如果我们有该成分,就可以确保我们有咖啡。如果没有主要成分,尝试煮一杯咖啡就不好了。

这里有一个提示:

  • 括号的优先级高于not
  • not优先于and
  • and优先于or

使用该逻辑,尝试猜测是否可以煮一杯咖啡。

“if”语句也具有所谓的三元运算符。我将其保留在最后一篇博文中,是因为我希望您能像他们最初那样理解 if 语句。

我将为您提供一个if语句的示例,然后向您展示与三元运算符相同的if语句的简写方式:

1
2
3
4
5
6
7
8
9
is_sun_shining = True

if is_sun_shining:
    description = "Yay!"
else:
    description = "Aww..."

# Same if statement using a ternary operator
description = "Yay!" if is_sun_shining else "Aww..."

在示例中,我们正在检查 is_sun_shining。如果是”is_sun_shining”,则可以将其作为“描述”设置为““是!”“来读取,否则,请将其值设置为”Aww …“。

等一下当我只需要编写一行代码时,为什么需要编写四行代码将值放入”description”中?

三元运算符很整洁,可读性强,这对您的代码有极大的帮助;但是,它们不能与elif一起使用。

因此,我将向您介绍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
likes_coffee_with_sugar = True
likes_coffee_with_milk = False
likes_coffee_black = not likes_coffee_with_milk
hasCoffee = True
hasMilk = True
hasSugar = False

made_cup = (
    True
    if (likes_coffee_with_milk and hasMilk)
    and (likes_coffee_with_sugar and hasSugar)
    and hasCoffee
    else True
    if (likes_coffee_with_milk and hasMilk)
    or (likes_coffee_with_sugar and hasSugar)
    or likes_coffee_black
    and hasCoffee
    else False
)
# That's really hard to read


age = 20

description = (
    "You are young."
    if (age < 13)
    else "You are a teenager."
    if (age <= 18)
    else "You are an adult."
)
# A little easier to read


# Finally how it really shines
has_first_name = True
has_last_name = False
# more variables to follow

first_name = first_name_from_web
    if has_first_name
    else "Unknown user"

lastName = last_name_from_web
    if has_last_name
    else None

can_log_in = age_from_web >= 13
# 20 more profile information items to check

因此,您会看到只有if /elif /else语句比三元运算符更好的情况,但您也可以想象三元运算符可以使您的程序员生活变得更轻松。

我们使用了一个称为真值表的工具。其目的是显示场景中可能发生的结果。

从上面的真值表中,我们看到 AND 运算符和 OR 运算符。 AND 用于检查所有变量中的”TRUE”。如果要添加名为”C”的第三列,我们将扩展该表以包含”A”,”B”和”C”之间的所有变体。如果一个值为”FALSE”,那么结果将为”FALSE”。即使我们有 100 列,如果这些列之一是”FALSE”,那么结果将是”FALSE”。

对于 OR 运算符,在相同的 100 列情况下,仅需要一个值是 TRUE,如果我们有 99 个 FALSE 和一个 TRUE 列,则结果将是 TRUE。

它不是民主国家也不是加权平均数。如果我们想这样做,我们可以,但是我们需要通过获取“真”值的计数,“假”值的计数并比较哪个计数更大来实现自己的逻辑。我们将在稍后进行介绍,但是就目前而言,本文以逻辑运算符以及在 if 语句中如何使用的方式对 if 语句进行了总结。

照片由Oliver HaleUnsplash上拍摄

循环

我们将在本文中讨论两种不同类型的循环。第一个是while循环,第二个是for循环。

While 循环

让我们考虑一下这种情况,“当我遛狗时,我要去……” 或“当我在午休时,我需要……”。这是 while 循环_的工作方式。当某些条件满足时,将执行此操作。

1
2
3
4
5
ount = 0

while count < 10:
    print(count)
    count += 1

while 循环很简单。您从while开始,要检查一些条件,在 while 语句的主体中,您有自己的代码。如果我忽略count + = 1会怎样?

是的,代码将无限期地继续下去。这是不好的。太糟糕了,这是让自己重返就业市场的最快方法之一。没有人喜欢“无限循环”。

您可以在自己的计算机上进行尝试-只需使用 CTRL + C 即可退出循环。诸如 Web 服务器之类的东西依赖于无限循环来处理请求。是的,我知道我刚刚告诉过您不要使用它们,但是在事件驱动的应用程序(例如 Web 服务器)中,您一次处理一个请求,并且需要重置以处理下一个请求。 (想起来就像自动扶梯。)

我说它们很糟糕的原因是,当 while 循环不是由事件驱动的时,它只会不断运行,并且……这会消耗 CPU 并可能减慢或停止计算机执行其他工作。

这是另一种情况。也许您可以告诉我什么地方出了问题,但是如果您做不到,请不要担心。我会指出之后。

1
2
3
4
5
6
count: float = -100.0
total: float = 25
increment: float = -3.75

while count < total:
    count += increment

如果看到的话,那很好,如果不是这样,那有时会很棘手,您必须将变量名替换为值。现在开始吧。

1
2
3
4
5
6
7
8
9
10
11
count: float = -100

while -100 < 25.0:
    count += -3.75


# Still don't see it? Let's simplify.
count = -100

while count < 25:
    count = count - 3

-100-3 = -103,-103 仍小于 25,只要我们每次都减去 3,它就总是小于 25。

这是另一个例子。

1
2
3
4
count = 0

while True:
    count += 1

这永远不会停止计数。

有一种摆脱循环的方法,我们可以使用if语句来完成。我们可以使用break做到这一点。

关键字break告诉程序break退出循环。因此,在上面的示例中,一旦count == 100,我们就在if语句中执行逻辑,告诉程序break跳出循环,并且我们设置为运行闭括号后的所有内容 while 循环。

要以 2s 计数吗?有一个关键字使我们可以跳过循环迭代。它是continue关键字。使用上面的示例,我们将其更改为仅以数字的倍数计数。

看看是否可以遵循此逻辑。我敢肯定,现在您已经开始了解为什么描述性变量名有助于代码的可读性。

逐行细分此内容:

而 while True 表示无限期运行。 True1 _.的常量__False是_0__的常量。

如果 current_number%number_to_count_by!= 0 如果 11/4 的余数不是 0,则将 1 加到 current_number 中,这样我们就不会陷入无限循环,而可以使用 continue 跳过此迭代。如果我们还没有完成本轮的逻辑。

在”sum_of_all_numbers”中添加”current_number”。我们知道,执行此操作时,根据先前的逻辑,它必须是一个可被”number_to_count_by”整除的数字。

current_number + = 1。我知道看起来我们已经做到了,但实际上还没有。如果我们的”current_number”不能被”number_to_count_by”平均整除,那么我们将”1”添加到”current_number”上,然后跳过所有其他内容。如果if语句评估为 false,我们将不会对 current_number 做任何事情。

最后,即使”current_number”不能被”number_to_count_by”整除,它也可以使我们摆脱无限循环, 如果current_number> = 100,我们中断

for 循环

while 循环的同级是 for 循环。 For 循环主要用于列表和字典,但也可以用于一系列字符或数字。 for 循环的外观如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Using lists
names = ["Bob", "Mary", "John", "David"]

for name in names:
    separated_names += name + " "


# Using dictionaries
pets = {
    "Spot": "Dog",
    "Sassy": "Cat",
    "Jerry": "Mouse",
    "Tom": "Cat",
    "Jimminey": "Cricket",
}

for (name, type) in pets:
    pet_names.append(name)
    if pet_type_counts[type] is None:
        pet_type_counts[type] = 1
    else:
        pet_type_counts[type] += 1


# Using ranges
count = 0

for value in range(count, 10):
    count += 1

好的,这里有一些新东西。首先,让我们谈谈 for 循环。

for 循环需要一些入门知识。首先,需要给它提供一个计划在循环主体中使用的变量,并且应该给它一个有意义的名称。在第一个示例中,我们在名称中使用for name。这将读取我们正在列表中的“名称”中遍历的当前“名称”。

接下来,我们添加名称处理逻辑。在我们的例子中,我们使用字符串连接创建了一个包含所有名称的长字符串。

当我们遍历所有名称时,for 循环退出。

词典稍有不同,但是基于相同的思想。在上面的示例中,我们前面有一些奇怪的语法,即”for(name,type)”。实际上,这引入了另一种我们没有谈论过的类型,称为元组。

元组是用括号括起来的逗号分隔变量的列表,其中可以包含列表中每个变量的值。它们作为单个变量传递。将来,我们将为您提供更多相关信息,但现在您只需要了解这些即可。

这样做的原因是字典所包含的每个项目都有两部分。 keyvalue。键是字典的第一部分,值是第二部分。键用于访问值。如果您使用的是真正的字典,则要查找的单词将是您的关键字,而找到的定义将是值。

当我们使用 for(名称,类型)时,可以将其直接翻译成字典中的 for(键,值)。因此,让我们继续前进。我们遍历字典中的每个“键值对”,对于每个键或“名称”,我们将其附加到”pet_names”之后。对于每个值或“类型”,我们检查是否有“类型”的键。在”pet_type_counts”键为“狗”,“猫”,“鼠标”或”C”的情况下。因为字典键可能存在或可能不存在,所以我们需要小心。首先,我们检查”pet_type_counts [name]是否为 None”。如果是这样,我们需要将初始值设置为”1”,因为当前的迭代保持该类型。否则,我们的确在pet_type_counts [name]中有一个值,我们只需要更新该值即可。如果您尝试从不存在键的字典中提取一个值,则会出现 KeyValue 错误,并且程序将崩溃。我保证我会在以后的文章中谈论错误以及如何处理错误。

在最后一个示例中,我向您展示如何在范围内使用 for-in 循环。首先,给它变量”value”以在循环中使用,然后给它”range”,以便它知道从哪个数字开始,最后,给它一个介于”count”和”0”之间的范围。 10。循环迭代通过所有数字并将它们加在一起。

现在,我可以要求您编写一个程序,将所有介于 57 和 398 之间的数字都可以除以 3。我可以这样做,但是需要一段时间。编程的好处是,您花费更少的时间将其编写出来,并且计算机可以在不到一秒钟的时间内为您完成计算。

摘要

我们正在学习一些非常酷的东西。在本文中,您了解了如何在程序中进行决策,还学习了如何遍历数据集和数字。想想你走了多远。

不过,我们还有很多东西要学习,因此我强烈建议您阅读 Python 文档作为后续文章,以获取更多信息。如果您发现您还不太了解的内容,请不要担心,我可能会在下一部分中介绍。

建议阅读:

如果还没有,请查看 Python 教程并阅读第 1 至 4. 4 章…

Python 教程-Python 3. 7.3 文档

…并跳至第 5 章并完整阅读。

5. 数据结构-Python 3. 7.3 文档

我知道这是乱序的,但我首先要解释最常见的事情。我们将在这些教程中涵盖所有主题。。

我们将很快回到 4. 6 讨论功能。

下一步是什么

接下来是功能和范围。这是一些偷看。

函数使您可以截取相关代码的一部分,并将其分成一个单独的部分,您可以根据需要重复使用多次。

范围可以帮助我们使事情保持井井有条,内存使用率低,但这并非要权衡大量错误的原因。

像往常一样,继续探索,并尝试制作自己的程序以完成某些工作。没有任何想法吗?此时,您可以做出决策并遍历数组。为什么不查看是否可以在不使用sort的情况下,对这 15 个数字的数组进行排序(从最小到最大或从最大到最小)。别作弊。

1
[21, 46, 32, 38, 30, 35, 82, 94, 40, 28, 16, 51, 90, 86, 46]
Rating: