Hello world
本章介绍 Python、IPython 和 Jupyter Notebooks 的基本概念,这些是数据分析的必备工具。我们将涵盖:
Python 数据分析能力的演变就像一个“先有鸡还是先有蛋”的场景。最初,像 pandas、scikit-learn 和 statsmodels 这样的库还不太成熟。
如今,这些库已经成熟,形成了一个强大的生态系统,用于数据科学、机器学习和统计计算。这使得 Python 成为任何处理数据的人的绝佳工具。🎉
最好的学习方法是实践!我们将通过 IPython 或 Jupyter 会话来探索这些概念。跟着示例一起学习,以最大程度地提高学习效果。
熟悉键盘驱动、类似控制台的开发也是学习过程的一部分。
Python 是一种解释型语言。解释器逐行执行代码。
使用 python
命令启动标准解释器。
>>>
是您键入代码的提示符。exit()
或 Ctrl-D
(Linux/macOS)退出。创建一个 .py
文件(例如,hello_world.py
)。
从终端运行:python hello_world.py
。确保文件位于您的当前工作目录中。
IPython 是一个增强的 Python 解释器。它专为交互式数据分析而设计。
Jupyter Notebooks 是构建在 IPython 之上的基于 Web 的环境。它们提供了丰富的交互式体验。
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]:
提示符,它与标准的 >>>
不同。print()
更具可读性。Jupyter Notebook 是一个功能强大的交互式文档,适用于代码、文本(使用 Markdown)、可视化等。
使用以下命令启动:jupyter notebook
http://localhost:8888
)。代码单元格:您编写和执行 Python 代码的地方。按 Shift-Enter
运行单元格。
Markdown 单元格:用于文本、解释和文档(使用 Markdown 语法)。
保存 Notebook。它将创建一个扩展名为 .ipynb 的文件,这是一个包含所有内容的自包含格式。
此图显示了一个 Jupyter Notebook,其中包含数据分析和文本的代码:
%pwd
:显示当前工作目录。json
库。Tab
键可以:
=
符号!?
获取有关对象的信息。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 命名空间。现在,让我们深入了解 Python 语言本身的核心语法和语义。
{}
。:
表示缩进块的开始。Note
强烈建议使用四个空格作为默认缩进,并将制表符替换为四个空格。许多文本编辑器都有自动将制表符替换为空格的设置。
int
、str
、list
、function
)和内部数据。#
创建注释。一行中 #
之后的任何内容都将被忽略。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"
()
调用函数并传递参数(如果有)。.
语法调用它们。=
右侧对象的引用。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]
a
和 b
指向内存中的同一个对象,而不是副本。a
和 b
只是引用内存中同一个列表对象的名称。Note
赋值也称为绑定,因为我们将名称绑定到对象。已赋值的变量名有时称为绑定变量。
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()
检查对象是否是特定类型(或几种类型之一)的实例。obj.attribute_name
访问它们。getattr
函数通过名称获取对象的属性和方法。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
.py
文件。import
从其他模块访问变量和函数。# 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
运算 | 描述 |
---|---|
a + b |
a 加 b |
a - b |
a 减 b |
a * b |
a 乘以 b |
a / b |
a 除以 b |
a // b |
a 整除 b ,向下取整 |
a ** b |
a 的 b 次方 |
运算 | 描述 |
---|---|
a & b |
如果 a 和 b 都为 True,则为 True;对于整数,按位与 |
a \| b |
如果 a 或 b 为 True,则为 True;对于整数,按位或 |
a ^ b |
对于布尔值,如果 a 或 b 为 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 |
如果 a 和 b 引用同一个 Python 对象,则为 True |
a is not b |
如果 a 和 b 引用不同的 Python 对象,则为 True |
is
和 is not
is
检查两个变量是否引用同一个对象。is not
检查两个变量是否引用不同的对象。==
检查值是否相等。类型 | 描述 |
---|---|
None |
Python 的 “null” 值 |
str |
字符串类型;保存 Unicode 字符串 |
bytes |
原始二进制数据 |
float |
双精度浮点数 |
bool |
布尔值 True 或 False |
int |
任意精度整数 |
int
和 float
int
:可以存储任意大的整数。float
:表示双精度浮点数(类似于 C/C++ 中的 double
)。int
和 float
(续)//
进行向下取整除法。'...'
或双引号 "..."
创建字符串字面量。'''...'''
或 """..."""
。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()
将其他对象转换为字符串。\
是转义字符。使用原始字符串(以 r
为前缀)可以避免转义。this is the first half and this is the second half
format()
方法或 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
encode()
将 Unicode 字符串转换为字节(例如,UTF-8)。decode()
将字节转换回 Unicode 字符串。True
和 False
是布尔值。True
或 False
。and
、or
和 not
结合使用。str()
、bool()
、int()
和 float()
可用于将值转换为不同的类型。None
None
是 Python 的 null 值类型。它表示缺少值。None
通常用作函数参数的默认值。datetime
模块提供了 datetime
、date
和 time
类型。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
datetime
对象相减会产生一个 timedelta
对象。timedelta
添加到 datetime
会产生一个新的、偏移的 datetime
。if
、elif
、else
🚦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
and
和 or
的条件从左到右计算,并且是短路的。for
循环 ➿continue
跳过当前迭代的其余部分。break
完全退出循环。for
循环示例for
循环示例(续)for
循环while
循环pass
🛑pass
是一个“无操作”语句。它什么也不做。它用于在语法上需要语句但您不想执行任何代码的地方。range
🔢range()
生成一系列等间隔的整数。range(stop)
:生成从 0 到(但不包括)stop
的整数。range(start, stop)
:生成从 start
到(但不包括)stop
的整数。range(start, stop, step)
:生成具有指定 step
的整数。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
的一个常见用途是按索引遍历序列。datetime
模块?