本文是我 Agent 开发学习路线的 Python 基础阶段笔记,后续会持续更新 Agent 相关的进阶内容,欢迎关注我的专栏「Agent 学习」一起进步。

Python 入门到进阶完整学习笔记 | 基础语法 + 容器 + 函数 + 面向对象

本文整理了 Python 从环境搭建、基础语法、流程控制、五大数据容器、函数、面向对象、异常处理、模块与包全套入门知识点,包含大量实操代码、经典案例、易错点与开发快捷键,适合零基础自学、复习、面试复盘使用。

Python启航

初识

荷兰计算机科学家吉多·范罗苏姆(龟叔)在1991年发布的编程语言

环境准备

解释器
  • Python官网:https://www.python.org/
  • 在python解释器,退出到windows:exit()
  • 一次性执行多行python代码,将多行python代码定义在一个文件中(hello.py),然后用python命令运行:python xxx.py(先切换到指定目录)
  • 编写程序,英文符号
开发工具
  • IDE:集成开发工具
  • Shift+alt+句号 调大字体
  • Shift+alt+逗号 调小字体
入门程序
  • 注释:#
  • 快捷键:ctrl+/
  • Python中使用;作为语句分隔符,使用换行符作为终止符
剖析—目录结构
  • .idea文件:保存项目的配置信息
  • .venv文件:虚拟环境,保存项目的环境信息
    • 通过虚拟的运行.venv,可以保证每个Python项目都在一个相对独立的隔离环境中运行,项目与项目之间互不影响
剖析—配置

设置->外观与行为

Python核心语法

数据存储与运算

字面量与变量
字面量
  • 程序中直接书写的固定值
  • 在这里插入图片描述
变量
  • 程序中用来存储单个数据的容器

  • 变量是指存储数据的容器(空间),而不是其中存储的数据

    • Python是动态类型语言,在程序运行时才进行检查,变量的类型可以在程序运行过程中改变(一个变量可以接收不同类型的值)
  • 定义格式:变量名 = 变量的值

  • 连续赋值:a,b = 1,‘‘python’’

标识符
  • 字母数字下划线
  • 不能以数字开头
  • 不能使用关键字
  • 严格区分大小写
    • true合法 True非法(因为是关键字)
  • 命名规范
    • 见名知意
    • 多部分使用下划线连接:(蛇形命名法):update_time
    • 英文字母全小写
    • PEP8:代码规范文档指南
常见数据类型

在这里插入图片描述

  • 变量本身没有类型,type(变量)输出的类型时变量中存储的数据的类型
  • type(要查看类型的数据)
  • isinstance(数据,类型) # True False
字符串
  • 字符:是文本世界的基本单位,也是字符串的基本组成单位

  •   # 定义字符串的三种方式
      s1 = "string"
      s2 = 'python'
      # 英文缩写要转义
      msg = 'It\'s very good'
      # 上面两种不支持换行,要做字符串的拼接
      s3 = """
      hello:
          欢迎学习
          卡基地和hi火车
      """ #多行字符串
      print(s1)
      print(type(s1))
    

在这里插入图片描述

字符串拼接

在这里插入图片描述

  • [!CAUTION]

    +号可以用来拼接两个字符串,但是无法将非字符串与字符串进行拼接(非字符串需要转换为字符串类型)

  • str(int数字)->str(age) 将int类型的数字转为字符串

字符串格式化

%占位符

在这里插入图片描述

注意:前面有多少个占位符(%s),后面就需要有多少个变量(或数据),前后数量要一致

f”内容{变量/表达式}”

在这里插入图片描述

输入与输出

在这里插入图片描述

[!CAUTION]

无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型

name = input("请输入您的姓名:")
print(f"您的姓名是{name}")
age = input("请输入您的年龄:")
print(f"您的年龄是{age}")

在这里插入图片描述

运算符
  • 算术运算符

    • 在这里插入图片描述

    •   y = float(input("y:"))
      
    • 精度损失:由于计算机底层是基于二进制进行数据的存储与处理,二进制是无法准确的表示所有的小数,因此涉及到浮点数的运算,可能损失精度

  • 赋值运算符

    • 在这里插入图片描述

    • 有浮点数参与运算,答案也是浮点数,哪怕是整除//

  • 比较运算符

    • 在这里插入图片描述
  • 逻辑运算符

    • 在这里插入图片描述

数据的逻辑处理—流程控制语句

条件判断
基本格式

在这里插入图片描述

进阶

在这里插入图片描述

在这里插入图片描述

  • if语句的嵌套
  • pass是一个空语句,起到一个语法占位的作用
模式匹配

match…case

在这里插入图片描述

在这里插入图片描述

循环
while

