Python学习从0开始——001
一、环境
不用在本地部署,使用InsCode,刚开始能简单就简单
然后点击开发新项目
选中Python模板之后点击创建,然后进入开发界面
然后等待创建,大概一两分钟。进入初始界面,直接点击运行按钮,会在右侧终端输出。
二、测试用例
百度一下,使用文心一言提供一个demo,然后加了一些注释,可以将以下代码直接放进main.py运行。
import unittest
# 测试方法
def add_numbers(a, b):
return a + b
# 继承自 unittest.TestCase。unittest 是Python的标准库中的一个模块,用于编写和运行测试用例
class TestAddNumbers(unittest.TestCase):
# unittest框架的一个约定,任何以 test_ 开头的方法都会被识别为一个测试方法
# 断言(Assertion)是一种调试手段,用于在代码中设置检查点
# 确保程序在某一特定点满足某些预期条件。
# 如果条件不满足,程序会抛出一个AssertionError异常
def test_add_positive_numbers(self):
result = add_numbers(2, 3)
self.assertEqual(result, 5)
# self是一个对当前实例(即对象)的引用。
# 当你定义一个类的方法时,第一个参数总是self,它代表类的实例对象本身。
# 通过这个self参数,你可以访问该实例的属性或其他方法
def test_add_negative_numbers(self):
result = add_numbers(-2, -3)
self.assertEqual(result, -5)
# 检查当前模块是否作为主程序运行(而不是被导入为模块)
# 如果是,它会调用 unittest.main() 来运行所有的测试用例
if __name__ == '__main__':
unittest.main()
终端完整的输出:
三、疑问与解答
3.1、Python中的断言是什么意思,在Java中有没有类似的概念
在Python中,断言(Assertion)是一种调试手段,用于在代码中设置检查点,确保程序在某一特定点满足某些预期条件。如果条件不满足,程序会抛出一个AssertionError异常。断言通常用于在开发和测试阶段捕获程序中的错误,但在生产环境中,由于性能考虑,断言可能会被禁用。
在Java中,虽然没有Python中那样的assert关键字,但是Java也提供了断言机制。Java的断言是通过assert关键字实现的,但默认情况下,断言是禁用的。要启用断言,需要在启动JVM时使用-ea或–enableassertions选项。
3.2、Python与Java的import区别与共性
1.共性:
- 引入模块/类/函数:都用于引入其他模块或包中的类、函数或变量,以便在当前文件中使用。
- 避免命名冲突:当多个模块或包中包含相同名称的类、函数或变量时,通过重命名可以避免命名冲突。
2.区别:
-
语法差异:
- Python直接使用
import module_name
来导入整个模块,或使用from module_name import function_name
来导入特定函数。 - Java通常需要指定完整的包路径,如
import package_name.ClassName;
。
- Python直接使用
-
静态与动态导入:
- Java的导入是静态的,即必须在源代码中明确指定要导入的类或接口。这有助于在编译时检查类型正确性。
- Python的导入可以是动态的,可以在运行时根据条件或需求导入模块。这提供了更大的灵活性,但也可能增加代码的复杂性。
-
包和模块组织:
- Java中的包(package)和Python中的模块(module)在组织和结构上有所不同。Java的包结构通常与文件系统的目录结构相对应,而Python的模块可以放在任何位置,并通过模块搜索路径来找到。
-
通配符导入:
- Python支持通配符导入,如
from module_name import *
,这会将模块中的所有公共对象导入到当前命名空间中。然而,这种导入方式通常被认为是不良实践,因为它可能导致命名冲突和代码可读性下降。 - Java不支持通配符导入,每个类或接口都需要单独导入。
- Python支持通配符导入,如
-
访问级别:
- 在Java中,访问级别(如public、private、protected等)对导入有影响。只有public类和接口才能被其他包中的类访问和导入。
- 在Python中,没有类似的访问级别控制导入。但模块内部的属性和方法可以通过下划线前缀(如
_private_method
)来约定为“私有”的,尽管这只是一个约定,并不强制执行。
-
编译与解释:
- Java是一种编译型语言,
import
语句在编译时解析,确保所有依赖项都已正确导入。 - Python是一种解释型语言,
import
语句在运行时解析。这意味着Python可以在运行时动态地加载和执行模块。
- Java是一种编译型语言,
3.3、Python与C中的def差别
-
语法:
- 在Python中,定义函数使用
def
关键字,其一般格式如下:def 函数名(参数列表): 函数体
。Python中的函数定义相对简洁明了,没有C语言中的函数声明和严格的顺序限制。 - C语言定义函数需要声明,一般格式如下:
类型 函数名(参数列表) { 函数体; }
。C语言中的函数需要在调用之前被实现或者在程序开头事先声明,否则会出现编译错误。
- 在Python中,定义函数使用
-
函数参数的处理方式:
- Python中的函数参数可以更加灵活。Python支持默认参数,即给参数设置默认值,这样在调用函数时可以不传入该参数的值。此外,Python还提供了可变参数和关键字参数,这大大增强了函数的功能性和灵活性。
- C语言中的函数参数则相对固定,每个参数都需要在函数定义时明确指定,且没有默认参数的概念。在调用函数时,必须按照定义的顺序和类型传递参数。
-
函数的使用灵活性:
- Python中的函数还支持嵌套定义,即在一个函数的函数体中可以定义另一个函数。嵌套的函数可以访问外部函数的变量,但外部函数不能访问内部函数的变量。此外,Python还有高阶函数的概念,即函数名也可当作函数参数,这种写法可以大大减少代码长度。
- 在C语言中,函数的定义和使用则相对固定,没有嵌套定义和高阶函数的概念。
3.4、Python和Java的class区别
- Python的class:
Python是一种面向对象的编程语言,因此它支持class的概念。Python的class允许你定义属性和方法,通过封装、继承和多态等特性实现代码的重用和组织。
Python的class还有类特性property,用于对实例方法的属性进行特殊控制。
Python的class还支持动态类型,变量的类型在赋值时确定,不需要在定义变量时声明类型。 - Java的class:
Java是一种纯面向对象的编程语言,因此class是其核心概念之一。Java的class定义了对象的属性和方法,是实现面向对象编程的基础。
Java的class有严格的访问修饰符,可以控制属性和方法的可见性。
Java是静态类型语言,变量在定义时必须声明类型,且在运行时不能修改。
3.5、Python、C和Java在if的区别
- Python的if语句:
Python的if语句用于条件判断,其语法相对简洁,不需要在语句末尾添加分号。
Python使用缩进来划分语句块,而不是使用大括号。 - C的if语句:
C语言的if语句也用于条件判断,但其语法与Python不同。C语言的if语句末尾需要添加分号,且使用大括号来划分语句块。 - Java的if语句:
Java的if语句同样用于条件判断,其语法与C语言类似。Java的if语句末尾也需要添加分号,同样使用大括号来划分语句块。
四、代码解释与修改测试
4.1、if name == ‘main’
if __name__ == '__main__':
unittest.main()
能看出来这是一个if的判断语句,问题在_name_
是什么?
_name_
是一个内置变量,它表示当前模块的名字。当一个Python文件(模块)被直接运行时,_name_
的值会被设置为 __main__
。如果这个文件被导入为一个模块,_name_
的值则会被设置为该模块的名字(即不带 .py 后缀的文件名)。
所以该语句的作用是:做出判断,如果当前文件是作为主程序运行,则执行下面的代码块。如果文件被导入为模块,则不执行。
4.2、测试断言
修改负数相加的方法,将-5改为5
def test_add_negative_numbers(self):
result = add_numbers(-2, -3)
self.assertEqual(result, 5)
终端输出:
输出很详细,那么如果由程序来捕获异常并处理,可以继续做如下修改:
def test_add_negative_numbers(self):
result = add_numbers(-2, -3)
try:
# 尝试执行断言
self.assertEqual(result, 5)
# 如果断言成功,打印正确信息
print("断言正确: The sum of -2 and -3 is correctly -5.")
except AssertionError as e:
# 如果断言失败,捕获异常并打印错误信息
print("断言失败:", str(e))