数值计算:
数值方法涉及使用数值技术来近似解,特别是在难以找到解析解时。解决方程的一种常见数值方法是迭代方法。
移项可得:
迭代方法:
从一个初始猜测开始,
x0 = 1
x1 = x0
for i in range(1,20):
x1 = (x0 * x0 + 4 )/4
x0 = x1
print(x1)
从一个初始猜测开始,
迭代格式的好坏是算法的好坏。迭代格式需要精心设计。
实际上所有的数值计算都需要进行迭代。
迭代格式涉及的典型数值计算方法:
求解非线性方程: 迭代方法可用于找到非线性方程的根,如牛顿-拉普森法,二分法等。
优化问题: 一些优化算法使用迭代方法,如梯度下降法和共轭梯度法,用于寻找函数的最小值。
求解线性系统: 迭代方法如雅各比迭代和高斯-赛德尔迭代可用于求解大型稀疏线性系统的近似解。
插值和逼近: 插值和逼近问题通常需要找到多项式或其他函数,以拟合已知数据点,迭代方法可用于调整多项式系数以获得更好的逼近。
数值积分: 龙贝格-库塔法和蒙特卡洛方法是一些用于数值积分的迭代方法。
常微分方程求解: 迭代方法可用于求解常微分方程,如欧拉方法、龙格-库塔方法和变步长方法。
矩阵特征值问题: 幂法和反幂法是一些用于计算矩阵的主特征值和特征向量的迭代方法。
傅里叶变换: 快速傅里叶变换(FFT)是一种迭代算法,用于高效地计算信号的频谱。
数值计算涉及以下步骤:
解方程: 首先,数值计算要求将一个数学方程或问题转化为计算机可以处理的形式。这可能涉及将方程解出来以获得通用的解析解,通常表示为一个函数或表达式。
编写通式: 一旦获得了解析解,你可以将其表示为通用的数学公式,其中包含变量和参数。这个通式表示了问题的一般性质。
带入具体数值: 接下来,你可以将具体的数值带入这个通式中,以计算在特定数值下的结果。这可能涉及将特定的值分配给变量,并执行计算。
计算结果: 最后,通过执行计算,你将得到在特定数值下的问题的解。这个结果可以是一个数字或一组数字,它代表了问题的答案。
这个过程可以应用于各种数学问题,从简单的方程求解到复杂的数值模拟和优化问题。数值计算的关键在于使用计算机来进行大规模、复杂或无法精确求解的数学计算,以获得近似的数值结果。 一般对于解析求解,只需要解方程和编写通式这两个步骤。
Python是一种流行的高级编程语言,具有丰富的历史、独特的特点和显著的优势。



C语言:
预编译:在C语言中,通常需要进行预处理,其中包括宏替换、头文件包含等步骤。这将生成一个经过处理的源代码文件。
编译:C语言的源代码需要经过编译器的编译过程,将其翻译成汇编代码,然后生成可执行的机器代码文件。
生成可执行文件:编译后的代码将生成可执行文件,这是计算机可以直接运行的二进制文件。
Python:
无需预编译:Python是一种解释型语言,不需要预编译过程。您可以编写Python代码并直接运行它,无需生成中间可执行文件。
解释执行:Python代码在运行时由解释器逐行执行,而不是生成可执行的机器代码文件。
跨平台性:Python代码通常是跨平台的,因为解释器在不同操作系统上执行相同的代码。
C语言需要经历明确的预处理和编译过程,生成可执行文件,而Python是解释型语言,无需生成可执行文件,代码在运行时逐行解释执行。这些区别对于开发和部署软件具有重要意义。

Anaconda个人版文档:https://anaconda.org.cn/anaconda
Anaconda个人版安装程序下载:https://www.anaconda.com/download



Python 标准库: https://docs.python.org/zh-cn/3/library/index.html
| 编译器/解释器 | 描述 |
|---|---|
| CPython | CPython是Python的官方解释器,也是Python语言的标准实现。PyCharm通常默认支持CPython,你可以选择不同的CPython版本来运行项目。 |
| Anaconda Python | Anaconda是一个Python数据科学平台,它包括了许多科学计算库和工具。Anaconda Python通常与conda虚拟环境一起使用,可以方便地管理Python包和环境,特别适用于数据科学和机器学习项目。 |
| PyPy | PyPy是Python的另一种实现,旨在提供更高的性能。虽然不是标准解释器,但PyCharm允许你配置和使用PyPy来运行Python代码,以获得更好的性能。 |
PyCharm支持的Python虚拟环境:
| 虚拟环境 | 描述 |
|---|---|
| Python虚拟环境 | Python自带了一个名为venv的虚拟环境工具,可以用来创建轻量级的虚拟环境,用于隔离项目的依赖项。 |
| conda虚拟环境 | conda是一个流行的包管理器和环境管理器,Anaconda Python通常与conda一起使用。你可以使用conda创建和管理虚拟环境,轻松地安装和管理各种Python包。 |
| virtualenv | virtualenv是一个独立的Python虚拟环境管理工具,它允许你创建和管理虚拟环境,与PyCharm兼容,并用于项目的依赖项隔离。 |
| pipenv | pipenv是一个基于pip的虚拟环境管理工具,它集成了依赖管理和虚拟环境管理,可以帮助你更轻松地管理项目的依赖项。 |
| venv | Python 的内置工具,用于创建虚拟环境。它适用于 Python 3.3 及更高版本。 |
https://www.jetbrains.com/pycharm/download/?section=windows

PyCharm 中的 Terminal 和 Python Console 是两个不同的工具,它们分别用于不同的目的,有一些重要的区别:
用途:Python Console 是一个与Python交互式解释器集成的工具。它允许您在PyCharm中执行Python代码,并立即查看结果,用于快速测试、调试和探索Python代码。
环境:Python Console 在PyCharm内部运行,与您的项目关联。它提供了一个Python环境,可以访问您项目中的所有模块和库。
Python版本:Python Console 使用的Python版本取决于您的项目配置。您可以在PyCharm中为每个项目选择不同的Python解释器。
代码补全和历史记录:Python Console 提供了代码自动完成、历史记录查看和其他与Python代码交互相关的功能。
推荐学习网站:
Python 标准库: https://docs.python.org/zh-cn/3/library/index.html
https://www.runoob.com/python3/python3-tutorial.html
https://c.biancheng.net
Python的基本语法包括数据类型、变量、运算符和表达式。



