本系列旨在快速掌握Python,实现能够快速阅读和理解 Python 代码,并在可查阅语法的情况下进行 AI 学习。
本篇先了解一下Python基础知识。
本篇内容较菜鸟教程有所删减、方便快速构建大纲,且加入了PEP 8规范说明等有助于理解和编写代码的说明。
因为是Java程序员视角学习Python,所以会有一些与Java的比较。
目录
- 资料推荐
- Python格式规范
- 编码
- PEP 8规则
- 标识符
- 注释
- 缩进(Python怎么写)
- Python关键字
- Python核心语法
- 变量与数据类型
- 基本类型
- 迭代器
- 类型转换
- 控制流
- 函数
- 定义函数
- 参数传递机制
- 装饰器
- 异常处理
- 语法
- with
- 自定义异常
- 掌握测试-使用Python来解leetcode
资料推荐
菜鸟教程
《python入门到实践》
Python格式规范
编码
默认情况下,Python3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。
PEP 8规则
Python官方的规范PEP 8。
里面有各种规范,这里简单介绍一下命名规范。
-
变量
不要使用I、O字符作为单个字符变量名。
常量为大写字母+下划线。 -
模块名
模块名全小写,下划线分割。 -
类名
类名CapWords规范,即同Java一样首字母大写。
异常类后缀使用Error。 -
函数名
小写+下划线。
实例方法第一个参数用self。
类方法第一个参数用cls。
使用下划线优于缩写。 -
前导线_约定
公开属性不应有前导下划线_
仅对非公共方法和实例变量使用一个前导下划线_
使用双前导下划线__命名可能与设计为子类的类中的属性发生冲突的属性。
标识符
- 第一个字符必须以字母(a-z, A-Z)或下划线 _ 。
- 标识符的其他的部分由字母、数字和下划线组成。
- 标识符对大小写敏感,count 和 Count 是不同的标识符。
- 标识符对长度无硬性限制,但建议保持简洁(一般不超过 20 个字符)。
- 禁止使用保留关键字,如 if、for、class 等不能作为标识符。
注释
#!/usr/bin/python3# 第一个注释
# 第二个注释'''
第三注释
第四注释
'''"""
第五注释
第六注释
"""
print ("Hello, Python!")
缩进(Python怎么写)
python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
缩进一致默认为同一个代码快,使用反斜杠\可以实现多行语句。
Python换行不需要使用分号;来标识结束。
Python关键字
python关键字可以使用下列代码打印出来。
import keywordprint(keyword.kwlist)
[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]
Python核心语法
变量与数据类型
字符串、数字、列表、元组、字典、集合(重点:列表和字典,类似Java的List和Map)。
基本类型
python的变量不需要声明,类型在运行时自动推断,且可随时改变。即动态类型特征。
x = 10
# 整数转换成字符串
x = "hello"
Java10+开始支持var关键字,支持局部变量类型推断,但是不同的是Java的var声明后类型不可以更改。
类型可以随时更改,但是内容不一样。
Python3 的六个标准数据类型中:
- **不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
- **可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
不可变immutable的类型一旦创建,内部内容不可修改,修改操作实际上是创建了一个新的对象。
a = "hello"
a += " world" # 实际是新建了一个字符串对象,a 指向新对象
可变mutable的类型内部内容可直接修改,而对象本身(内存地址)不变。
- Tuple示例
元组中的元素类型也可以不相同。有序。
tuple = ( 'abcd', 786 , 2.23, 'runoob', 70.2 )
- List示例
和Java不一样,Python的List可存放任意类型(动态类型),运行时动态推断,无编译时类型约束。
Java的List存Object是编译时类型擦除,需要保证是Object子类,没有Python的灵活。
Python的List是有序的。
list = [ 'abcd', 786 , 2.23, 'runoob', 70.2 ] # 定义一个列表
- Dictionary示例
字典是无序的对象集合。键值对。
tinydict = {'name': 'runoob','code':1, 'site': 'www.runoob.com'}
- Set示例
Python 中的集合(Set)是一种无序、可变的数据类型,用于存储唯一的元素。
sites = {'Google', 'Taobao', 'Runoob', 'Facebook', 'Zhihu', 'Baidu'}
迭代器
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
list = [1,2,3,4]
# 通过iter方法创建迭代器对象
it = iter(list)
# 使用next()方法获取元素
print(next(it))
类似Java需要实现Iterator接口的hasNext()与next(),Python一个类需要作为迭代器使用需要在类中实现__iter__()与__next__()方法。
类型转换
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数 | 描述 |
---|---|
int(x [,base]) | 将x转换为一个整数 |
float(x) | 将x转换到一个浮点数 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s) | 将序列 s 转换为一个元组 |
list(s) | 将序列 s 转换为一个列表 |
set(s) | 转换为可变集合 |
dict(d) | 创建一个字典。d 必须是一个 (key, value)元组序列。 |
frozenset(s) | 转换为不可变集合 |
chr(x) | 将一个整数转换为一个字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
函数转换为显示转换。 |
在隐式类型转换中,Python 会自动将一种数据类型转换为另一种数据类型,不需要我们去干预。
在使用上,Python的隐式类型转换和Java的自动类型转换效果一样。
即较小类型转换成较大类型以避免精度丢失,如int转double。
都不允许使用不安全活不合理的转换,如字符串直接转数字。
两者在使用上差别为Python支持布尔值转换,布尔值在算术中隐式转为int(True为1,False为0)。
Java不支持布尔值转换,有限转换类型为byte → short → int → long → float → double。
控制流
if、for、while(Python的循环比Java简洁,注意缩进)。
- if
if condition_1:statement_block_1
elif condition_2:statement_block_2
else:statement_block_3# python3.10新增 match...case 类似Java switch case
match subject:case <pattern_1>:<action_1>case <pattern_2>:<action_2>case <pattern_3>:<action_3>case _:<action_wildcard> # _ 可以匹配一切。 类似default
- for
python提供了for…else写法,else在for结束后执行一次。相当于与finally
for <variable> in <sequence>:<statements>
else:<statements>
- while
python提供了while…else写法,else执行一次。想当于while+if else
while 判断条件(condition):执行语句(statements)……while counter <= n:sum = sum + countercounter += 1# 或者
while <expr>:<statement(s)>
else:<additional_statement(s)>
Python的continue和break与Java使用相同。
函数
定义、参数(默认参数、可变参数)、lambda表达式。
定义函数
可以使用def关键字定义一个完成函数。
![[Pasted image 20250414133812.png]]
也可以使用lambda来创建一个匿名函数,一般是简单的、单行的函数,通常在需要函数作为参数传递的情况下使用。
lambda arguments: expression
# 无参
f = lambda: "Hello, world!"
print(f()) # 输出: Hello, world!
# 有参
x = lambda a, b : a * b
print(x(5, 6))
lambda 函数通常与内置函数如 map()、filter() 和 reduce() 一起使用,以便在集合上执行操作。例如:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # 输出: [1, 4, 9, 16, 25]
参数传递机制
Java严格采用值传递(Pass by Value),对象类型传递引用的副本。因此,Java函数内修改传递的值不会修改原值,通过传递的引用修改对象内容会影响原对象,将引用副本指向新的对象不会影响原应用。
Python的参数传递与Java一致。不可变对象表现为值传递,可变对象表现为“传递引用副本”。
装饰器
装饰器(decorators)是 Python 中的一种高级功能,它允许你动态地修改函数或类的行为。
![[Pasted image 20250414140726.png]]
类似于Java的注解。
多个装饰器堆叠在一起,从下到上⬆️顺序依次应用。
异常处理
语法
语法try-except(类似Java的try-catch)。
def test_func():while True:try:x = int(input("请输入一个数字: "))breakexcept ValueError as err:print("您输入的不是数字,请再次尝试输入!")test_func()
和Java一样,一个try可以对应多个except。
语法try/except…else。else 子句放在最后,将在 try 子句没有发生任何异常的时候执行。
try-finally 语句。和Java的finally一样,是否发生异常都将执行最后的代码。
Python 使用 raise 语句抛出一个指定的异常。
raise [Exception [, args [, traceback]]]# 使用raise抛出异常
x = 10
if x > 5:raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
仅使用raise关键字相当于直接抛出。
with
Python的with关键字类似Java的 try-with-resources 。语法如下:
# 文件操作(自动关闭)
with open('file.txt', 'r') as file:data = file.read()# 文件会在代码块结束后自动关闭,即使发生异常
类似的是Java使用try-with-resources 需要类实现了AutoCloseable接口,而Python的需要实现__enter__ 和 exit。
自定义异常
异常类需要继承Exception。
class MyError(Exception):def __init__(self, value):self.value = valuedef __str__(self):return repr(self.value)
大多数的异常的名字都以"Error"结尾,就跟标准的异常命名一样。这里类继承相关件后续Python面向对象篇章。
掌握测试-使用Python来解leetcode
每天用Python刷两道简单LeetCode维持手感。
下篇[Python基础速成]2-模块与包与OOP