02 章: Python 语言基础

Python 语言基础、IPython 和 Jupyter Notebooks 🚀

本章介绍 Python、IPython 和 Jupyter Notebooks 的基本概念,这些是数据分析的必备工具。我们将涵盖:

  • Python 语言基础:核心语法和语义。
  • IPython:增强的交互式 Python shell。
  • Jupyter Notebooks:基于 Web 的交互式计算环境。

简介(续)

Python 数据分析能力的演变就像一个“先有鸡还是先有蛋”的场景。最初,像 pandas、scikit-learn 和 statsmodels 这样的库还不太成熟。

如今,这些库已经成熟,形成了一个强大的生态系统,用于数据科学、机器学习和统计计算。这使得 Python 成为任何处理数据的人的绝佳工具。🎉

为什么选择 Python 进行数据分析?

  • 数据整理的理想选择:Python 擅长将杂乱无章的非结构化数据转换为干净的表格格式。这对于准备用于分析的数据集至关重要。

为什么选择 Python 进行数据分析?(续)

  • 丰富的库生态系统:pandas、NumPy、scikit-learn 和 Matplotlib 等库为数据操作、分析和可视化提供了强大的工具。
  • 富有表现力和可读性的语法:可读性使 Python 易于学习和使用,特别是对于初学者。

为什么选择 Python 进行数据分析?(可视化)

入门:实时编码 💻

最好的学习方法是实践!我们将通过 IPython 或 Jupyter 会话来探索这些概念。跟着示例一起学习,以最大程度地提高学习效果。

熟悉键盘驱动、类似控制台的开发也是学习过程的一部分。

2.1 Python 解释器

  • Python 是一种解释型语言。解释器逐行执行代码。

  • 使用 python 命令启动标准解释器。

$ python
Python 3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:38:57)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 5  # 定义一个变量 a,并赋值为 5
>>> print(a)  # 打印变量 a 的值
5

Python 解释器(续)

  • >>> 是您键入代码的提示符。
  • 使用 exit()Ctrl-D(Linux/macOS)退出。

运行 Python 程序

  • 创建一个 .py 文件(例如,hello_world.py)。

  • 从终端运行:python hello_world.py。确保文件位于您的当前工作目录中。

# hello_world.py
print("Hello world")  # 打印 "Hello world"
Hello world

运行 Python 程序(续)

$ python hello_world.py
Hello world

2.2 IPython 基础

  • IPython 是一个增强的 Python 解释器。它专为交互式数据分析而设计。

  • Jupyter Notebooks 是构建在 IPython 之上的基于 Web 的环境。它们提供了丰富的交互式体验。

2.2 IPython 基础(续)

  • 使用 ipython 命令启动 IPython。
$ ipython
Python 3.10.4 | packaged by conda-forge | (main, Mar 24 2022, 17:38:57)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.31.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]:
  • 请注意 In [1]: 提示符,它与标准的 >>> 不同。

IPython:运行代码

  • 通过键入代码并按 Enter 键来执行代码。
  • 当您键入对象的名称时,IPython 会显示对象的字符串表示形式。
In [1]: a = 5  # 定义变量 a 并赋值为 5

In [2]: a  # 直接输入变量名,IPython 会显示其值
Out[2]: 5

In [3]: import numpy as np  # 导入 numpy 库,并简写为 np

In [4]: data = [np.random.standard_normal() for i in range(7)]  # 生成包含 7 个标准正态分布随机数的列表

IPython:运行代码(续)

In [5]: data  # 显示 data 列表
Out[5]:
[-0.20470765948471295,
 0.47894333805754824,
 -0.5194387150567381,
 -0.55573030434749,
 1.9657805725027142,
 1.3934058329729904,
 0.09290787674371767]
  • IPython 的输出通常比标准 Python 的 print() 更具可读性。

运行 Jupyter Notebook

  • Jupyter Notebook 是一个功能强大的交互式文档,适用于代码、文本(使用 Markdown)、可视化等。

  • 使用以下命令启动:jupyter notebook

$ jupyter notebook
[I 15:20:52.739 NotebookApp] Serving notebooks from local directory:
/home/wesm/code/pydata-book
...
[I 15:20:52.740 NotebookApp] Use Control-C to stop this server and shut down
all kernels...