在这里插入图片描述

在这里插入图片描述

for
msg = input("请输入要遍历的字符串:")
for s in msg:
    print(f"元素{s}")
else:
    print("结束")

在这里插入图片描述

range

在这里插入图片描述

嵌套循环
  • shift+回车(enter) 快速回车

  • print(“*”):print自带换行效果,每一次执行都会输出新的一行中

  • print(“*”,end=“ ”):end表示的是每一次输出以什么结束;默认\n,表示换行,不想换行就为空字符串

  •   m = int(input("长度:"))
      n = int(input("宽度:"))
      for j in range(n):
          for i in range(m):
              print("*",end=" ")
          print()
    
# 打印99乘法表
for i in range(1,10): # 外层循环,控制行
    for j in range(1,i+1): # 内层循环,控制列
        print(f"{j} x {i} = {j*i}",end="\t")
    print()
  • break:只能出现在循环中,表示跳出循环的含义(break跳出循环时,while后面else中的代码不会执行)
  • continue:只能出现在循环中,表示中断本次循环,直接进入下一次循环

在这里插入图片描述

数据存储容器

列表(list)

在这里插入图片描述

  • 注意:如果指定的索引超出范围,索引报错

  • 有序:输入和取出值的大小一致

在这里插入图片描述

切片

在这里插入图片描述
在这里插入图片描述

常见方法

内置的常见功能(添加元素\删除元素\排序等)

在这里插入图片描述

案例

在这里插入图片描述

  • 解包

在这里插入图片描述

  • 推导式
s1 = [i**2 for i in range(1,21)]
print(s1)

s = [12,15,48,96,88,36,77,91,53,11]
s1 = [i**2 for i in s if i%2==0]
print(s1)

# 去重
# for num in s:
#     if num not in s3:
#      s3.append(num)
# print(s3)

在这里插入图片描述

字符串(str)
  • 基本操作

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 常用方法

在这里插入图片描述

  • 案例

在这里插入图片描述

if mail.count("@")==1 and "." in mail:
# 回文
s = input("输入一个字符串:")
s_reverse = s[::-1]
print(s_reverse==s)

#反转后大写后输出
lst = []
for i in range(0,10):
    s = input("请输入字符串:")
    s_reverse = s[::-1]
    s_reverse = s_reverse.upper()
    lst.append(s_reverse)
for i in lst:
    print(i,end=" ")
元组(tuple)
  • 基本操作

在这里插入图片描述

在这里插入图片描述

  • 组包与解包

在这里插入图片描述

a = 10
b = 20
#a,b = b,a
# 组包
t = b,a
# 解包
a,b = t
print(a,b)

在这里插入图片描述

  • 案例
集合(set)
  • 基本操作

无序,不可重复,可修改的数据容器

空集合:

s = set()
print(s)
print(type(s))

[!CAUTION]

空集合的定义不可以使用{},{}表示的是空字典,由于集合是无序的,因此不支持下标索引访问

在这里插入图片描述
在这里插入图片描述

  • 案例

在这里插入图片描述

字典(dict)

里面存储的是==键值对(key:value)==类型的数据,可以根据键(key)找到对应的值(value)

字典定义

在这里插入图片描述

  • key不能重复,如果重复,后面的值会覆盖掉前面的值

  • key必须是不可变类型(str,int ,float,tuple),不能是list,set,dict

在这里插入图片描述

常用操作

在这里插入图片描述

  • 遍历

  •   # 遍历
      for k in dict1.keys():
          print(f"{k}:{dict1[k]}")
      
      for item in dict1.items():
          print(f"{item[0]}:{item[1]}")
      
      for k,v in dict1.items():
          print(f"{k}:{v}")
    

在这里插入图片描述

案例

在这里插入图片描述

  • 同时进行列编辑:alt+shift+列
总结

在这里插入图片描述

在这里插入图片描述

函数

Python内置函数:

  • 提前定义好的
  • 可以重复使用
  • 实现特定功能
函数基础
函数定义

在这里插入图片描述

  • 函数定义的时候并不会执行,只有在调用的时候,函数体的逻辑才会执行
  • 函数必须先定义,后调用

在这里插入图片描述

函数的参数与返回值

在这里插入图片描述

  • 如果返回值有多个,多个返回值之间逗号分隔,多个返回值会封装到元组中

  • 保留一位小数

    round(2*3.14*r,1)
    
  • 解包操作

  •   def circle_area_len(r):
          return 3.14*r*r,round(2*3.14*r,1)
      a,l = circle_area_len(10)
      print(a)
      print(l)
    

在这里插入图片描述

函数说明文档

在这里插入图片描述

函数的嵌套调用

在这里插入图片描述