Python支持多种数据类型,包括:
Python 数字数据类型用于存储数值。
数据类型是不允许改变的,这就意味着如果改变数字数据类型的值,将重新分配内存空间。
以下实例在变量赋值时 Number 对象将被创建:
var1 = 1
var2 = 10
浮点数(float)
复数 (complex)
| int | float | complex |
|---|---|---|
| 10 | 0.0 | 3.14j |
| 100 | 15.20 | 45.j |
| -786 | -21.9 | 9.322e-36j |
| 080 | 32.3e+18 | .876j |
| -0490 | -90. | -.6545+0j |
| -0x260 | -32.54e100 | 3e+26j |
| 0x69 | 70.2E-12 | 4.53e-7j |
var1 = 'Hello World!'
var2 = "Runoob"
Python 访问字符串中的值
变量[头下标:尾下标]
Python 访问字符串中的值
var1 = 'Hello World!'
var2 = "Runoob"
print ("var1[0]: ", var1[0])
print ("var2[1:5]: ", var2[1:5])
以上实例执行结果:
var1[0]: H
var2[1:5]: unoo
Python 字符串更新
var1 = 'Hello World!'
print ("已更新字符串 : ", var1[:6] + 'Runoob!')
以上实例执行结果:
已更新字符串 : Hello Runoob!
Python 转义字符: 反斜杠 \
print('\'Hello, world!\'') # 输出:'Hello, world!'
print("Hello, world!\nHow are you?") # 输出:Hello, world!
# How are you?
print("Hello, world!\tHow are you?") # 输出:Hello, world! How are you?
print("Hello,\b world!") # 输出:Hello world!
print("Hello,\f world!") # 输出:
# Hello,
# world!
| 操作符 | 描述 | 实例 |
|---|---|---|
| + | 字符串连接 | a + b 输出结果: HelloPython |
| * | 重复输出字符串 | a*2 输出结果:HelloHello |
| [] | 通过索引获取字符串中字符 | a[1] 输出结果 e |
| [ : ] | 截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。 | a[1:4] 输出结果 ell |
| in | 成员运算符 - 如果字符串中包含给定的字符返回 True | 'H' in a 输出结果 True |
| not in | 成员运算符 - 如果字符串中不包含给定的字符返回 True | 'M' not in a 输出结果 True |
| r/R | 原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 | print( r'\n' ) print( R'\n' ) |
序列是 Python 中最基本的数据结构。
序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。
Python 有 6 个序列的内置类型,但最常见的是列表和元组。
列表都可以进行的操作包括索引,切片,加,乘,检查成员。
Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。
list1 = ['Google', 'Runoob', 1997, 2000]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = ['red', 'green', 'blue', 'yellow', 'white', 'black']
列表(list)

list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[0] )
print( list[1] )
print( list[2] )
以上实例输出结果:
red
green
blue
列表(list)

list = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print( list[-1] )
print( list[-2] )
print( list[-3] )
以上实例输出结果:
black
white
yellow
nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[0:4])
以上实例输出结果:
[10, 20, 30, 40]
列表(list)
list = ['Google', 'Runoob', "Zhihu", "Taobao", "Wiki"]
# 读取第二位
print ("list[1]: ", list[1])
# 从第二位开始(包含)截取到倒数第二位(不包含)
print ("list[1:-2]: ", list[1:-2])
以上实例输出结果:
list[1]: Runoob
list[1:-2]: ['Runoob', 'Zhihu']
更新列表:可以列表的数据项进行修改或更新.
list = ['Google', 'Runoob', 1997, 2000]
print ("第三个元素为 : ", list[2])
list[2] = 2001
print ("更新后的第三个元素为 : ", list[2])
list1 = ['Google', 'Runoob', 'Taobao']
list1.append('Baidu')
print ("更新后的列表 : ", list1)
以上实例输出结果:
第三个元素为 : 1997
更新后的第三个元素为 : 2001
更新后的列表 : ['Google', 'Runoob', 'Taobao', 'Baidu']
list = ['Google', 'Runoob', 1997, 2000]
print ("原始列表 : ", list)
del list[2]
print ("删除第三个元素 : ", list)
以上实例输出结果:
原始列表 : ['Google', 'Runoob', 1997, 2000]
删除第三个元素 : ['Google', 'Runoob', 2000]
| Python 表达式 | 结果 | 描述 |
|---|---|---|
| len([1, 2, 3]) | 3 | 长度 |
| [1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 组合 |
| ['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 重复 |
| 3 in [1, 2, 3] | True | 元素是否存在于列表中 |
| for x in [1, 2, 3]: print(x, end=" ") | 1 2 3 | 迭代 |
L=['Google', 'Runoob', 'Taobao']
截取操作:
| Python 表达式 | 结果 | 描述 |
|---|---|---|
| L[2] | 'Taobao' | 读取第三个元素 |
| L[-2] | 'Runoob' | 从右侧开始读取倒数第二个元素: count from the right |
| L[1:] | ['Runoob', 'Taobao'] | 输出从第二个元素开始后的所有元素 |
>>>L=['Google', 'Runoob', 'Taobao']
>>> L[2]
'Taobao'
>>> L[-2]
'Runoob'
>>> L[1:]
['Runoob', 'Taobao']
>>>
>>>squares = [1, 4, 9, 16, 25]
>>> squares += [36, 49, 64, 81, 100]
>>> squares
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> tup1 = ('Google', 'Runoob', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5 )
>>> tup3 = "a", "b", "c", "d" # 不需要括号也可以
>>> type(tup3)
<class 'tuple'>
>>> tup1 = (50)
>>> type(tup1) # 不加逗号,类型为整型
<class 'int'>
>>> tup1 = (50,)
>>> type(tup1) # 加上逗号,类型为元组
<class 'tuple'>
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
以上实例输出结果:
tup1[0]: Google
tup2[1:5]: (2, 3, 4, 5)
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3)
以上实例输出结果:
(12, 34.56, 'abc', 'xyz')
tup = ('Google', 'Runoob', 1997, 2000)
print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup)
以上实例元组被删除后,输出变量会有异常信息,输出如下所示:
删除后的元组 tup :
Traceback (most recent call last):
File "test.py", line 8, in <module>
print (tup)
NameError: name 'tup' is not defined

tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')

| Python 表达式 | 结果 | 描述 |
|---|---|---|
| tup[1] | 'Runoob' | 读取第二个元素 |
| tup[-2] | 'Weibo' | 反向读取,读取倒数第二个元素 |
| tup[1:] | ('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin') | 截取元素,从第二个开始后的所有元素。 |
| tup[1:4] | ('Runoob', 'Taobao', 'Wiki') | 截取元素,从第二个开始到第四个元素(索引为 3)。 |
>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
d = {key1 : value1, key2 : value2, key3 : value3 }
字典(dict)

tinydict = {'name': 'runoob', 'likes': 123, 'url': 'www.runoob.com'}

tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
print ("tinydict['Name']: ", tinydict['Name'])
print ("tinydict['Age']: ", tinydict['Age'])
以上实例输出结果:
tinydict['Name']: Runoob
tinydict['Age']: 7
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
tinydict['Age'] = 8 # 更新 Age
tinydict['School'] = "Python教程" # 添加信息
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])
以上实例输出结果:
tinydict['Age']: 8
tinydict['School']: Python教程
tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
del tinydict['Name'] # 删除键 'Name'
tinydict.clear() # 清空字典
del tinydict # 删除字典
print ("tinydict['Age']: ", tinydict['Age'])
print ("tinydict['School']: ", tinydict['School'])
但这会引发一个异常,因为用执行 del 操作后字典不再存在:
Traceback (most recent call last):
File "/runoob-test/test.py", line 9, in <module>
print ("tinydict['Age']: ", tinydict['Age'])
NameError: name 'tinydict' is not defined
set1 = {1, 2, 3, 4} # 直接使用大括号创建集合
set2 = set([4, 5, 6, 7]) # 使用 set() 函数从列表创建集合
| 特性 | 字符串 (str) | 列表 (list) | 元组 (tuple) | 字典 (dict) | 集合 (set) |
|---|---|---|---|---|---|
| 可变性 | 不可变 (Immutable) | 可变 (Mutable) | 不可变 (Immutable) | 可变 (Mutable) | 可变 (Mutable) |
| 元素类型 | 字符 | 可包含不同类型元素 | 可包含不同类型元素 | 键和值可以是不同类型 | 不可包含重复元素 |
| 访问元素 | 通过索引访问 | 通过索引访问 | 通过索引访问 | 通过键访问 | 通过成员检查访问 |
| 有序性 | 有序 (Ordered) | 有序 (Ordered) | 有序 (Ordered) | 无序 (Unordered) | 无序 (Unordered) |
| 表示方式 | 使用单引号、双引号或三引号 | 使用方括号 [] | 使用圆括号 () | 使用花括号 {} | 使用花括号 {} |
| 示例 | "Hello, Python!" |
my_list = [1, 2, 3] |
my_tuple = (1, 2, 3) |
my_dict = {"name": "Alice", "age": 30} |
my_set = {1, 2, 3} |
int(x) 将x转换为一个整数。
float(x) 将x转换到一个浮点数。
complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式
变量的命名规则

正确的变量命名有助于使代码更易于理解和维护,因此请确保遵循Python的变量命名规则和最佳实践。



