欢迎来到Kaggle Learn的Python课程。本课程将介绍在开始使用Python进行数据科学之前需要的基本Python技能。这些课程针对那些具有一些编程经验的人,希望将Python添加到他们的项目中或提高他们的Python技能。 (如果你是第一次编程,你可能会发现这门课程节奏太快。

第一课将简要介绍Python语法,变量赋值和算术运算符。 如果之前有Python经验,您可能希望直接跳到练习。

Hello,Python!

Python是以英国喜剧团体Monty Python的名字命名的,那么为什么不让我们的第一个Python程序向他们著名Spam的短剧致敬呢?

只是为了好玩,尝试阅读下面的代码并预测运行时会发生什么。 (如果你不知道,那没关系!)

[1]

spam_amount = 0
print(spam_amount)

# Ordering Spam, egg, Spam, Spam, bacon and Spam (4 more servings of Spam)
spam_amount = spam_amount + 4

if spam_amount > 0:
    print("But I don't want ANY spam!")

viking_song = "Spam " * spam_amount
print(viking_song)
0
But I don't want ANY spam!
Spam Spam Spam Spam

这里有很多要介绍的东西! 这个愚蠢的程序演示了Python代码的几个重要方面:它的语法、以及它的工作原理(它的语义)。 让我们从上到下运行代码。

[2]

spam_amount = 0

变量赋值!我们创建一个变量名为spam_amount,使用Python的赋值运算符“=”赋值为0。

注:如果您已经使用其他语言编程(如Java或C ++),您可能会注意到Python不需要我们做的一些事情:

  •          我们不需要在赋值之前声明spam_amount
  •          我们不需要告诉Python spam_amount属于什么类型。 实际上,我们甚至可以继续重新赋值spam_amount来引用不同类型的东西,比如字符串型或布尔型。

[3]

print(spam_amount)
0

一个函数调用。 print是一个非常有用的内置Python函数,它显示传递到屏幕上的值。 我们通过在函数名后面加上()来调用,并在其间输入参数。

[4]

# Ordering Spam, egg, Spam, Spam, bacon and Spam (4 more servings of Spam)
spam_amount = spam_amount + 4

上面一行是一条注释语句,在Python中,注释是由#开头。

接下来我们看一个重新赋值的例子。 重新赋值现有变量的值与创建变量的方式相同 - 它仍然使用“=”赋值运算符。

在这种情况下,我们赋给spam_amount的值包含对其先前值的一些简单算术。 当遇到这一行时,Python会计算右侧表达式(0 + 4 = 4),然后将该值赋给左侧的变量。

[5]

if spam_amount > 0:
    print("But I don't want ANY spam!")
But I don't want ANY spam!

我们会在后面再介绍条件语句,但是,即使你以前从未有过编程,你也可以猜到它的作用。 Python因其可读性和语法的简单性而备受推崇(有些人甚至将其称为“可执行伪代码”)。

请注意我们如何表示哪些代码属于if语句。 “But I don't want ANY spam!”仅当spam_amount为正数时才打印。但是后面的代码(比如print(viking_song))无论如何都会执行。我们(和Python)如何知道这一点?

if行末尾的冒号(:)表示新的“代码块”即将出现。缩进的后续行(以额外的4个空格开头)是该代码块部分。您可能熟悉使用花括号{}来标记代码块的开头和结尾。 Python对有意义的空白的使用通常对习惯于其他语言的程序员来说是令人惊讶的,但实际上它比不强制执行代码块缩进的语言更有一致性和可读性。

处理viking_song的后续行没有缩进额外的4个空格,因此它们不是if语句代码块的一部分。稍后当我们开始定义函数和使用循环时,我们将看到更多缩进代码块的示例。

这段代码片段也是我们第一次看到Python中的字符串:

"But I don't want ANY spam!"

字符串可以用双引号或单引号标记。 (但是因为这个特定的字符串包含单引号字符,所以当我们试图用单引号括起来,会容易变得混淆,除非我们很小心。)

[6]

viking_song = "Spam " * spam_amount
print(viking_song)
Spam Spam Spam Spam

星号*运算符可用于两个数字相乘(3 * 3的结果为9),但有趣的是,我们还可以将一个字符串乘以一个数字,以获得多次重复的版本。 Python提供了许多像这样节省时间的技巧,其中*和+运算符具有不同的含义,具体取决于它们应用于何种类型的东西。

Python中的数字和算术

上面我们已经看过一个包含数字变量的例子:

[7]

spam_amount = 0

“Number”是一个很好的非正式名称,但如果我们想要更具技术性,我们可以问Python怎样去描述spam_amount的类型:

[8]

type(spam_amount)
int

它是短整型int,在Python中我们还经常遇到另一种数字:

[9]

type(19.95)
float

float是一个带小数位的数字,对于表示权重或比例非常有用。

type()是我们见过的第二个内置函数(在print()之后),它是另一个值得记住的函数。 能够问Python“这是什么样的东西?”非常有用。

 我们已经看到+运算符用于加法,而*运算符用于乘法。 Python还为我们提供了计算器上其余基本按钮的功能:

Operator

Name

Description

a + b

Addition

Sum of a and b

a - b

Subtraction

Difference of a and b

a * b

Multiplication

Product of a and b

a / b

True division

Quotient of a and b

a // b

Floor division

Quotient of a and b, removing fractional parts

a % b

Modulus

Integer remainder after division of a by b

a ** b

Exponentiation

a raised to the power of b

-a

Negation

The negative of a

这里有一个有趣的观察是,虽然你的计算器可能只有一个按钮用于除法,但Python可以做两种。 “True division /”基本上是你的计算器所做的:

[10]

print(5 / 2)
print(6 / 2)
2.5
3.0

得出的结果是浮点型。

//运算符给我们一个向下舍入到下一个整数的结果。

[11]

print(5 // 2)
print(6 // 2)
2
3

你能想到这会有用吗? 您可能很快就会在编程问题中看到一个例子。

Order of operations

我们在小学学到了算数运算的顺序。 有些人通过诸如PEMDAS之类的助记符来记住这些: PEMDAS - Parentheses, Exponents, Multiplication/Division, Addition/Subtraction.

Python遵循类似规则。 他们大多非常直观。

[12]

8 - 3 + 2

7
-3 + 4 * 2

5

但有时默认的运算顺序不是我们希望的:

[13]

hat_height_cm = 25
my_height_cm = 190
# How tall am I, in meters, when wearing my hat?
total_height_meters = hat_height_cm + my_height_cm / 100
print("Height in meters =", total_height_meters, "?")
Height in meters = 26.9 ?

括号是你的王牌。 您可以添加它们以强制Python以不同的顺序评估子表达式(或者只是为了使代码更易于阅读)。

[14]

total_height_meters = (hat_height_cm + my_height_cm) / 100
print("Height in meters =", total_height_meters)
Height in meters = 2.15

Builtin functions for working with numbers

min 和max返回各自参数的最小和最大值...

[15]

print(min(1, 2, 3))
print(max(1, 2, 3))

1
3

abs返回绝对值:

[16]

print(abs(32))
print(abs(-32))

32
32

除了作为Python的两个主要数字类型的名称之外,int和float也可以作为将其参数转换为相应类型的函数:

[17]

print(float(10))
print(int(3.33))
# They can even be called on strings!
print(int('807') + 1)

10.0
3
808

Your turn!