案例

在这里插入图片描述
在这里插入图片描述

  • 回文:用切片

    reverse_s = s[::-1]
        return s == reverse_s
    
函数进阶
函数变量的作用域

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

函数参数详解
  • 传参方式
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 默认参数

    在这里插入图片描述

    跳过一个默认参数,后面的默认参数要使用关键字参数指定传入(默认是位置参数)

  • 不定长参数

    在这里插入图片描述

    这里*agrs只封装 位置参数 ,关键字参数不会封装到元组里面

    元组保留一位小数:round(参数,保留小数个数)

    在这里插入图片描述

    **kwargs封装 关键字参数 为字典

    在这里插入图片描述

  • 参数类型

    在这里插入图片描述

匿名函数

在这里插入图片描述

在这里插入图片描述

  • reverse=false(默认)

在这里插入图片描述

案例

在这里插入图片描述

  • 递归调用:函数中自己调用自己的情况(先层层递进,再逐层回归)一定要有终结点

在这里插入图片描述

在这里插入图片描述

类型注解
基本介绍

在这里插入图片描述

在这里插入图片描述

  • 类型注解只是起到语法提示作用,并不会影响程序运行的结果
    在这里插入图片描述
函数类型注解

在这里插入图片描述

模块

在这里插入图片描述

导入模块

在这里插入图片描述

在这里插入图片描述