运行 Jupyter Notebook(续)

  • Jupyter 通常会在您的 Web 浏览器中自动打开。如果没有,请导航到提供的地址(例如,http://localhost:8888)。

Jupyter Notebook:界面

  • 登录页面:显示您启动 Jupyter 的目录中的文件。

Jupyter Notebook:界面(续)

  • 新建 Notebook:单击“New”->“Python 3”以创建一个新的 Notebook。

Jupyter Notebook:单元格

Jupyter Notebook:单元格(续)

  • 代码单元格:您编写和执行 Python 代码的地方。按 Shift-Enter 运行单元格。

  • Markdown 单元格:用于文本、解释和文档(使用 Markdown 语法)。

  • 保存 Notebook。它将创建一个扩展名为 .ipynb 的文件,这是一个包含所有内容的自包含格式。

Jupyter Notebook:示例视图

Jupyter Notebook:示例视图描述

此图显示了一个 Jupyter Notebook,其中包含数据分析和文本的代码:

  • 标题:“Introductory examples”。
  • 章节标题:“1.usa.gov data from bit.ly”。
  • 代码单元格
    • %pwd:显示当前工作目录。
    • 从文件读取和处理数据。
    • 使用 json 库。
    • 访问特定的数据元素。
  • 文本单元格:“Counting time zones in pure Python”。

IPython 和 Jupyter:Tab 补全 ⌨️

  • Tab 补全:一个巨大的节省时间的工具!在键入时按 Tab 键可以:
    • 补全变量名。
    • 显示对象的方法和属性。
    • 补全文件路径。
    • 查看函数的关键字参数。
In [1]: an_apple = 27  # 定义一个变量 an_apple

In [2]: an_example = 42  # 定义另一个变量 an_example

In [3]: an<Tab>  # 在这里按 Tab 键
an_apple  an_example  any  # IPython 会显示可能的补全

Tab 补全:方法和模块

In [3]: b = [1, 2, 3]  # 定义一个列表 b

In [4]: b.<Tab>  # 在点号后按 Tab 键
append()  count()   insert()  reverse()  # 显示列表 b 的所有可用方法
clear()   extend()  pop()     sort()
copy()    index()   remove()

Tab 补全:方法和模块(续)

In [1]: import datetime  # 导入 datetime 模块

In [2]: datetime.<Tab>  # 在点号后按 Tab 键
date       MAXYEAR    timedelta  # 显示 datetime 模块的所有可用成员
datetime   MINYEAR    timezone
datetime_CAPI time      tzinfo
  • IPython 默认隐藏以下划线开头的方法和属性。

Tab 补全:函数参数

  • Tab 补全也适用于函数关键字参数,包括 = 符号!

IPython 和 Jupyter:内省 🔍

  • 内省:使用 ? 获取有关对象的信息。
In [1]: b = [1, 2, 3]  # 定义一个列表 b

In [2]: b?  # 在变量名后加上问号,进行内省
Type:        list  # 类型:列表
String form: [1, 2, 3]  # 字符串形式
Length:      3  # 长度:3
Docstring:  # 文档字符串
Built-in mutable sequence.  # 内置的可变序列

If no argument is given, the constructor creates a new empty list.  # 如果没有给出参数,构造函数将创建一个新的空列表。
The argument must be an iterable if specified.  # 如果指定了参数,则参数必须是可迭代对象。

内省:函数示例

def add_numbers(a, b):  # 定义一个函数 add_numbers
    """
    Add two numbers together  # 函数的文档字符串

    Returns
    -------
    the_sum : type of arguments  # 返回值的描述
    """
    return a + b  # 返回 a 和 b 的和

In [6]: add_numbers?  # 对函数进行内省
Signature: add_numbers(a, b)  # 函数签名
Docstring:  # 文档字符串
Add two numbers together  # 将两个数字相加

Returns
-------
the_sum : type of arguments  # 返回值的类型
File:      <ipython-input-9-6a548a216e27>  # 文件名
Type:      function  # 类型:函数
  • ? 运算符显示文档字符串,提供有关函数的信息。
  • 内省还显示函数或实例方法和文档字符串。

内省:通配符搜索

  • *? 一起使用以搜索 IPython 命名空间。
In [9]: import numpy as np  # 导入 numpy 库

In [10]: np.*load*?  # 搜索 numpy 中所有包含 "load" 的名称
np.__loader__  # 匹配到的名称
np.load
np.loads
np.loadtxt
  • 这将显示 NumPy 命名空间中所有包含 “load” 的名称。

2.3 Python 语言基础

现在,让我们深入了解 Python 语言本身的核心语法和语义。

语言语义

  • Python 强调可读性简单性明确性。它通常被描述为“可执行的伪代码”。

缩进,而不是大括号 📏

  • Python 使用缩进(空格或制表符)来构造代码,而不是大括号 {}
for x in array:  # for 循环,遍历数组 array
    if x < pivot:  # if 条件语句,如果 x 小于 pivot
        less.append(x)  # 将 x 添加到 less 列表
    else:  # 否则
        greater.append(x)  # 将 x 添加到 greater 列表
  • 冒号 : 表示缩进块的开始。
  • 一致的缩进至关重要! 使用四个空格。

Note

强烈建议使用四个空格作为默认缩进,并将制表符替换为四个空格。许多文本编辑器都有自动将制表符替换为空格的设置。

分号

  • Python 语句通常不需要分号。
  • 分号可以分隔单行上的多个语句,但通常不鼓励这样做,以提高可读性。
a = 5; b = 6; c = 7  # 通常避免这种风格,写成多行更清晰

一切皆对象 🍎

  • 在 Python 中,一切都是对象:数字、字符串、列表、函数、类、模块等。
  • 每个对象都有一个类型(例如,intstrlistfunction)和内部数据。
  • 这使得 Python 非常灵活。

注释 💬

  • 使用井号 # 创建注释。一行中 # 之后的任何内容都将被忽略。
results = []  # 初始化一个空列表 results
for line in file_handle:  # 遍历文件句柄 file_handle 中的每一行
    # keep the empty lines for now  # 暂时保留空行
    # if len(line) == 0:  # 如果行的长度为 0
    #     continue  # 跳过当前迭代
    results.append(line.replace("foo", "bar"))  # 将行中的 "foo" 替换为 "bar",并将结果添加到 results 列表

print("Reached this line")  # 简单的状态报告,打印 "Reached this line"

函数和对象方法调用 📞

  • 使用括号 () 调用函数并传递参数(如果有)。
  • 对象通常具有方法(附加到对象的函数),您可以使用点号 . 语法调用它们。
result = f(x, y, z)  # 调用函数 f,并传入参数 x, y, z
g()  # 调用函数 g,不传入任何参数

obj.some_method(x, y, z)  # 调用对象 obj 的 some_method 方法,并传入参数 x, y, z

result = f(a, b, c, d=5, e="foo")  # 调用函数 f,传入位置参数 a, b, c 和关键字参数 d, e

变量和参数传递 🔗

  • 赋值变量会创建对 = 右侧对象的引用
a = [1, 2, 3]  # 创建一个列表 [1, 2, 3],并将其赋值给变量 a
b = a  # 将 a 赋值给 b,b 现在引用与 a *相同*的列表
a.append(4)  # 向列表 a 中追加元素 4
print(b)  # 输出: [1, 2, 3, 4],因为 a 和 b 指向同一个列表
[1, 2, 3, 4]
  • 重要提示:在 Python 中,ab 指向内存中的同一个对象,而不是副本。

变量引用(图示)

  • 此图说明 ab 只是引用内存中同一个列表对象的名称。

Note

赋值也称为绑定,因为我们将名称绑定到对象。已赋值的变量名有时称为绑定变量

动态引用,强类型 💪

  • Python 中的变量没有固有的类型。类型与变量引用的对象相关联。
a = 5  # 将整数 5 赋值给变量 a
print(type(a))  # 输出: <class 'int'>,a 的类型是 int

a = "foo"  # 将字符串 "foo" 赋值给变量 a
print(type(a))  # 输出: <class 'str'>,a 的类型现在是 str
<class 'int'>
<class 'str'>

动态引用,强类型 💪(续)

  • Python 是强类型的:对象具有特定的类型,隐式转换是有限的。
"5" + 5  # 这将导致 TypeError,因为字符串和整数不能直接相加

强类型:示例

a = 4.5  # 浮点数 4.5
b = 2  # 整数 2
print(f"a is {type(a)}, b is {type(b)}")  # 字符串格式化,打印 a 和 b 的类型
print(a / b)  # a 除以 b,结果是浮点数 2.25
a is <class 'float'>, b is <class 'int'>
2.25
  • 即使 b 是整数,它也会被隐式转换为浮点数进行除法运算。

使用 isinstance 检查类型

  • 使用 isinstance() 检查对象是否是特定类型(或几种类型之一)的实例。
a = 5  # 整数 5
print(isinstance(a, int))  # 输出: True,a 是 int 类型的实例

b = 4.5  # 浮点数 4.5
print(isinstance(a, (int, float)))  # 输出: True,a 是 int 或 float 类型的实例
print(isinstance(b, (int, float)))  # 输出: True,b 是 int 或 float 类型的实例
True
True
True

属性和方法

  • 对象具有属性(存储在对象“内部”的数据)和方法(与对象关联的函数)。
  • 使用 obj.attribute_name 访问它们。
  • 我们可以使用getattr函数通过名称获取对象的属性和方法。
a = "foo"  # 字符串 "foo"
# a.<Press Tab>  # 查看可用的属性和方法

print(getattr(a, "split")) # 通过字符串'split',获取对象a的split属性。
<built-in method split of str object at 0x7fbe32e883f0>

鸭子类型 🦆

  • “如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子。”
  • 检查特定行为(例如,可迭代性),而不是严格的类型。
def isiterable(obj):  # 定义一个函数 isiterable,用于检查对象是否可迭代
    try:
        iter(obj)  # 尝试对 obj 进行迭代
        return True  # 如果可以迭代,返回 True
    except TypeError:  # 如果发生 TypeError(不可迭代)
        return False  # 返回 False

print(isiterable("a string"))  # 输出: True,字符串是可迭代的
print(isiterable([1, 2, 3]))  # 输出: True,列表是可迭代的
print(isiterable(5))  # 输出: False,整数不可迭代
True
True
False

导入 📦

  • 模块是包含 Python 代码的 .py 文件。
  • 使用 import 从其他模块访问变量和函数。
# some_module.py  # 定义一个名为 some_module.py 的模块
PI = 3.14159  # 定义一个常量 PI

def f(x):  # 定义一个函数 f
    return x + 2  # 返回 x + 2

def g(a, b):  # 定义一个函数 g
    return a + b  # 返回 a + b

导入(续)

# In another file:  # 在另一个文件中
import some_module  # 导入 some_module 模块
result = some_module.f(5)  # 调用 some_module 模块中的 f 函数
pi = some_module.PI  # 访问 some_module 模块中的 PI 常量

# Or:  # 或者
from some_module import g, PI  # 从 some_module 模块导入 g 函数和 PI 常量
result = g(5, PI)  # 调用 g 函数

# Or with different names:  # 或者使用不同的名称
import some_module as sm  # 导入 some_module 模块,并将其重命名为 sm
from some_module import PI as pi, g as gf  # 从 some_module 模块导入 PI 和 g,并分别重命名为 pi 和 gf

二元运算符和比较 ⚙️

  • Python 使用标准数学语法进行二元运算和比较。
print(5 - 7)  # 减法
print(12 + 21.5)  # 加法
print(5 <= 2)  # 小于等于比较
-2
33.5
False

二元运算符(表)

运算 描述
a + b ab
a - b ab
a * b a 乘以 b
a / b a 除以 b
a // b a 整除 b,向下取整
a ** b ab 次方

二元运算符(表)- 续

运算 描述
a & b 如果 ab 都为 True,则为 True;对于整数,按位与
a \| b 如果 ab 为 True,则为 True;对于整数,按位或
a ^ b 对于布尔值,如果 ab 为 True,但不同时为 True,则为 True;对于整数,按位异或
a == b 如果 a 等于 b,则为 True
a != b 如果 a 不等于 b,则为 True

二元运算符(表)- 续

运算 描述
a < b, a <= b 如果 a 小于(小于或等于)b,则为 True
a > b, a >= b 如果 a 大于(大于或等于)b,则为 True
a is b 如果 ab 引用同一个 Python 对象,则为 True
a is not b 如果 ab 引用不同的 Python 对象,则为 True

isis not

  • is 检查两个变量是否引用同一个对象。
  • is not 检查两个变量是否引用不同的对象。
  • == 检查是否相等。
a = [1, 2, 3]  # 创建一个列表 [1, 2, 3]
b = a  # b 引用 a
c = list(a)  # 创建一个 a 的新副本,并将其赋值给 c

print(a is b)      # 输出: True,a 和 b 引用同一个对象
print(a is not c)  # 输出: True,a 和 c 引用不同的对象
print(a == c)      # 输出: True,a 和 c 的值相等
True
True
True

可变和不可变对象 🔄

  • 可变对象(列表、字典、NumPy 数组等)可以在原地修改。
  • 不可变对象(字符串、元组)在创建后无法更改。
a_list = ["foo", 2, [4, 5]]  # 创建一个列表
a_list[2] = (3, 4)  # 修改列表的第三个元素
print(a_list)  # 输出: ['foo', 2, (3, 4)]

a_tuple = (3, 5, (4, 5))  # 创建一个元组
a_tuple[1] = "four"  # 这将导致 TypeError,因为元组是不可变的

标量类型

  • Python 具有用于处理数值数据、字符串、布尔值和日期/时间的内置类型。这些被称为标量类型
类型 描述
None Python 的 “null” 值
str 字符串类型;保存 Unicode 字符串
bytes 原始二进制数据
float 双精度浮点数
bool 布尔值 TrueFalse
int 任意精度整数

数值类型:intfloat

  • int:可以存储任意大的整数。
  • float:表示双精度浮点数(类似于 C/C++ 中的 double)。
ival = 17239871
print(ival ** 6)  # 整数的幂运算

fval = 7.243
fval2 = 6.78e-5  # 科学计数法
26254519291092456596965462913230729701102721

数值类型:intfloat(续)

  • 整数除法如果产生非整数结果,总是得到一个浮点数。使用//进行向下取整除法。

字符串 📝

  • 使用单引号 '...' 或双引号 "..." 创建字符串字面量。
  • 对于多行字符串,使用三引号 '''...'''"""..."""
a = 'one way of writing a string'
b = "another way"
c = """
This is a longer string that
spans multiple lines
"""  # 多行字符串
  • Python 字符串是不可变的

字符串操作

  • 有许多内置的字符串方法可用(例如,count()replace()split())。
a = "this is a string"
# a[10] = 'f'  # TypeError: 'str' 对象不支持项赋值,因为字符串是不可变的

b = a.replace("string", "longer string")  # 替换字符串中的子串
print(b) # 输出:this is a longer string
print(a) # 输出:this is a string, a的值不会改变
this is a longer string
this is a string
  • 使用 str() 将其他对象转换为字符串。

字符串切片和原始字符串

  • 字符串是 Unicode 字符序列,可以像列表/元组一样处理。
s = "python"
print(list(s))  # 输出: ['p', 'y', 't', 'h', 'o', 'n']
print(s[:3])  # 输出: 'pyt',字符串切片
['p', 'y', 't', 'h', 'o', 'n']
pyt

字符串切片和原始字符串(续)

  • 反斜杠 \ 是转义字符。使用原始字符串(以 r 为前缀)可以避免转义。
s = "12\\\\34"  # 包含两个反斜杠的字符串
print(s)  # 输出: 12\34

raw_string = r"this\has\no\special\characters"  # 原始字符串,反斜杠不转义
print(raw_string)  # 输出: this\has\no\special\characters
12\\34
this\has\no\special\characters

字符串连接和格式化

  • 将字符串相加会连接它们。
a = "this is the first half "
b = "and this is the second half"
print(a + b)  # 字符串连接
this is the first half and this is the second half
  • 对于更复杂的字符串构造,使用字符串格式化(format() 方法或 f-strings)。

字符串格式化 (f-strings)

amount = 10
rate = 88.46
currency = "Pesos"
result = f"{amount} {currency} is worth US${amount / rate:.2f}"  # f-string 格式化
print(result) # 输出:10 Pesos is worth US$0.11
10 Pesos is worth US$0.11
  • f-strings(格式化字符串字面量)是一种将表达式嵌入字符串中的简洁方式。

字节和 Unicode

  • 在 Python 3 中,Unicode 是主要的字符串类型。
  • encode() 将 Unicode 字符串转换为字节(例如,UTF-8)。
  • decode() 将字节转换回 Unicode 字符串。
val = "español"  # Unicode 字符串
val_utf8 = val.encode("utf-8")  # 编码为 UTF-8 字节
print(val_utf8)  # 输出: b'espa\xc3\xb1ol'
print(type(val_utf8))  # 输出: <class 'bytes'>

print(val_utf8.decode("utf-8"))  # 解码为 Unicode 字符串
b'espa\xc3\xb1ol'
<class 'bytes'>
español

布尔值

  • TrueFalse 是布尔值。
  • 比较和条件表达式的计算结果为 TrueFalse
  • andornot 结合使用。
print(True and True)  # 输出: True
print(False or True)  # 输出: True

print(int(False))  # 输出: 0,False 可以转换为整数 0
print(int(True))   # 输出: 1,True 可以转换为整数 1
True
True
0
1

类型转换 🧱

  • str()bool()int()float() 可用于将值转换为不同的类型。
s = "3.14159"
fval = float(s)  # 将字符串转换为浮点数
print(type(fval))  # 输出: <class 'float'>
print(int(fval))  # 将浮点数转换为整数,向下取整
print(bool(fval))  # 将浮点数转换为布尔值,非零值为 True
print(bool(0))  # 将整数 0 转换为布尔值,结果为 False
<class 'float'>
3
True
False

None

  • None 是 Python 的 null 值类型。它表示缺少值。
  • 如果函数没有return语句,则它也是函数的默认返回值。
a = None
print(a is None)  # 输出: True

b = 5
print(b is not None)  # 输出: True
True
True
  • None 通常用作函数参数的默认值。

日期和时间 📅

  • datetime 模块提供了 datetimedatetime 类型。
from datetime import datetime, date, time  # 导入 datetime 模块

dt = datetime(2011, 10, 29, 20, 30, 21)  # 创建一个 datetime 对象
print(dt.day)  # 输出: 29,获取日
print(dt.minute)  # 输出: 30,获取分钟
print(dt.date())  # 输出: 2011-10-29,获取日期部分
print(dt.time())  # 输出: 20:30:21,获取时间部分
29
30
2011-10-29
20:30:21

格式化日期和时间

  • strftime()datetime 对象格式化为字符串。
  • strptime() 将字符串解析为 datetime 对象。
print(dt.strftime("%Y-%m-%d %H:%M"))  # 格式化日期和时间

dt2 = datetime.strptime("20091031", "%Y%m%d")  # 解析字符串为 datetime 对象
print(dt2) # 输出:2009-10-31 00:00:00
2011-10-29 20:30
2009-10-31 00:00:00
  • 有关格式代码的完整列表,请参阅 Python 的文档。
  • 由于datetime.datetime是不可变类型,strftime和strptime等方法总是产生新对象。

日期/时间算术

  • 两个 datetime 对象相减会产生一个 timedelta 对象。
  • timedelta 添加到 datetime 会产生一个新的、偏移的 datetime
dt2 = datetime(2011, 11, 15, 22, 30)
delta = dt2 - dt  # 计算两个 datetime 对象的时间差
print(delta)  # 输出: 17 days, 1:59:39
print(type(delta))  # 输出: <class 'datetime.timedelta'>
print(dt + delta)  # 将时间差加到 dt 上
17 days, 1:59:39
<class 'datetime.timedelta'>
2011-11-15 22:30:00

控制流:ifelifelse 🚦

  • 如果条件为真,if 语句执行一段代码。
  • elif(else if)提供其他条件。
  • else 是一个包罗万象的块。
x = -5
if x < 0:  # 如果 x 小于 0
    print("It's negative")  # 打印 "It's negative"
elif x == 0:  # 否则,如果 x 等于 0
    print("Equal to zero")  # 打印 "Equal to zero"
elif 0 < x < 5:  # 否则,如果 x 大于 0 且小于 5
    print("Positive but smaller than 5")  # 打印 "Positive but smaller than 5"
else:  # 否则
    print("Positive and larger than or equal to 5")  # 打印 "Positive and larger than or equal to 5"
It's negative
  • 带有 andor 的条件从左到右计算,并且是短路的。

for 循环 ➿

  • 迭代集合(列表、元组等)或迭代器。
for value in collection:  # 遍历集合中的每个值
    # do something with value  # 对值执行某些操作
  • continue 跳过当前迭代的其余部分。
  • break 完全退出循环。

for 循环示例

sequence = [1, 2, None, 4, None, 5]  # 定义一个列表
total = 0  # 初始化 total 为 0
for value in sequence:  # 遍历列表中的每个值
    if value is None:  # 如果值为 None
        continue  # 跳过当前迭代
    total += value  # 将 value 加到 total 上
print(total) # 输出:12
12

for 循环示例(续)

sequence = [1, 2, 0, 4, 6, 5, 2, 1]  # 定义一个列表
total_until_5 = 0  # 初始化 total_until_5 为 0
for value in sequence:  # 遍历列表中的每个值
    if value == 5:  # 如果值等于 5
        break  # 退出循环
    total_until_5 += value  # 将 value 加到 total_until_5 上
print(total_until_5) # 输出:13
13

嵌套 for 循环

for i in range(4):  # 外层循环,i 从 0 到 3
    for j in range(4):  # 内层循环,j 从 0 到 3
        if j > i:  # 如果 j 大于 i
            break  # 退出内层循环
        print((i, j))  # 打印 (i, j)
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)
(3, 0)
(3, 1)
(3, 2)
(3, 3)

