实践Python

安装

python

基础

python程序文件

.py结尾,文件头如下:

1
2
#!/usr/bin/env python
# -*- coding: utf-8 -*-

或

1
2
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

区分大小写

入口

场景 入口
普通 Python 脚本 if __name__ == "__main__": main()
Python 包 __main__.py,使用 python -m 包名
命令行工具 main() + argparse(或 click、typer)
Web 服务(Flask/FastAPI/Django) 通常由框架启动命令(如 uvicorn、gunicorn、manage.py)调用应用入口,而不是直接执行业务代码

变量

动态类型,变量的类型有赋值的数据类型决定,且是可以改变的。

1
2
a = 12
a = '12'

常量一般使用全大写命名

类变量和实例变量

对比项 类变量 实例变量 局部变量
定义位置 类中、方法外,a=1 方法内通过 self.xxx 定义,self.b =2 方法内,c=3
属于谁 类对象 实例对象 方法
是否共享 所有实例共享一份 每个实例独立一份 否
访问方式 Person.var 或 obj.var obj.var 方法内
修改影响 修改类变量会影响所有未遮蔽它的实例 只影响当前实例 方法内
典型用途 配置、常量、计数器、共享状态 姓名、年龄、余额等每个对象独有的数据 方法内临时计算

一句话记忆:

  • 类变量 = 整个班级共用的一块黑板。
  • 实例变量 = 每个学生自己的笔记本。

黑板上的内容所有人都能看到;每个人笔记本上的内容互不影响。

self

  • self 不是关键字,只是一个普通参数名。
  • Python 会在调用实例方法时,自动把当前对象作为第一个参数传给它。
  • 通过 self,方法可以访问和修改当前对象的实例变量(如 self.name),也可以调用当前对象的其他方法(如 self.hello())。

可以记住一句话:

类是”图纸”,对象是”房子”,self 就是”这栋房子自己的地址”。方法通过 self 才知道该操作哪一栋房子。

name

文件直接运行:__name__ == "__main__"

文件被 import 导入:__name__ == 模块名

**kwargs

Python 语法,keyword arguments,关键字可变参数。

作用:接收不定数量的关键字参数,打包成字典 dict。

基础示例

1
2
3
4
5
6
def func(**kwargs):
    print(kwargs)
    print(type(kwargs))

func(name="Tom", age=18)
# 输出:{'name': 'Tom', 'age': 18}  <class 'dict'>

规则

  1. 函数定义:**kwargs,必须两个星号;kwargs 是约定名字,你可以写成**xxx,但习惯用 kwargs
  2. 只能接收 key=value 形式的关键字传参,不能传位置参数
  3. 一个函数里最多只能有一个 \**kwargs
  4. 顺序规范(参数书写顺序): 位置参数 → *args → **kwargs

解包(调用函数时用**)

1
2
info = {"name":"Jack", "score":90}
func(**info)  # 把字典拆成 name="Jack",score=90 传入

和 *args 对比

  • *args:接收不定位置参数 → 打包成元组 tuple
  • **kwargs:接收不定关键字参数 → 打包成字典 dict

常见完整组合

1
2
def demo(a, b, *args, **kwargs):
    pass

数据类型

整数

浮点数

字符串

布尔值:True和False

空值:None

数据结构

list

1
2
classmates = ['Michael', 'Bob', 'Tracy']
classmates[0]

tuple:不可变

1
classmates = ('Michael', 'Bob', 'Tracy')

函数

print

input

format

ord

chr

encode

decode

len

方法

1
2
def hello(self):
	print("hello")

一般方法在被调用时才会执行。

作用域

一般建议私有变量或函数以”_“开头命名

特殊变量或函数一般命名规则为:__**__

模块

安装第三方模块

1
2
# 安装Pillow模块
$ pip3 install Pillow

引用模块

1
2
import PIL
from PIL import Image

模块搜索路径sys.path。

1
2
3
4
5
6
7
8
$ python3
Python 3.6.5 (default, May 11 2018, 13:30:17) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/ray/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> 
1
2
3
4
5
6
7
8
$ python2
Python 2.7.15 (default, May  1 2018, 05:55:50) 
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/gtk-2.0']
>>> 

方法一:修改sys.path,当前生效

1
2
>>> import sys
>>> sys.path.append('/Users/michael/my_py_scripts')

方法二:设置环境变量PYTHONPATH,追加到sys.path

类

1
2
3
4
5
6
7
8
9
10
11
class Student(object):
    def __new__():
      	print("__new__")
        
    def __init__(self, name, score):
      	print("__init__")
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))

__new__ 负责创建对象

__init__ 负责初始化对象

Python 类的执行可以记住这两条主线:

1、定义类时:执行类体中的顶层代码(如类变量赋值、print 等),创建类对象;方法只是被定义,不会执行。

2、实例化对象时:调用 类名() → __new__() 创建对象 → __init__() 初始化对象 → 返回实例;之后只有显式调用实例方法(如 obj.method())时,对应方法体才会执行。

类对象(Person):保存类变量、方法等定义,由 type 创建。

实例对象(Person() 返回的对象):保存每个实例自己的数据(如 self.name、self.age 等),Person() 并不是创建类,而是调用类对象来创建一个实例对象。

package manager

pip

单独安装pip

1
2
$ apt install python-pip
$ apt install python3-pip

安装依赖

1
$ pip install -r requirements.txt

pipx

uv/uvx

UV An extremely fast Python package and project manager, written in Rust.

参考

Python 3教程