在 python 中,类型属于对象,变量是没有类型的:
a=[1,2,3]
a="Runoob"
以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象。
类型属于对象:在Python中,每个值(包括变量)都是一个对象,而每个对象都有一个类型。类型描述了对象的性质和操作,例如整数、字符串、列表等。你可以使用type()函数来获取一个对象的类型。例如,type(42)会返回<class 'int'>,表示这是一个整数对象。
变量是没有类型的:Python的变量是标签或引用,它们指向内存中的对象。变量本身没有固定的类型,而是可以随时指向不同类型的对象。例如,你可以将一个变量用于存储整数,然后将其重新赋值为字符串,而Python会适应这个改变。
类和对象是面向对象编程(OOP)的核心概念:
类(Class):类是一种抽象的蓝图或模板,它定义了对象的结构和行为。类包含属性(成员变量)和方法(成员函数),这些描述了对象应该具有的特征和行为。在Python中,类通过class关键字定义。
对象(Object):对象是类的实例,它是根据类的定义创建的具体实体。对象具有类定义的属性和方法,可以独立操作和与其他对象互动。对象是程序中的实体,它们可以执行特定的任务和存储数据。
class Dog: # 定义一个类
def __init__(self, name): # 类的构造函数
self.name = name # 类的属性
def bark(self): # 类的方法
print(f"{self.name} is barking")
# 创建两个狗的对象
dog1 = Dog("Buddy")
dog2 = Dog("Max")
# 调用对象的方法
dog1.bark() # 输出: Buddy is barking
dog2.bark() # 输出: Max is barking
在Python中,变量和对象是核心概念:
变量:变量是用于存储数据的标识符,它可以指向各种不同类型的对象。变量在Python中不需要提前声明或指定类型,你可以直接创建一个变量并将其赋值。变量本质上是名称,它指向内存中存储的对象。例如,x = 10中的x是一个变量,它指向一个整数对象10。
对象:对象是Python中的基本数据单元,一切都是对象。对象是具体的数据实体,可以是数字、字符串、列表、函数等等。每个对象都有自己的数据类型,特性和行为。例如,整数10、字符串"Hello"和列表[1, 2, 3]都是不同类型的对象。
Python的变量实际上是对象的引用,它们指向内存中存储的对象。将一个变量赋值给另一个变量时,它们实际上指向同一个对象,因此更改一个变量可能会影响另一个变量。这是因为Python采用引用语义,变量存储的是对象的引用,而不是对象本身。
x = 10 # 创建一个变量x,指向整数对象10
y = x # 创建一个变量y,也指向整数对象10
# 修改x的值,同时y的值也会受到影响
x = 20
print(x) # 输出: 20
print(y) # 输出: 10
在Python中,术语"对象"可以在不同上下文中具有不同的含义。以下是对Python中对象和OOP(面向对象编程)概念中的对象之间区别的解释:
Python中的对象:
在Python中,一切都是对象。这意味着所有数据都是对象,包括数字、字符串、函数、类等。
每个对象都有自己的数据类型,属性和方法。
你可以创建自定义对象,这通常是通过定义类(class)来实现的,然后可以创建该类的实例。
Python中的对象是编程中的核心,它们用于存储和操作数据。
OOP概念中的对象:
在面向对象编程(OOP)中,对象是类的实例。类是一种蓝图或模板,描述了对象应该具有的属性和方法。
对象是类的具体实现,它们基于类的定义创建。
OOP通过将数据和操作封装在对象中来组织和管理代码,使代码更易维护和理解。
面向对象编程的核心思想是将问题分解为对象,每个对象具有特定的职责和行为。
Python中的对象是通用的,可以代表任何数据实体,而OOP中的对象是类的实例,具有特定的属性和行为,用于实现面向对象编程的概念。 Python是一种面向对象编程语言,因此在Python中,对象既可以指代通用的数据实体,也可以指代面向对象编程中的类的实例。
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 加 - 两个对象相加 | a + b 输出结果 31 |
| - | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -11 |
| * | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 210 |
| / | 除 - x 除以 y | b / a 输出结果 2.1 |
| % | 取模 - 返回除法的余数 | b % a 输出结果 1 |
| ** | 幂 - 返回 x 的 y 次幂 | a**b 为 10 的 21 次方 |
| // | 取整除 - 往小的方向取整数 | 9//2 输出结果 4,-9//2 输出结果 -5 |
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
| != | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True。 |
| > | 大于 - 返回 x 是否大于 y | (a > b) 返回 False。 |
| < | 小于 - 返回 x 是否小于 y | (a < b) 返回 True。 |
| >= | 大于等于 - 返回 x 是否大于等于 y | (a >= b) 返回 False。 |
| <= | 小于等于 - 返回 x 是否小于等于 y | (a <= b) 返回 True。 |
| 运算符 | 逻辑表达式 | 描述 | 实例 |
|---|---|---|---|
| and | x and y | 布尔"与" - 如果 x 为 False,返回 x 的值,否则返回 y 的计算值。 | (a and b) 返回 20。 |
| or | x or y | 布尔"或" - 如果 x 是 True,返回 x 的值,否则返回 y 的计算值。 | (a or b) 返回 10。 |
| not | not x | 布尔"非" - 如果 x 为 True,返回 False。如果 x 为 False,返回 True。 | not(a and b) 返回 False。 |
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
| += | 加法赋值运算符 | c += a 等效于 c = c + a |
| -= | 减法赋值运算符 | c -= a 等效于 c = c - a |
| *= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
| /= | 除法赋值运算符 | c /= a 等效于 c = c / a |
| %= | 取模赋值运算符 | c %= a 等效于 c = c % a |
| **= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
| //= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
| := | 海象运算符,可在表达式内部为变量赋值 | 在这个示例中,赋值表达式可以避免调用 len() 两次: if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)") |
| 运算符 | 描述 | 实例 |
|---|---|---|
| in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
| not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
| 运算符 | 描述 | 实例 |
|---|---|---|
| is | 判断两个标识符是否引用同一个对象,类似于 id(x) == id(y),如果引用同一个对象则返回 True,否则返回 False。 |
x is y 返回 True,如果引用的是同一个对象。 |
| is not | 判断两个标识符是否引用不同对象,类似于 id(x) != id(y),如果引用不同对象则返回 True,否则返回 False。 |
x is not y 返回 True,如果引用的不是同一个对象。 |
操作数(operands)和操作符(operators)组成的组合,用于执行特定的计算或操作:
| 运算符 | 描述 |
|---|---|
| , | 表达式分隔符 |
| [] | 圆括号中的表达式 |
| [ ] | 列表,字典,集合的创建 |
| ( ) | 圆括号中的表达式 |
| x[index] | 读取元素 |
| x[index:index] | 切片 |
| x(arguments...) | 调用函数或方法 |
| x.attribute | 属性引用 |
| await x | 等待表达式 |
| ** | 乘方,指数运算 |
| +x, -x, ~x | 正数,负数,按位非 NOT |
| *, @, /, //, % | 乘法,矩阵乘法,除法,整除,取余 |
| +, - | 加法,减法 |
| <<, >> | 左移位,右移位 |
| & | 按位与 AND |
| ^ | 按位异或 XOR |
| in, not in, is, is not, <, <=, >, >=, !=, == | 比较运算,包括成员检测和标识号检测 |
| not x | 逻辑非 NOT |
| and | 逻辑与 AND |
| or | 逻辑或 OR |
| if -- else | 条件表达式 |
| lambda | lambda 表达式 |
| := | 赋值表达式 |
for:用于迭代原始数据序列,类似于循环中的迭代变量。
if:可选关键词,用于过滤数据序列中的元素,只选择满足条件的元素。
in:用于指定要迭代的数据序列。
表达式:在推导式中执行的操作或计算,用于生成新数据序列中的每个元素。
这些关键词简化代码和提高可读性。
[表达式 for 变量 in 列表]
[out_exp_res for out_exp in input_list]
或者
[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]
out_exp_res:列表生成元素表达式,可以是有返回值的函数。
for out_exp in input_list:迭代 input_list 将 out_exp 传入到 out_exp_res 表达式中。
if condition:条件语句,可以过滤列表中不符合条件的值。
实例:>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
>>> new_names = [name.upper()for name in names if len(name)>3]
>>> print(new_names)
['ALICE', 'JERRY', 'WENDY', 'SMITH']
>>> multiples = [i for i in range(30) if i % 3 == 0]
>>> print(multiples)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
{ key_expr: value_expr for value in collection }
或
{ key_expr: value_expr for value in collection if condition }
实例:推导式写出菲波那切数列。
n = 10 # 想要生成的斐波那契数的数量
fibonacci = [0, 1] # 初始斐波那契数列的前两个数
[fibonacci.append(fibonacci[-1] + fibonacci[-2]) for _ in range(2, n)]
print(fibonacci)
实例:推导式写出10000以内所有质数。
primes = [2] + [i for i in range(3, 10001, 2) if all(i % j != 0 for j in range(3, int(i**0.5)+1, 2))]
实例:推导式写出10000以内所有质数。
primes = [2] + [i for i in range(3, 10001, 2) if all(i % j != 0 for j in range(3, int(i**0.5)+1, 2))]
if 判断条件:
执行语句……
else:
执行语句……