while 循环

  • 只要条件为真,就重复执行一段代码。
x = 256  # 初始化 x 为 256
total = 0  # 初始化 total 为 0
while x > 0:  # 当 x 大于 0 时循环
    if total > 500:  # 如果 total 大于 500
        break  # 退出循环
    total += x  # 将 x 加到 total 上
    x = x // 2  # 将 x 整除 2
print(total) # 输出 504
504

pass 🛑

  • pass 是一个“无操作”语句。它什么也不做。它用于在语法上需要语句但您不想执行任何代码的地方。
if x < 0:
    print("negative!")
elif x == 0:
    # TODO: put something smart here  # 这是一个待办事项,表示将来需要在此处添加代码
    pass  # 什么也不做
else:
    print("positive!")
positive!

range 🔢

  • range() 生成一系列等间隔的整数。
  • range(stop):生成从 0 到(但不包括)stop 的整数。
  • range(start, stop):生成从 start 到(但不包括)stop 的整数。
  • range(start, stop, step):生成具有指定 step 的整数。
print(list(range(10)))  # 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(0, 20, 2)))  # 输出: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print(list(range(5, 0, -1)))  # 输出: [5, 4, 3, 2, 1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[5, 4, 3, 2, 1]

range 示例

seq = [1, 2, 3, 4]  # 定义一个列表
for i in range(len(seq)):  # 遍历列表的索引
    print(f"element {i}: {seq[i]}")  # 打印每个元素及其索引
element 0: 1
element 1: 2
element 2: 3
element 3: 4
  • range 的一个常见用途是按索引遍历序列。

总结

  • 我们已经介绍了 Python 的核心构建块:数据类型、运算符、控制流以及 IPython 和 Jupyter Notebooks 的基本用法。
  • 这些概念构成了使用 Python 进行数据分析的基础。
  • 记住要练习和实验!🧪

思考和讨论 🤔

  • Python 的“一切皆对象”的理念与其他语言相比如何?
  • 与编写脚本相比,使用 Jupyter Notebooks 进行数据分析有哪些优势?
  • 您能想到鸭子类型特别有用的情况吗?
  • 您如何在实际的数据分析项目中使用 datetime 模块?
  • 可变对象和不可变对象之间有什么区别?它们各自的优缺点是什么?