自定义模块
  • 常量:名字全大写

  • 字符串重复输出:(‘’-‘’ * 30)重复输出30次

  • 导入模块会输出被导入模块的测试代码(print()语句)

  • __ name __ :Python中的内置变量,表示的当前模块的名字(直接运行当前模块,__ name__ 的值为’'__ main __ ‘’(字符串),当该模块被导入时,__ __ name __的值就是模块名称)

    • 执行当前文件,则会执行如下代码,如果被当作模块导入,则如下代码不执行

      在这里插入图片描述

  • ctrl+y直接删除一行

在这里插入图片描述

在这里插入图片描述

软件包(package)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

# 如果要通过from utils import * 导入包下的所有模块,需要__init__.py 文件中添加__all__=[]
"""
__all__ = [
    "my_fun",
    "my_var"
]
"""
from utils import *
my_var.log_separator2()
print(my_fun.PI)
# 相对路径:从当前文件所在目录开始查找
# from utils.my_var import log_separator3

# 绝对路径:从项目的根目录下开始查找
from 第二章.utils.my_var import log_separator3

log_separator3()

在这里插入图片描述

面向对象基础

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

类与对象

在这里插入图片描述

  • 动态添加属性:不推荐
  • 推荐:
class Car:
    # __init__ 方法是初始化的方法,会在对象创建时自动调用,可以在该方法中为对象设置对应的属性
    # self:是第一个参数,表示当前所创建出来的实例对象
    def __init__(self,c_color,c_brand,c_name,c_price):
        # self.属性=参数值
        self.color=c_color
        self.brand=c_brand
        self.name=c_name
        self.price=c_price
        print("初始化完毕")

# 创建对象
c1 = Car("红色","BMW","x7",800000)
print(c1.__dict__)

在这里插入图片描述

实例方法

在这里插入图片描述

魔法方法

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实例属性与类属性

在这里插入图片描述

  • 通过实例对象,查找属性时,会先查找实例属性;实例属性不存在,再查找类属性
  • 实例属性:属于单个对象,每个对象独有;类属性:属于类,被所有实例对象共享
案例

在这里插入图片描述
在这里插入图片描述

异常

常见异常类型

常见的有这些:

ZeroDivisionError     # 除数为 0
IndexError            # 下标越界
KeyError              # 字典 key 不存在
NameError             # 变量名不存在
TypeError             # 类型错误
ValueError            # 值错误
FileNotFoundError     # 文件不存在
AttributeError        # 对象没有这个属性或方法
ImportError           # 导入模块失败

举几个例子:

# KeyError
d = {"name": "Tom"}
print(d["age"])
# TypeError
print("年龄:" + 18)
# ValueError
num = int("abc")

注意区分 TypeErrorValueError

int([1, 2, 3])   # TypeError,类型不合适
int("abc")       # ValueError,类型是字符串没问题,但值不能转成整数

try…except 基本用法

格式:

try:
    可能出错的代码
except 异常类型:
    出错后的处理代码

例子:

try:
    a = int(input("请输入一个数字:"))
    print(10 / a)
except ZeroDivisionError:
    print("除数不能为 0")
except ValueError:
    print("请输入合法数字")

如果用户输入 0,会进入:

except ZeroDivisionError

如果用户输入 abc,会进入:

except ValueError

捕获多个异常

可以分开写:

try:
    x = int(input("请输入数字:"))
    print(10 / x)
except ValueError:
    print("输入的不是数字")
except ZeroDivisionError:
    print("不能除以 0")

也可以合并写:

try:
    x = int(input("请输入数字:"))
    print(10 / x)
except (ValueError, ZeroDivisionError):
    print("输入有问题")

分开写的好处是可以针对不同错误给不同提示。


捕获异常对象 as e
try:
    print(10 / 0)
except ZeroDivisionError as e:
    print("发生错误:", e)

输出:

发生错误: division by zero

e 就是异常对象,里面保存了错误信息。


Exception:捕获大多数异常
try:
    x = int(input("请输入数字:"))
    print(10 / x)
except Exception as e:
    print("程序出错:", e)

Exception 是很多常见异常的父类,可以捕获大多数普通错误。

但是不建议一上来就无脑写:

except Exception:
    pass

因为这会把错误隐藏掉,程序出问题你也不知道。

比如:

try:
    result = 10 / 0
except Exception:
    pass

程序不会报错,但你也不知道它其实失败了。


else:没有异常时执行
try:
    x = int(input("请输入数字:"))
except ValueError:
    print("输入错误")
else:
    print("转换成功:", x)

else 的意思是:try 里面没有发生异常,才执行。

更完整一点:

try:
    x = int(input("请输入除数:"))
    result = 10 / x
except ValueError:
    print("请输入数字")
except ZeroDivisionError:
    print("不能除以 0")
else:
    print("结果是:", result)

finally:不管有没有异常都执行
try:
    f = open("test.txt", "r", encoding="utf-8")
    content = f.read()
except FileNotFoundError:
    print("文件不存在")
finally:
    print("程序结束")

finally 常用于释放资源,比如关闭文件、关闭数据库连接、释放锁等。

更常见的是:

f = None

try:
    f = open("test.txt", "r", encoding="utf-8")
    content = f.read()
    print(content)
except FileNotFoundError:
    print("文件不存在")
finally:
    if f:
        f.close()

不过实际开发中,文件处理更推荐用:

with open("test.txt", "r", encoding="utf-8") as f:
    content = f.read()

with 会自动关闭文件,比 finally 更方便。


raise:主动抛出异常

有时候不是 Python 自动报错,而是你自己判断不合法,然后主动抛异常。

def set_age(age):
    if age < 0:
        raise ValueError("年龄不能小于 0")
    print("年龄是:", age)

set_age(-1)

会报:

ValueError: 年龄不能小于 0

这在函数参数校验里很常见。

比如:

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError("除数不能为 0")
    return a / b

自定义异常

可以自己定义异常类,通常继承 Exception

class AgeError(Exception):
    pass


def set_age(age):
    if age < 0 or age > 150:
        raise AgeError("年龄范围不合法")
    print("年龄设置成功")


try:
    set_age(200)
except AgeError as e:
    print("年龄错误:", e)

输出:

年龄错误: 年龄范围不合法

自定义异常常用于大型项目中,让错误类型更清晰。

比如:

class LoginError(Exception):
    pass

class PermissionError(Exception):
    pass

class BalanceNotEnoughError(Exception):
    pass

这样看到异常名字,就知道业务出错原因。


异常的执行流程

看这个例子:

try:
    print("1")
    print(10 / 0)
    print("2")
except ZeroDivisionError:
    print("3")
finally:
    print("4")

print("5")

输出:

1
3
4
5

解释:

print("1")      # 正常执行
print(10 / 0)  # 出错,跳到 except
print("2")      # 不执行
except          # 捕获异常,输出 3
finally         # 一定执行,输出 4
后续代码继续执行,输出 5

异常处理的常见写法
写法一:用户输入校验
while True:
    try:
        age = int(input("请输入年龄:"))
        break
    except ValueError:
        print("输入错误,请输入整数")

print("你的年龄是:", age)
写法二:读取文件
try:
    with open("data.txt", "r", encoding="utf-8") as f:
        data = f.read()
except FileNotFoundError:
    print("文件不存在")
except PermissionError:
    print("没有权限读取文件")
写法三:网络请求、数据库操作
try:
    # 连接数据库
    # 查询数据
    pass
except Exception as e:
    print("操作失败:", e)
finally:
    # 关闭连接
    pass
总结
try:
    可能出错的代码
except 错误类型:
    出错后的处理
else:
    没出错时执行
finally:
    不管出不出错都执行

本篇覆盖 Python 零基础核心语法、数据容器、函数、面向对象、异常处理、模块包,是入门必备全套知识点,建议多敲代码练习案例,吃透基础再进阶爬虫 / 数据分析 / 后端等方向。

更多推荐