flag = False
name = 'luren'
if name == 'python': # 判断变量是否为 python
flag = True # 条件成立时设置标志为真
print 'welcome boss' # 并输出欢迎信息
else:
print name # 条件不成立时输出变量名称
if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
num = 5
if num == 3: # 判断num的值
print 'boss'
elif num == 2:
print 'user'
elif num == 1:
print 'worker'
elif num < 0: # 值小于零时输出
print 'error'
else:
print 'roadman' # 条件均不成立时输出
| 循环类型 | 描述 |
|---|---|
| while 循环 | 在给定的判断条件为 true 时执行循环体,否则退出循环体。 |
| for 循环 | 重复执行语句。 |
| 嵌套循环 | 你可以在 while 循环体中嵌套 for 循环。 |
| 控制语句 | 描述 |
|---|---|
| break 语句 | 在语句块执行过程中终止循环,并且跳出整个循环。 |
| continue 语句 | 在语句块执行过程中终止当前循环,跳出该次循环,执行下一次循环。 |
| pass 语句 | pass 是空语句,是为了保持程序结构的完整性。它不执行任何操作。 |
while 判断条件(condition):
执行语句(statements)……

count = 0
while (count < 5):
print 'The count is:', count
count = count + 1
print "Good bye!"
以上代码执行输出结果:
The count is: 0
The count is: 1
The count is: 2
The count is: 3
The count is: 4
Good bye!
i = 1
while i < 10:
i += 1
if i%2 > 0: # 非双数时跳过输出
continue
print i # 输出双数2、4、6、8、10
i = 1
while 1: # 循环条件为1必定成立
print i # 输出1~10
i += 1
if i > 10: # 当i大于10时跳出循环
break
count = 0
while count < 5:
print count, " is less than 5"
count = count + 1
else:
print count, " is not less than 5"
以上实例输出结果为:
0 is less than 5
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
5 is not less than 5
for letter in 'Python': # 遍历字符串
print("当前字母: %s" % letter)
fruits = ['banana', 'apple', 'mango']
for fruit in fruits: # 遍历列表
print ('当前水果: %s'% fruit)
print ("Good bye!")
以上实例输出结果:
当前字母: P
当前字母: y
当前字母: t
当前字母: h
当前字母: o
当前字母: n
当前水果: banana
当前水果: apple
当前水果: mango
Good bye!
for num in range(10,20): # 迭代 10 到 20 之间的数字
for i in range(2,num): # 根据因子迭代
if num%i == 0: # 确定第一个因子
j=num/i # 计算第二个因子
print ('%d 等于 %d * %d' % (num,i,j))
break # 跳出当前循环
else: # 循环的 else 部分
print ('%d 是一个质数' % num)
for iterating_var in sequence:
for iterating_var in sequence:
statements(s)
statements(s)
while expression:
while expression:
statement(s)
statement(s)
i = 2
while(i < 100): # 嵌套循环输出2~100之间的素数
j = 2
while(j <= (i/j)):
if not(i%j): break
j = j + 1
if (j > i/j) : print i, " 是素数"
i = i + 1
print "Good bye!"
# 使用 break 语句来提前结束循环
fruits = ["苹果", "香蕉", "橙子", "草莓", "葡萄"]
for fruit in fruits:
if fruit == "橙子":
print("我找到了橙子!")
break # 当找到橙子时提前结束循环
print("正在检查:" + fruit)
# 使用 continue 语句来跳过当前循环迭代,继续下一次迭代:
# 当循环遍历到偶数时,continue语句被执行,
# 导致当前迭代被跳过,而不是执行后续的打印语句。因此,只有奇数数字被打印出来。
numbers = [1, 2, 3, 4, 5]
for number in numbers:
if number % 2 == 0:
continue # 当数字是偶数时跳过当前迭代
print(f"奇数数字:{number}")
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
捕捉异常可以使用try/except语句。
try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它。
try....except...else的语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,获得附加的数据
else:
<语句> #如果没有异常发生
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
以上程序输出结果:
$ python test.py
内容写入文件成功
$ cat testfile # 查看写入的内容
这是一个测试文件,用于测试异常!!
try:
fh = open("testfile", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print "Error: 没有找到文件或读取文件失败"
else:
print "内容写入文件成功"
fh.close()
在执行代码前为了测试方便,我们可以先去掉 testfile 文件的写权限,命令如下:
chmod -w testfile
再执行以上代码:
$ python test.py
Error: 没有找到文件或读取文件失败
可以不带任何异常类型使用except:
try:
正常的操作
......................
except:
发生异常,执行这块代码
......................
else:
如果没有异常执行这块代码
以上方式try-except语句捕获所有发生的异常。
但这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息。
因为它捕获所有的异常。
可以使用相同的except语句来处理多个异常信息:
try:
正常的操作
......................
except(Exception1[, Exception2[,...ExceptionN]]):
发生以上多个异常中的一个,执行这块代码
......................
else:
如果没有异常执行这块代码
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性和代码的重复利用率。
Python提供了许多内建函数,比如print()。
自己创建函数叫做用户自定义函数。
def functionname( parameters ):
"函数_文档字符串"
function_suite
return [expression]
def printme( str ):
"打印传入的字符串到标准显示设备上"
print str
return
def printme( str ):
"打印任何传入的字符串"
print str
return
# 调用函数
printme("我要调用用户自定义函数!")
printme("再次调用同一函数")
以上实例输出结果:
我要调用用户自定义函数!
再次调用同一函数
| 语言 | 参数传递方式 |
|---|---|
| C | 值传递、指针传递 |
| C++ | 值传递、引用传递、指针传递 |
| Fortran | 值传递、指针传递 |
| Matlab | 值传递 |
| Python | 引用传递 |
按值传递(Pass by Value): 这是C++中最常见的参数传递方式。函数接收参数的拷贝,对参数的修改不会影响原始值。
void passByValue(int x) {
x = 20;
}
int main() {
int num = 10;
passByValue(num);
// 此时num仍然为10,没有改变
return 0;
}
按引用传递(Pass by Reference): 通过引用传递参数,函数可以修改原始值。
void passByReference(int &x) {
x = 20;
}
int main() {
int num = 10;
passByReference(num);
// 此时num被修改为20
return 0;
}
指针传递(Pass by Pointer): 通过指针传递参数,函数可以使用指针修改原始值。
void passByPointer(int *x) {
*x = 20;
}
int main() {
int num = 10;
passByPointer(&num);
// 此时num被修改为20
return 0;
}
传递常量引用(Pass by Const Reference): 使用常量引用可以防止函数修改原始值。
void passByConstReference(const int &x) {
// 无法修改x
}
int main() {
int num = 10;
passByConstReference(num);
// num仍然为10
return 0;
}
python 函数的参数传递:
def ChangeInt( a ):
a = 10
b = 2
ChangeInt(b)
print b # 结果是 2
实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。
# 实例中传入函数的和在末尾添加新内容的对象用的是同一个引用
def changeme(mylist):
"修改传入的列表"
mylist.append([1, 2, 3, 4])
mylist[0] = 100
print("函数内取值: ", mylist)
return
# 调用changeme函数
mylist = [10, 20, 30]
changeme(mylist)
print("函数外取值: ", mylist)
函数内取值: [100, 20, 30, [1, 2, 3, 4]]
函数外取值: [100, 20, 30, [1, 2, 3, 4]]
Python 模块(Module)是一个 Python 文件,以 .py 结尾,封装了 Python 对象定义和Python语句。
| 优点 | 描述 |
|---|---|
| 模块化和可维护性 | 将代码分割成小的、独立的单元,提高了代码的可维护性。 |
| 代码重用 | 可以在不同的项目中重复使用模块,提高了开发效率。 |
| 命名空间分离 | 模块内部的变量和函数不会与其他模块的命名冲突,有助于代码的可靠性。 |
| 可读性和结构化 | 模块帮助将代码组织成结构化形式,提高了代码的可读性。 |
| 导入系统 | Python的导入系统灵活,可以轻松导入标准库、第三方库和自定义模块。 |
| 测试和调试 | 模块的独立性使得测试和调试更加简便。 |
| 命令行工具 | 模块可以转换为可执行的命令行工具,用于编写脚本和自动化任务。 |
| 模块文档和注释 | 模块内部可以包含文档字符串和注释,有助于其他开发人员理解模块的功能。 |
| 代码重构 | 使用模块,可以更轻松地对代码进行重构,不会破坏其他部分的代码。 |
support.py 模块定义:
def print_func( par ):
print "Hello : ", par
return
| 引入方法 | 示例 |
|---|---|
| 引入整个模块 | import random`random_number = random.randint(1, 10) |
| 引入特定对象 | from random import randintvalue = randint(1, 100) |
| 为模块使用别名 | import random as rrandom_number = r.randint(1, 10) |
| 引入方法 | 示例 |
|---|---|
| 引入整个模块 | import mathresult = math.sqrt(25) |
| 引入特定对象 | from math import sqrtresult = sqrt(25) |
| 为模块使用别名 | import math as mresult = m.sqrt(25) |
| 引入方法 | 示例 |
|---|---|
| 引入整个模块 | import pandasdata = pandas.DataFrame(...) |
| 引入特定对象 | from pandas import DataFramedata = DataFrame(...) |
| 为模块使用别名 | import pandas as pddata = pd.DataFrame(...) |
无论哪种引入方式,它们都使模块的功能在当前的Python环境中可用,可以利用模块提供的函数、变量和类。
__init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。__init__.py 文件,test.py 为测试调用包的代码,目录结构如下:test.py
package_runoob
|-- __init__.py
|-- runoob1.py
|-- runoob2.py
包的源代码如下:
package_runoob/runoob1.py
def runoob1():
print "I'm in runoob1"
package_runoob/runoob2.py
def runoob2():
print "I'm in runoob2"
在 package_runoob 目录下创建 __init__.py:
package_runoob/init.py
if __name__ == '__main__':
print '作为主程序运行'
else:
print 'package_runoob 初始化'
在 package_runoob 同级目录下创建 test.py 来调用 package_runoob 包:
# 导入 Phone 包
from package_runoob.runoob1 import runoob1
from package_runoob.runoob2 import runoob2
runoob1()
runoob2()
输出结果:
package_runoob 初始化
I'm in runoob1
I'm in runoob2
包内可以包含其他包,这些被称为子包。子包的目录结构类似于普通包,也需要包含一个__init__.py文件。
要导入包中的模块,可以使用点号(.)来表示层次结构。例如,如果有一个包my_package,其中包含一个模块my_module,可以这样导入它:
from my_package import my_module
from . import another_module
__init__.py的作用:__init__.py文件可以包含初始化包时需要执行的代码,也可以用来导入包内的模块,以便在导入包时,包内的模块也可以自动加载。
包的命名规则:包的名称应该是有效的Python标识符,并且通常使用小写字母。避免使用Python内置模块和库的名称,以免引起命名冲突。
my_package/
__init__.py
my_module1.py
my_module2.py
subpackage/
__init__.py
sub_module1.py
sub_module2.py
print "Python is good ! "
标准屏幕上会产生以下结果:
Python is good !
在Python 2.x中,print语句可以使用括号,也可以逗号来分隔不同的输出项。
在Python 3.x 中,print语句已经被替代为print()函数,因此应该使用括号来传递要打印的内容
Python 2.x 和 Python 3.x 之间重要的区别:
| 特点 | Python 2.x | Python 3.x |
|---|---|---|
| 整数除法 | 整数除法会截断小数部分,如5/2返回2 | 整数除法会产生浮点数结果,如5/2返回2.5 |
| Unicode | 不默认支持Unicode编码,需要使用u前缀 | 默认支持Unicode编码,字符串是Unicode字符串 |
| xrange() | 存在xrange()函数用于生成范围迭代器 | 移除xrange(),range()类似Python 2.x的xrange() |
| 输入函数 | 使用raw_input()获取用户输入 | 使用input()获取用户输入,移除raw_input() |
| 长整数 | 长整数自动转换为长整数类型 | 长整数和整数不再自动转换,需使用L后缀表示 |
读取键盘输入
Python提供了两个内置函数从标准输入读入一行文本,默认的标准输入是键盘。
str = raw_input("请输入:")
print "你输入的内容是: ", str
请输入:Hello Python!
你输入的内容是: Hello Python!
str = input("请输入:")
print "你输入的内容是: ", str
结果:
请输入:[x*5 for x in range(2,10,2)]
你输入的内容是: [10, 20, 30, 40]
打开和关闭文件
Python 提供了必要的函数和方法进行默认情况下的文件基本操作。用 file 对象做大部分的文件操作。
file object = open(file_name [, access_mode][, buffering])
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
buffering: 如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
| 模式 | 描述 |
|---|---|
| r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
| w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| 属性 | 描述 |
|---|---|
| file.closed | 返回true如果文件已被关闭,否则返回false。 |
| file.mode | 返回被打开文件的访问模式。 |
| file.name | 返回文件的名称。 |
| file.softspace | 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
fo = open("foo.txt", "w") # 打开一个文件
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace
以上实例输出结果:
文件名: foo.txt
是否已关闭 : False
访问模式 : w
末尾是否强制加空格 : 0
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
# 关闭打开的文件
fo.close()
以上实例输出结果:
文件名: foo.txt
fo = open("foo.txt", "w")
fo.write( "www.google.com!\nVery good site!\n")
fo.close()# 关闭打开的文件
$ cat foo.txt
www.google.com!
Very good site!
read()方法从一个打开的文件中读取一个字符串。fileObject.read([count])被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入;如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
fo = open("foo.txt", "r+")
str = fo.read(10)
print "读取的字符串是 : ", str
# 关闭打开的文件
fo.close()
以上实例输出结果:
读取的字符串是 : www.google
Python 是一种支持面向对象编程(OOP)的编程语言,具有以下面向对象特性:
类与对象:在 Python 中,一切皆为对象,包括整数、字符串、函数等。对象是类的实例,类是对象的模板。通过类定义,可以创建多个对象。
封装:Python 支持封装,即将数据和方法封装在类中。这可以限制对数据的直接访问,只允许通过类的方法进行操作,提高了数据的安全性。
继承:继承是面向对象编程的核心概念之一。Python 支持单继承和多继承。子类可以继承父类的属性和方法,并可以添加新的属性和方法,实现代码重用。
多态:多态是指不同对象可以对相同方法产生不同的响应。Python 中的多态性使得可以使用统一的接口处理不同类的对象,提高了代码的灵活性。
类和对象的成员:Python 的类和对象可以包含成员变量(属性)和成员函数(方法)。属性用于存储数据,方法用于执行操作。
访问控制:Python 使用命名约定来控制访问,包括公有成员(通常以小写字母开头)和私有成员(通常以双下划线开头)。
构造函数和析构函数:Python 支持构造函数 init 和析构函数 del,用于对象的初始化和资源的释放。
属性和方法的继承与覆盖:子类可以继承父类的属性和方法,也可以对其进行覆盖,以改变或扩展其行为。
| 特点 | 公有成员 | 私有成员 |
|---|---|---|
| 访问权限 | 外部和内部都可以访问 | 只能在类的内部访问,外部无法直接访问 |
| 封装 | 用于定义类的接口,供外部代码调用 | 用于隐藏类的实现细节,防止外部直接访问和修改内部状态 |
| 安全性 | 对外部访问较开放,可能导致数据意外修改或破坏 | 提供更高的安全性,只有类的内部方法可以访问,可以更好地控制数据修改 |
| 继承 | 可以被子类继承和访问 | 不能被子类继承,子类中不可见 |
| 编程实践 | 应包括类的接口,私有成员应包含实现细节 | 最小化公有成员的数量,提高封装性 |
面向对象编程(OOP)的Python实现
在Python中,定义类(Class)是一种方式来创建自定义数据类型,以包含属性(成员变量)和方法(成员函数)。以下是Python中定义类的具体规则和方法:
class MyClass:
# 类的定义
class MyClass:
def __init__(self, parameter1, parameter2):
self.parameter1 = parameter1
self.parameter2 = parameter2
class MyClass:
def __init__(self, parameter1, parameter2):
self.parameter1 = parameter1
self.parameter2 = parameter2
class MyClass:
def __init__(self, parameter1, parameter2):
self.parameter1 = parameter1
self.parameter2 = parameter2
def some_method(self):
# 方法的定义
obj = MyClass(parameter1_value, parameter2_value)
obj.parameter1
obj.some_method()
class ChildClass(ParentClass):
# 子类的定义
C++和Python在访友问私有成员和函数时的区别

C++和Python在访友问私有成员和函数时的区别
| 特点 | C++ | Python |
|---|---|---|
| 访问控制 | 使用访问修饰符(public、private、protected)控制成员的可见性。 | 没有明确的访问修饰符,依赖于命名约定。 |
| 私有成员 | 私有成员(private)只能在类的内部访问,外部无法直接访问。 | 以双下划线__开头的成员被认为是私有的,但仍允许访问。 |
| 友元函数 | 允许声明和定义友元函数,它们可以访问类的私有成员。 | Python没有友元函数的概念。 |
友元函数是C++中的一个概念,它允许一个函数访问一个类的私有成员,即使它不是该类的成员函数。
在Python中,方法(Method)是与类或对象相关联的函数。方法用于实现类的行为和操作,可以访问类的属性、修改属性的值,以及执行特定的操作。Python中的方法通常包括一个特殊的参数 self,该参数表示调用该方法的对象本身。方法有两种主要类型:
class MyClass:
def instance_method(self, arg1, arg2):
# 使用self来访问对象的属性
self.arg1 = arg1
self.arg2 = arg2
# 创建对象
obj = MyClass()
# 调用实例方法
obj.instance_method("Hello", "World")
class MyClass:
class_attr = 0 # 类属性
@classmethod
def class_method(cls):
cls.class_attr += 1
# 调用类方法
MyClass.class_method()
print(MyClass.class_attr) # 输出: 1
方法是类的一部分,用于实现类的行为。
类可以包含多个方法,这些方法定义了对象的操作和行为。
方法的定义方式类似于函数,但它们位于类的内部,并可以访问类的属性和其他方法。
类可以创建多个对象,每个对象都有相同的属性和方法,但可以具有不同的属性值。
Python中的方法就是类的成员函数。用于实现类的行为和操作。
在Python中,方法(Method)和函数(Function)是两个不同的概念
| 特点 | 函数(Function) | 方法 (Method) |
|---|---|---|
| 定义位置 | 在任何地方定义,不依赖于类或对象 | 在类的内部定义,与类或对象相关联 |
| 调用方式 | 直接调用,不需要通过对象 | 必须通过对象来调用,通常以 self 作为第一个参数 |
| 参数 | 可以接受任意数量的参数,包括没有参数 | 至少有一个参数(通常是 self),用于访问对象属性和数据 |
| 目的 | 通用的,不依赖于特定对象,用于执行一般任务 | 特定于类或对象,用于实现类的行为和操作 |
Python中的动态内存分配是通过内置的内存管理机制实现的,这包括垃圾回收和自动内存分配。Python的动态内存分配机制是一种自动化的、安全的方式来处理内存管理,程序员无需过多担心手动内存分配或释放,因为这些任务由Python的内存管理系统处理。Python中的动态内存分配的特点:
垃圾回收:Python使用垃圾回收器来自动管理内存。当对象不再被引用时,垃圾回收器会自动回收其内存以供其他用途。这减少了内存泄漏的风险。
引用计数:Python使用引用计数来跟踪对象的引用。当引用计数降为零时,垃圾回收器会释放对象的内存。这是一种快速回收内存的方法。
循环引用:Python垃圾回收器还能够处理循环引用,即两个或多个对象相互引用。在这种情况下,垃圾回收器会检测到它们之间的循环引用并及时释放内存。
自动内存分配:Python自动管理内存的过程使程序员不需要手动分配或释放内存。这降低了程序中内存相关错误的可能性。
动态增长:Python的内存管理系统还具有动态增长的能力,可以根据需要自动分配更多内存,而不需要手动管理内存大小。
Python和c语言在动态分配内存上的区别:
内存管理方式:
Python:Python使用自动内存管理,具体来说,它使用了垃圾回收机制。程序员通常不需要手动分配或释放内存。Python的垃圾回收器会自动追踪不再需要的对象并回收它们的内存,这降低了内存泄漏的风险。
C语言:C语言中需要显式地分配和释放内存。程序员需要调用malloc()分配内存和free()释放内存,这样的控制更直接,但也更容易出现内存泄漏和指针错误。
类型系统:
Python:Python是一门动态类型语言,变量的类型在运行时确定。这允许更大的灵活性,但也可能导致运行时类型错误。
C语言:C语言是静态类型语言,变量的类型在编译时确定。这提供了更严格的类型检查,有助于避免类型相关的错误。
指针和引用:
Python:Python中没有显式指针的概念,所有的变量都是对象的引用。这意味着在内存中通常存储的是对象的引用而不是对象本身。
C语言:C语言支持指针,允许直接访问内存地址。这提供了更多的控制,但也增加了出错的机会。
<calculate@njust.edu.cn>
## 1.3 数据类型 详细讨论Python的各种数据类型,包括其特性、用途和示例。 --- ## 1.4 数据结构 介绍Python的常见数据结构,如列表、元组、字典和集合,以及它们的操作和用法。 ---
## 1.9 Python 面向对象 <font size=3> Python从设计之初就已经是一门面向对象的语言,在Python中可创建一个类和对象。 | 术语 | 描述 | | ---------------- | ---------------------------------------------------------------------------------------------------- | | 类(Class) | 用于描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 | | 类变量 | 类变量在整个实例化的对象中是公用的,定义在类中且在函数体之外。通常不作为实例变量使用。 | | 数据成员 | 包括类变量和实例变量,用于处理类及其实例对象的相关数据。 | | 方法重写 | 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override)或方法的重写。 | | 局部变量 | 定义在方法中的变量,只作用于当前实例的类。 | | 实例变量 | 在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但在类的其他成员方法之外声明的。 | | 继承 | 一个派生类(derived class)继承基类(base class)的字段和方法,允许将派生类的对象作为基类对象对待。 | | 实例化 | 创建一个类的实例,即类的具体对象。 | | 方法 | 类中定义的函数,描述了对象可以执行的操作。 | | 对象 | 通过类定义的数据结构实例,包括两个数据成员(类变量和实例变量)和方法。 | </font> --- ## 1.9 Python 面向对象 --- ## 1.9 Python 面向对象 --- ## 1.9 Python 面向对象 --- ## 1.9 Python 面向对象 --- ## 1.9 Python 面向对象 --- ## 1.9 Python 面向对象 ---