Python学习(三)——配套《PyTorch深度学习实战》
1. Python的整数支持任意长度
Python 的整数类型(int)支持任意长度,这意味着你可以根据需要创建任意大小的整数,不受固定位数的限制。这与某些编程语言(如 C 或 Java)中的整数类型不同,这些语言的整数类型有固定的位数,例如 32 位或 64 位,因此它们能表示的整数范围是有限的。
在 Python 中,整数的大小只受制于可用内存的限制。Python 会自动管理内存,以适应任意大小的整数。这种特性使得 Python 在处理大整数运算时非常灵活和强大。
2. Python的浮点数存在误差
这是由于它们在计算机中的表示方式所导致的。浮点数在 Python 中通常按照 IEEE 754 标准来表示,这是一种广泛使用的浮点数表示方法。以下是浮点数误差的主要原因:
-
有限的精度:浮点数在计算机中以二进制形式存储,这意味着它们只能精确表示某些十进制数。大多数十进制小数在二进制表示中是无限循环的,因此在转换为浮点数时,它们会被截断或四舍五入到最接近的可表示值,这引入了误差。
-
舍入误差:在执行浮点运算时,由于精度的限制,结果可能会被舍入到最接近的可表示值,这可能导致舍入误差。
-
上溢和下溢:当处理非常大或非常小的浮点数时,可能会遇到上溢(超过最大可表示值)或下溢(小于最小可表示值)的情况,这会导致溢出错误或数值被设置为无穷大或零。
-
非规范化数:非常接近零的浮点数可能以非规范化形式表示,这可能导致额外的舍入误差。
这些误差在大多数编程语言中都是常见的,不仅仅是 Python。在进行精确计算或需要高精度的金融计算时,通常需要使用特殊的库,如 Python 的 decimal
模块,或者在其他语言中使用大数或高精度数据类型。
以下是 Python 中浮点数误差的一个简单示例:
# 浮点数相加
result = 0.1 + 0.2
# 打印结果
print(result) # 输出可能是 0.30000000000000000004 而不是精确的 0.3
在这个例子中,0.1
和 0.2
的二进制表示不是精确的,所以它们相加的结果也不是精确的 0.3
。这种误差在大多数情况下是可以接受的,但在需要高精度计算的场景下,你需要采取额外的措施来避免或减少这种误差的影响。
3. Python的负数表达
在 Python 中,负数的表示方法非常简单直观,你只需要在数字前面加上负号(-
)。以下是一些示例:
# 负整数
negative_integer = -10
# 负浮点数
negative_float = -3.14
# 负科学计数法表示的数
negative_scientific = -1e-10
# 负复数(Python 也支持复数)
negative_complex = -1 + 2j
在这些示例中:
negative_integer
是一个负整数。negative_float
是一个负浮点数。negative_scientific
使用科学计数法表示一个非常小的负数。negative_complex
是一个负复数,其中j
或J
表示虚数单位,满足 ( j^2 = -1 )。
在 Python 中,负号可以应用于任何数字类型,包括整数、浮点数和复数,以表示其数值为负。在进行数学运算时,负号会影响运算的结果,例如:
print(-5 + 3) # 输出 2,因为 -5 加 3 等于 2
print(-5 - 3) # 输出 -8,因为 -5 减 3 等于 -8
print(-5 * 3) # 输出 -15,因为 -5 乘以 3 等于 -15
print(-5 / 3) # 输出 -1.6666666666666666667,因为 -5 除以 3 等于 -5/3
在处理数学运算和数据时,正确地表示负数是非常重要的。
4. Python的链式表达式
当然,让我们更详细地探讨这些链式表达式的例子,包括它们的功能和所用的语法:
-
文件操作:
with open('file.txt', 'r') as file: content = file.read().strip().split()
功能:打开一个文件,读取其内容,去除首尾空白字符,然后按行分割成列表。
语法:使用with
语句确保文件正确关闭。read()
读取文件内容,strip()
去除字符串首尾的空白字符(包括换行符),split()
默认按行分割字符串。 -
列表推导式:
squares = [x**2 for x in range(10)]
功能:创建一个包含 0 到 9 的数字平方的列表。
语法:列表推导式提供了一种简洁的方法来创建列表。for x in range(10)
遍历 0 到 9 的数字,x**2
计算每个数字的平方。 -
Pandas 数据处理:
import pandas as pd df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) result = df['A'].mean() + df['B'].mean()
功能:计算 DataFrame 中两列的平均值,并求和。
语法:df['A']
和df['B']
选择 DataFrame 的列,mean()
计算列的平均值。然后,将两个平均值相加得到结果。 -
NumPy 数组操作:
import numpy as np arr = np.array([1, 2, 3, 4]) result = arr.sum() / arr.mean()
功能:计算 NumPy 数组的总和与平均值的比率。
语法:arr.sum()
计算数组所有元素的总和,arr.mean()
计算数组的平均值。然后,将总和除以平均值得到结果。 -
自定义类的链式调用:
class Chainable: def __init__(self, value): self.value = value def increment(self, amount=1): self.value += amount return self def decrement(self, amount=1): self.value -= amount return self obj = Chainable(10).increment(5).decrement(2)
功能:创建一个对象,对其值进行增加和减少操作,并支持链式调用。
语法:Chainable(10)
创建一个初始值为 10 的Chainable
对象。increment(5)
将值增加 5,decrement(2)
将值减少 2。每个方法都返回self
,允许连续调用。最终,obj.value
将是 13。
链式表达式在 Python 中是一种常见的模式,它允许你以一种流畅和表达式丰富的方式编写代码。然而,它们应该谨慎使用,以确保代码的可读性和可维护性。
5. Python中的科学计数法
在Python中,科学技术表达通常指的是使用科学计数法来表示非常大或非常小的数值。科学计数法是一种表示数值的方法,它将数值表示为一个介于1和10之间的数(不包括10)乘以10的某个整数次幂。这种表示方法在科学计算和工程中非常常见,因为它可以简洁地表示非常大或非常小的数值。
在Python中,科学计数法的表示方式如下:
- E表示法:使用
e
或E
来表示10的幂。例如,1.23e10
表示的是1.23 * 10^10
,而4.56e-7
表示的是4.56 * 10^-7
。
以下是一些具体的例子:
# 大数值
a = 1.23e10 # 等同于 1.23 * 10^10
print(a) # 输出 12300000000.0
# 小数值
b = 4.56e-7 # 等同于 4.56 * 10^-7
print(b) # 输出 0.000000456
Python在处理非常大或非常小的浮点数时,会自动使用科学计数法来表示。例如:
c = 12300000000.0
print(c) # 输出 1.23e+10
d = 0.000000456
print(d) # 输出 4.56e-7
此外,Python的format
函数也可以用来控制数值的科学计数法表示方式,例如:
e = 123456789.0
formatted_e = format(e, 'e') # 使用科学计数法格式化
print(formatted_e) # 输出 1.23456789e+08
通过这些方法,可以方便地在Python中使用科学计数法来表示和处理大范围的数值。
6. 一些字符串的方法
以下是Python字符串方法strip
、split
、rsplit
、join
、replace
、upper
和lower
的介绍和使用示例:
strip
- 功能:去除字符串两端的空白字符(包括空格、制表符、换行符等)。
- 示例:
s = " Hello, World! " print(s.strip()) # 输出 "Hello, World!"
split
- 功能:根据指定的分隔符将字符串分割成一个列表,默认分隔符为空白字符。
- 示例:
s = "Hello, World! How are you?" print(s.split()) # 输出 ['Hello,', 'World!', 'How', 'are', 'you?'] print(s.split(',')) # 输出 ['Hello', ' World! How are you?']
rsplit
- 功能:从字符串的右侧开始根据指定的分隔符将字符串分割成一个列表,默认分隔符为空白字符。
- 示例:
s = "Hello, World! How are you?" print(s.rsplit()) # 输出 ['Hello,', 'World!', 'How', 'are', 'you?'] print(s.rsplit(',', 1)) # 输出 ['Hello, World! How are', ' you?']
join
- 功能:将一个可迭代对象(如列表、元组等)中的元素连接成一个字符串,元素之间用指定的字符串连接。
- 示例:
words = ['Hello', 'World', 'How', 'are', 'you?'] print(' '.join(words)) # 输出 "Hello World How are you?" print('-'.join(words)) # 输出 "Hello-World-How-are-you?"
replace
- 功能:将字符串中的某些字符或子字符串替换为其他字符或子字符串。
- 示例:
s = "Hello, World! How are you?" print(s.replace('World', 'Python')) # 输出 "Hello, Python! How are you?" print(s.replace('o', '0', 2)) # 输出 "Hell0, W0rld! How are you?"
upper
- 功能:将字符串中的所有小写字母转换为大写字母。
- 示例:
s = "Hello, World!" print(s.upper()) # 输出 "HELLO, WORLD!"
lower
- 功能:将字符串中的所有大写字母转换为小写字母。
- 示例:
s = "Hello, World!" print(s.lower()) # 输出 "hello, world!"
这些字符串方法在处理文本数据时非常有用,可以帮助您进行字符串的清洗、分割、连接、替换和大小写转换等操作。