文章目录

    • 1.认识 Python
      • 1.1Python的起源
      • 1.2解释器
      • 1.3Python特点
      • 1.4Python的优缺点
    • 2.第一个HelloPython程序
      • 2.1 Python 源程序的基本概念
      • 2.2 `Python 2.x` 与 `3​​.x` 版本简介
      • 2.3 执行 Python 程序的三种方式
        • 2.3.1 解释器 `python` / `python3`
        • 2.3.2 交互式运行 Python 程序
        • 2.3.3 IPython
    • 3.PyCharm
      • 3.1 设置项目使用的解释器版本
      • 3.2 命名规则
      • 3.3 安装和启动步骤
      • 3.4 卸载之前版本的 PyCharm
      • 3.5 教育版安装演练
    • 4.注释
      • 4.1 单行注释(行注释)
      • 4.2 多行注释(块注释)
      • 4.3 关于代码规范
    • 5.程序执行原理
      • 5.1 计算机中的三大件
      • 5.2 程序执行的原理
      • 5.3 Python 程序执行原理
    • 6.变量的基本使用
      • 6.1 变量定义
      • 6.2 变量的类型
      • 6.3 不同类型变量之间的计算
        • 6.3.1 数字型变量之间可以直接计算
        • 6.3.2 字符串变量之间使用 `+` 拼接字符串
        • 6.3.3 字符串变量可以和整数使用 `*` 重复拼接相同的字符串
        • 6.3.4 数字型变量和字符串之间 **不能进行其他计算**
      • 6.4 变量的输入
        • 6.4.1 input 函数实现键盘输入
        • 6.4.2 类型转换函数
      • 6.5 变量的格式化输出
      • 6.6 变量的命名
      • 6.7 标识符和关键字
        • 6.7.1 标识符
        • 6.7.2 关键字
    • 7. 判断语句
      • 7.1 if 判断语句基本语法
      • 7.2 else 处理条件不满足的情况
      • 7.3 逻辑运算
      • 7.4 `elif`
      • 7.5 `if` 的嵌套
      • 7.6 随机数的处理
    • 8. 运算符
      • 8.1 算数运算符
      • 8.2 比较(关系)运算符
      • 8.3 逻辑运算符
      • 8.4 赋值运算符
      • 8.5 运算符的优先级
    • 9.循环
      • 9.1 程序的三大流程
      • 9.2 `while` 循环基本使用
        • 9.2.1 `while` 语句基本语法
        • 9.2.2 break 和 continue
      • 9.3 循环嵌套演练
        • 9.3.1 用嵌套打印小星星
        • 9.3.2 九九乘法表
      • 9.4 字符串中的转义字符
    • 10.函数基础
      • 10.1 函数基本使用
        • 10.1.1 函数的定义
        • 10.1.2 函数调用
        • 10.1.3 函数的文档注释
      • 10.2 函数的参数
        • 10.2.1 函数参数的使用
        • 10.2.2 参数的作用
        • 10.2.3 形参和实参
      • 10.3 函数的返回值
      • 10.4 函数的嵌套调用
      • 10.5 使用模块中的函数
        • 10.5.1 模块名也是一个标识符
        • 10.5.2 Pyc 文件
    • 11. 高级变量类型
      • 11.1 列表
        • 11.1.1 列表的定义
        • 11.1.2 列表常用操作
        • 11.1.3 循环遍历
        • 11.1.4 应用场景
      • 11.2 元组
        • 11.2.1 元组的定义
        • 11.2.2 元组常用操作
        • 11.2.3 循环遍历
        • 11.2.4 应用场景
        • 11.2.5 元组和列表之间的转换
      • 11.3 字典
        • 11.3.1 字典的定义
        • 11.3.2 字典常用操作
        • 11.3.3 循环遍历
        • 11.3.4 应用场景
      • 11.4 字符串
        • 11.4.1 字符串的定义
        • 11.4.2 字符串的常用操作
          • 11.4.2.1 判断类型 - 9
          • 11.4.2.2 查找和替换 - 7
          • 11.4.2.3 大小写转换 - 5
          • 11.4.2.4 文本对齐 - 3
          • 11.4.2.5 去除空白字符 - 3
          • 11.4.2.6 拆分和连接 - 5
        • 11.4.3 字符串的切片
      • 11.5 公共方法
        • 11.5.1 Python 内置函数
        • 11.5.2 切片
        • 11.5.3 运算符
        • 11.5.4 完整的 for 循环语法
        • 11.5.5应用场景
    • 12.综合应用--名片管理系统
      • 12.1 框架搭建
        • 12.1.1 文件准备
        • 12.1.2 编写主运行循环
        • 12.1.3 在 `cards_tools` 中增加四个新函数
        • 12.1.4 导入模块
        • 1.5 完成 `show_menu` 函数
      • 12.2 保存名片数据的结构
      • 12.3 新增名片
        • 12.3.1 功能分析
        • 12.3.2 实现 new_card 方法
      • 12.4 显示所有名片
        • 12.4.1 功能分析
        • 12.4.2 基础代码实现
        • 12.4.3 增加标题和使用 `\t` 显示
        • 12.4.4 增加没有名片记录判断
      • 12.5 查询名片
        • 12.5.1 功能分析
        • 12.5.2 代码实现
      • 12.6 修改和删除
        • 12.6.1 查询成功后删除名片
        • 12.6.2 修改名片
      • 12.7 Linux 上的 `Shebang` 符号(`#!`)
      • 12.8 完整代码
    • 13. 变量进阶
      • 13.1 变量的引用
      • 13.2 可变和不可变类型
      • 13.3 局部变量和全局变量
        • 13.3.1 局部变量
        • 13.3.2 全局变量
          • 13.3.2.1 函数不能直接修改 `全局变量的引用`
          • 13.3.2.2 在函数内部修改全局变量的值
          • 13.3.2.3 全局变量定义的位置
          • 13.3.2.4 全局变量命名的建议
    • 14. 函数进阶
      • 14.1 函数参数和返回值的作用
        • 14.1.1 无参数,无返回值
        • 14.1.2 无参数,有返回值
        • 14.1.3 有参数,无返回值
        • 14.1.4 有参数,有返回值
      • 14.2 函数的返回值 进阶
        • 14.2.1 温度和湿度测量
        • 14.2.2 面试题 —— 交换两个数字
      • 14.3 函数的参数 进阶
        • 14.3.1. 不可变和可变的参数
        • 14.3.2 缺省参数
          • 14.3.2.1 指定函数的缺省参数
          • 14.3.2.2 缺省参数的注意事项
        • 14.3.3 多值参数
          • 14.3.3.1 定义支持多值参数的函数
          • 14.3.3.2 计算任意多个数字的和
          • 14.3.3.3 元组和字典的拆包
      • 14.4 函数的递归
        • 14.4.1 递归函数的特点
        • 14.4.2 计算数字累加
  • 传送门

1.认识 Python

1.1Python的起源

Python 的创始人为吉多·范罗苏姆(Guido van Rossum)

  1. 1989 年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的解释程序,作为 ABC 语言的一种继承
  2. ABC 是由吉多参加设计的一种教学语言,就吉多本人看来,ABC 这种语言非常优美和强大,是专门为非专业程序员设计的。但是 ABC 语言并没有成功,究其原因,吉多认为是非开放造成的。吉多决心在 Python 中避免这一错误,并获取了非常好的效果
  3. 1991 年,第一个 Python 解释器 诞生,它是用 C 语言实现的,并能够调用 C 语言的库文件

1.2解释器

计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序。将其他语言翻译成机器语言的工具,被称为编译器

编译器翻译的方式有两种:一个是编译,另外一个是解释。两种方式之间的区别在于翻译时间点的不同。当编译器以解释方式运行的时候,也称之为解释器

  • 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如 C、C++
  • 解释型语言:解释型语言编写的程序不进行预先编译,以文本方式存储程序代码,会将代码一句一句直接运行。在发布程序时,看起来省了道编译工序,但是在运行程序的时候,必须先解释再运行

编译型语言和解释型语言对比

  • 速度 —— 编译型语言比解释型语言执行速度快
  • 跨平台性 —— 解释型语言比编译型语言跨平台性好

1.3Python特点

  • Python 是完全面向对象的语言

    • 函数模块数字字符串都是对象,在 Python 中一切皆对象
    • 完全支持继承、重载、多重继承
    • 支持重载运算符,也支持泛型设计
  • Python 拥有一个强大的标准库,Python 语言的核心只包含 数字字符串列表字典文件 等常见类型和函数,而由 Python 标准库提供了 系统管理网络通信文本处理数据库接口图形系统XML 处理 等额外的功能
  • Python 社区提供了大量的第三方模块,使用方式与标准库类似。它们的功能覆盖 科学计算人工智能机器学习Web 开发数据库接口图形系统 多个领域

1.4Python的优缺点

优点

  • 简单、易学
  • 免费、开源
  • 面向对象
  • 丰富的库
  • 可扩展性
    • 如果需要一段关键代码运行得更快或者希望某些算法不公开,可以把这部分程序用 CC++ 编写,然后在 Python 程序中使用它们
  • ……

缺点

  • 运行速度
  • 国内市场较小
  • 中文资料匮乏

2.第一个HelloPython程序

2.1 Python 源程序的基本概念

  1. Python 源程序就是一个特殊格式的文本文件,可以使用任意文本编辑软件Python 的开发
  2. Python 程序的 文件扩展名 通常都是 .py
print("hello python")
  • 在终端中输入以下命令执行 01-HelloPython.py
$ python 01-HelloPython.py

目前市场上有两个 Python 的版本并存着,分别是 Python 2.xPython 3.x

  • Python 2.x 默认不支持中文
  • Python 2.x 的解释器名称是 python
  • Python 3.x 的解释器名称是 python3
  • ASCII 字符只包含 256 个字符,不支持中文

2.2 Python 2.x3​​.x 版本简介

新的 Python 程序建议使用 Python 3.0 版本的语法

  • 相对于 Python 的早期版本,Python 3.x是一个 较大的升级
  • 为了不带入过多的累赘,Python 3.0 在设计的时候 没有考虑向下兼容,许多早期 Python 版本设计的程序都无法在 Python 3.0 上正常执行
  • Python 3.0 发布于 2008 年到目前为止,Python 3.0 的稳定版本已经有很多年了
  • 为了照顾现有的程序,官方提供了一个过渡版本 —— Python 2.6,基本使用了 Python 2.x 的语法和库,同时考虑了向 Python 3.0 的迁移,允许使用部分 Python 3.0 的语法与函数
  • 2010 年中推出的 Python 2.7 被确定为 最后一个Python 2.x 版本

提示:如果开发时,无法立即使用 Python 3.0(还有极少的第三方库不支持 3.0 的语法),建议

  • 先使用 Python 3.0 版本进行开发
  • 然后使用 Python 2.6Python 2.7 来执行,并且做一些兼容性的处理

2.3 执行 Python 程序的三种方式

2.3.1 解释器 python / python3

Python 的解释器 如今有多个语言的实现,包括:

  • CPython —— 官方版本的 C 语言实现
  • Jython —— 可以运行在 Java 平台
  • IronPython —— 可以运行在 .NET 和 Mono 平台
  • PyPy —— Python 实现的,支持 JIT 即时编译

2.3.2 交互式运行 Python 程序

  • 直接在终端中运行解释器,而不输入要执行的文件名
  • 在 Python 的 Shell 中直接输入 Python 的代码,会立即看到程序执行结果

优点:适合于学习/验证 Python 语法或者局部代码
缺点:代码不能保存, 不适合运行太大的程序

如何退出官方的解释器:

1.直接输入 exit()

>>> exit()

2.使用热键退出
在 python 解释器中,按热键 ctrl + d 可以退出解释器

2.3.3 IPython

IPython 中 的 “I” 代表 交互 interactive

特点:

* IPython 是一个 python 的 **交互式 shell**,比默认的 `python shell` 好用得多* 支持自动补全* 自动缩进* 支持 `bash shell` 命令* 内置了许多很有用的功能和函数
* IPython 是基于 BSD 开源的

要退出解释器可以有以下两种方式:

1.直接输入 exit()

>>> exit()

2.使用热键退出
在 IPython 解释器中,按热键 ctrl + dIPython 会询问是否退出解释器

IPython 的安装:

$ sudo apt install ipython

3.PyCharm

3.1 设置项目使用的解释器版本

  • 打开的目录如果不是由 PyCharm 建立的项目目录,有的时候 使用的解释器版本是 Python 2.x 的,需要单独设置解释器的版本
  • 通过 File / Settings… 可以打开设置窗口,如下图所示:

3.2 命名规则

  1. 命名文件名时建议只使用 小写字母数字下划线
  2. 文件名不能以数字开始
  • 通过 欢迎界面 或者菜单 File / New Project 可以新建项目

3.3 安装和启动步骤

  1. 执行以下终端命令,解压缩下载后的安装包
$ tar -zxvf pycharm-professional-2017.1.3.tar.gz
  1. 将解压缩后的目录移动到 /opt 目录下,可以方便其他用户使用

/opt 目录用户存放给主机额外安装的软件

$ sudo mv pycharm-2017.1.3/ /opt/
  1. 切换工作目录
$ cd /opt/pycharm-2017.1.3/bin
  1. 启动 PyCharm
$ ./pycharm.sh

设置专业版启动图标:

  • 专业版中,选择菜单 Tools / Create Desktop Entry… 可以设置任务栏启动图标
  • 注意:设置图标时,需要勾选 Create the entry for all users

3.4 卸载之前版本的 PyCharm

  • 要卸载 PyCharm 只需要做以下两步工作:
  1. 删除解压缩目录
$ sudo rm -r /opt/pycharm-2016.3.1/
  1. 删除家目录下用于保存配置信息的隐藏目录
$ rm -r ~/.PyCharm2016.3/

如果不再使用 PyCharm 还需要将 /usr/share/applications/ 下的 jetbrains-pycharm.desktop 删掉

3.5 教育版安装演练

# 1. 解压缩下载后的安装包
$ tar -zxvf pycharm-edu-3.5.1.tar.gz# 2. 将解压缩后的目录移动到 `/opt` 目录下,可以方便其他用户使用
$ sudo mv pycharm-edu-3.5.1/ /opt/# 3. 启动 `PyCharm`
/opt/pycharm-edu-3.5.1/bin/pycharm.sh

设置启动图标:

  1. 编辑快捷方式文件
$ sudo gedit /usr/share/applications/jetbrains-pycharm.desktop
  1. 按照以下内容修改文件内容,需要注意指定正确的 pycharm 目录
[Desktop Entry]
Version=1.0
Type=Application
Name=PyCharm
Icon=/opt/pycharm-edu-3.5.1/bin/pycharm.png
Exec="/opt/pycharm-edu-3.5.1/bin/pycharm.sh" %f
Comment=The Drive to Develop
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm

4.注释

4.1 单行注释(行注释)

  • # 开头,# 右边的所有东西都被当做说明文字,而不是真正要执行的程序,只起到辅助说明作用
# 这是第一个单行注释
print("hello python")

为了保证代码的可读性,# 后面建议先添加一个空格,然后再编写相应的说明文字

在代码后面增加的单行注释:

  • 在程序开发时,同样可以使用 # 在代码的后面(旁边)增加说明性的文字

  • 但是,需要注意的是,为了保证代码的可读性注释和代码之间 至少要有 两个空格

  • 示例代码如下:

print("hello python")  # 输出 `hello python`

4.2 多行注释(块注释)

  • 如果希望编写的 注释信息很多,一行无法显示,就可以使用多行注释
  • 要在 Python 程序中使用多行注释,可以用 一对 连续的 三个 引号(单引号和双引号都可以)
"""
这是一个多行注释在多行注释之间,可以写很多很多的内容……
"""
print("hello python")

什么时候需要使用注释:

  1. 注释不是越多越好,对于一目了然的代码,不需要添加注释
  2. 对于 复杂的操作,应该在操作开始前写上若干行注释
  3. 对于 不是一目了然的代码,应在其行尾添加注释(为了提高可读性,注释应该至少离开代码 2 个空格)
  4. 绝不要描述代码,假设阅读代码的人比你更懂 Python,他只是不知道你的代码要做什么

在一些正规的开发团队,通常会有 代码审核 的惯例,就是一个团队中彼此阅读对方的代码

4.3 关于代码规范

  • Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文档
  • 其中第 8 篇文档专门针对 Python 的代码格式 给出了建议,也就是俗称的 PEP 8
  • 文档地址:https://www.python.org/dev/peps/pep-0008/
  • 谷歌有对应的中文文档:http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/

5.程序执行原理

5.1 计算机中的三大件

计算机中包含有较多的硬件,但是一个程序要运行,有 三个 核心的硬件,分别是:

  1. CPU

    • 中央处理器,是一块超大规模的集成电路
    • 负责 处理数据计算
  2. 内存
    • 临时 存储数据(断电之后,数据会消失)
    • 速度快
    • 空间小(单位价格高)
  3. 硬盘
    • 永久 存储数据
    • 速度慢
    • 空间大(单位价格低)

5.2 程序执行的原理

  1. 程序 运行之前,程序是 保存在硬盘 中的
  2. 当要运行一个程序时
    • 操作系统会首先让 CPU 把程序复制到 内存
    • CPU 执行 内存 中的 程序代码

5.3 Python 程序执行原理

  1. 操作系统会首先让 CPUPython 解释器 的程序复制到 内存
  2. Python 解释器 根据语法规则,从上向下CPU 翻译 Python 程序中的代码
  3. CPU 负责执行翻译完成的代码

6.变量的基本使用

  • 变量定义
  • 变量的类型
  • 变量的命名

6.1 变量定义

  • 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 才会被创建
  • 等号(=)用来给变量赋值
    • = 左边是一个变量名
    • = 右边是存储在变量中的值
变量名 = 值

6.2 变量的类型

  • 在内存中创建一个变量,会包括:
  1. 变量的名称
  2. 变量保存的数据
  3. 变量存储数据的类型
  4. 变量的地址(标示)
  • Python 中定义变量是 不需要指定类型
  • 数据类型可以分为 数字型非数字型

数字型

  • 整型 (int)
  • 浮点型(float
  • 布尔型(bool
  • True 非 0 数 —— 非零即真
  • False 0
  • 复数型 (complex): 主要用于科学计算,例如:平面场问题、波动问题、电感电容等问题

非数字型

  • 字符串
  • 列表
  • 元组
  • 字典

提示:在 Python 2.x 中,整数 根据保存数值的长度还分为:

  • int(整数)
  • long(长整数)

使用 type 函数可以查看一个变量的类型

In [1]: type(name)

6.3 不同类型变量之间的计算

6.3.1 数字型变量之间可以直接计算

  • 在 Python 中,两个数字型变量是可以直接进行 算数运算的
  • 如果变量是 bool 型,在计算时
    • True 对应的数字是 1
    • False 对应的数字是 0

6.3.2 字符串变量之间使用 + 拼接字符串

  • 在 Python 中,字符串之间可以使用 + 拼接生成新的字符串
In [1]: first_name = "三"
In [2]: last_name = "张"
In [3]: first_name + last_name
Out[3]: '三张'

6.3.3 字符串变量可以和整数使用 * 重复拼接相同的字符串

In [1]: "-" * 50
Out[1]: '--------------------------------------------------'

6.3.4 数字型变量和字符串之间 不能进行其他计算

In [1]: first_name = "zhang"
In [2]: x = 10
In [3]: x + first_name
---------------------------------------------------------------------------
TypeError: unsupported operand type(s) for +: 'int' and 'str'
类型错误:`+` 不支持的操作类型:`int` 和 `str`

6.4 变量的输入

6.4.1 input 函数实现键盘输入

  • 在 Python 中可以使用 input 函数从键盘等待用户的输入
  • 用户输入的 任何内容 Python 都认为是一个 字符串
字符串变量 = input("提示信息:")

6.4.2 类型转换函数

函数 说明
int(x) 将 x 转换为一个整数
float(x) 将 x 转换到一个浮点数

6.5 变量的格式化输出

在 Python 中可以使用 print 函数将信息输出到控制台
如果希望输出文字信息的同时,一起输出 数据,就需要使用到 格式化操作符
% 被称为 格式化操作符,专门用于处理字符串中的格式

  • 包含 % 的字符串,被称为 格式化字符串
  • % 和不同的 字符 连用,不同类型的数据 需要使用 不同的格式化字符
格式化字符 含义
%s 字符串
%d 有符号十进制整数,%06d 表示输出的整数显示位数,不足的地方使用 0 补全
%f 浮点数,%.2f 表示小数点后只显示两位
%% 输出 %

语法格式如下:

print("格式化字符串" % 变量1)print("格式化字符串" % (变量1, 变量2...))

6.6 变量的命名

命名规则 可以被视为一种 惯例,并无绝对与强制
目的是为了 增加代码的识别和可读性

注意 Python 中的 标识符区分大小写的

  1. 在定义变量时,为了保证代码格式,= 的左右应该各保留一个空格

  2. Python 中,如果 变量名 需要由 二个多个单词 组成时,可以按照以下方式命名

    1. 每个单词都使用小写字母
    2. 单词与单词之间使用 _下划线 连接

    例如:first_namelast_nameqq_numberqq_password

6.7 标识符和关键字

6.7.1 标识符

标示符就是程序员定义的 变量名函数名

  • 标示符可以由 字母下划线数字 组成
  • 不能以数字开头
  • 不能与关键字重名

6.7.2 关键字

  • 关键字 就是在 Python 内部已经使用的标识符
  • 关键字 具有特殊的功能和含义
  • 开发者 不允许定义和关键字相同的名字的标示符

通过以下命令可以查看 Python 中的关键字

In [1]: import keyword
In [2]: print(keyword.kwlist)

7. 判断语句

7.1 if 判断语句基本语法

Python 中,if 语句 就是用来进行判断的,格式如下:

if 要判断的条件:条件成立时,要做的事情……

注意:代码的缩进为一个 tab 键,或者 4 个空格 —— 建议使用空格

  • 在 Python 开发中,Tab 和空格不要混用!

7.2 else 处理条件不满足的情况

if 要判断的条件:条件成立时,要做的事情……
else:条件不成立时,要做的事情……

注意

  • ifelse 语句以及各自的缩进部分共同是一个 完整的代码块

7.3 逻辑运算

  • 在程序开发中,通常 在判断条件时,会需要同时判断多个条件
  • 只有多个条件都满足,才能够执行后续代码,这个时候需要使用到 逻辑运算符
  • 逻辑运算符 可以把 多个条件 按照 逻辑 进行 连接,变成 更复杂的条件
  • Python 中的 逻辑运算符 包括:与 and或 or非 not 三种

and

条件1 and 条件2

or

条件1 or 条件2

not

not 条件

7.4 elif

  • 在开发中,使用 if 可以 判断条件
  • 使用 else 可以处理 条件不成立 的情况
  • 但是,如果希望 再增加一些条件条件不同,需要执行的代码也不同 时,就可以使用 elif
  • 语法格式如下:
if 条件1:条件1满足执行的代码……
elif 条件2:条件2满足时,执行的代码……
elif 条件3:条件3满足时,执行的代码……
else:以上条件都不满足时,执行的代码……

注意

  1. elifelse 都必须和 if 联合使用,而不能单独使用
  2. 可以将 ifelifelse 以及各自缩进的代码,看成一个 完整的代码块

7.5 if 的嵌套

  • 在开发中,使用 if 进行条件判断,如果希望 在条件成立的执行语句中增加条件判断,就可以使用 if 的嵌套
  • if 的嵌套 的应用场景就是:在之前条件满足的前提下,再增加额外的判断
  • if 的嵌套 的语法格式,除了缩进之外 和之前的没有区别

7.6 随机数的处理

  • Python 中,要使用随机数,首先需要导入 随机数模块 —— “工具包”
  • random.randint(a, b) ,返回 [a, b] 之间的整数,包含 ab
import random

8. 运算符

8.1 算数运算符

  • 是完成基本的算术运算使用的符号,用来处理四则运算
运算符 描述 实例
+ 10 + 20 = 30
- 10 - 20 = -10
* 10 * 20 = 200
/ 10 / 20 = 0.5
// 取整除 返回除法的整数部分(商) 9 // 2 输出结果 4
% 取余数 返回除法的余数 9 % 2 = 1
** 又称次方、乘方,2 ** 3 = 8
  • 在 Python 中 * 运算符还可以用于字符串,计算结果就是字符串重复指定次数的结果
In [1]: "-" * 50
Out[1]: '----------------------------------------'

8.2 比较(关系)运算符

运算符 描述
== 检查两个操作数的值是否 相等,如果是,则条件成立,返回 True
!= 检查两个操作数的值是否 不相等,如果是,则条件成立,返回 True
> 检查左操作数的值是否 大于 右操作数的值,如果是,则条件成立,返回 True
< 检查左操作数的值是否 小于 右操作数的值,如果是,则条件成立,返回 True
>= 检查左操作数的值是否 大于或等于 右操作数的值,如果是,则条件成立,返回 True
<= 检查左操作数的值是否 小于或等于 右操作数的值,如果是,则条件成立,返回 True

Python 2.x 中判断 不等于 还可以使用 <> 运算符

!= 在 Python 2.x 中同样可以用来判断 不等于

8.3 逻辑运算符

运算符 逻辑表达式
and x and y
or x or y
not not x

8.4 赋值运算符

  • 在 Python 中,使用 = 可以给变量赋值
  • 在算术运算时,为了简化代码的编写,Python 还提供了一系列的 与 算术运算符 对应的 赋值运算符
  • 注意:赋值运算符中间不能使用空格
运算符 描述 实例
= 简单的赋值运算符 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

8.5 运算符的优先级

以下表格的算数优先级由高到最低顺序排列

运算符 描述
** 幂 (最高优先级)
* / % // 乘、除、取余数、取整除
+ - 加法、减法
<= < > >= 比较运算符
== != 等于运算符
= %= /= //= -= += *= **= 赋值运算符
not or and 逻辑运算符

9.循环

9.1 程序的三大流程

在程序开发中,一共有三种流程方式:

  • 顺序 —— 从上向下,顺序执行代码
  • 分支 —— 根据条件判断,决定执行代码的 分支
  • 循环 —— 让 特定代码 重复 执行

9.2 while 循环基本使用

9.2.1 while 语句基本语法

初始条件设置 —— 通常是重复执行的 计数器while 条件(判断 计数器 是否达到 目标次数):条件满足时,做的事情1条件满足时,做的事情2条件满足时,做的事情3...(省略)...处理条件(计数器 + 1)

9.2.2 break 和 continue

  • break 某一条件满足时,退出循环,不再执行后续重复的代码
  • continue 某一条件满足时,不执行后续重复的代码
  • breakcontinue 只针对 当前所在循环 有效

需要注意:使用 continue 时,条件处理部分的代码,需要特别注意,不小心会出现 死循环

9.3 循环嵌套演练

9.3.1 用嵌套打印小星星


row = 1
while row <= 5:print("*" * row)row += 1
row = 1
while row <= 5:col = 1while col <= row:print("*", end="")col += 1print("")row += 1

知识点print 函数的使用做一个增强

  • 在默认情况下,print 函数输出内容之后,会自动在内容末尾增加换行
  • 如果不希望末尾增加换行,可以在 print 函数输出内容的后面增加 , end=""
  • 其中 "" 中间可以指定 print 函数输出内容之后,继续希望显示的内容
# 向控制台输出内容结束之后,不会换行
print("*", end="")# 单纯的换行
print("")

9.3.2 九九乘法表

row = 1
while row <= 9:col = 1while col <= row:# end = "",表示输出结束后,不换行# "\t" 可以在控制台输出一个制表符,协助在输出文本时对齐print("%d * %d = %d" % (col, row, row * col), end="\t")col += 1print("")row += 1

9.4 字符串中的转义字符

\t 在控制台输出一个 制表符,协助在输出文本时 垂直方向 保持对齐
\n 在控制台输出一个 换行符

转义字符 描述
\\ 反斜杠符号
\’ 单引号
\" 双引号
\n 换行
\t 横向制表符
\r 回车

10.函数基础

  • 函数的基本使用
  • 函数的参数
  • 函数的返回值
  • 函数的嵌套调用
  • 在模块中定义函数

10.1 函数基本使用

10.1.1 函数的定义

def 函数名():函数封装的代码……
  1. def 是英文 define 的缩写
  2. 函数名称 应该能够表达 函数封装代码 的功能,方便后续的调用
  3. 函数名称 的命名应该 符合 标识符的命名规则
    • 可以由 字母下划线数字 组成
    • 不能以数字开头
    • 不能与关键字重名

10.1.2 函数调用

通过 函数名() 即可完成对函数的调用

10.1.3 函数的文档注释

  • 在开发中,如果希望给函数添加注释,应该在 定义函数 的下方,使用 连续的三对引号
  • 连续的三对引号 之间编写对函数的说明文字
  • 函数调用 位置,使用快捷键 CTRL + Q 可以查看函数的说明信息

注意:因为 函数体相对比较独立函数定义的上方,应该和其他代码(包括注释)保留 两个空行

10.2 函数的参数

10.2.1 函数参数的使用

  • 在函数名的后面的小括号内部填写 参数
  • 多个参数之间使用 , 分隔
def sum_2_num(num1, num2):result = num1 + num2print("%d + %d = %d" % (num1, num2, result))
sum_2_num(50, 20)

10.2.2 参数的作用

  • 函数,把 具有独立功能的代码块 组织为一个小模块,在需要的时候 调用
  • 函数的参数,增加函数的 通用性,针对 相同的数据处理逻辑,能够 适应更多的数据
    1. 在函数 内部,把参数当做 变量 使用,进行需要的数据处理
    2. 函数调用时,按照函数定义的参数顺序,把 希望在函数内部处理的数据通过参数 传递

10.2.3 形参和实参

  • 形参定义 函数时,小括号中的参数,是用来接收参数用的,在函数内部 作为变量使用
  • 实参调用 函数时,小括号中的参数,是用来把数据传递到 函数内部 用的

10.3 函数的返回值

  • 在程序开发中,有时候,会希望 一个函数执行结束后,告诉调用者一个结果,以便调用者针对具体的结果做后续的处理
  • 返回值 是函数 完成工作后,最后 给调用者的 一个结果
  • 在函数中使用 return 关键字可以返回结果
  • 调用函数一方,可以 使用变量接收 函数的返回结果

注意:return 表示返回,后续的代码都不会被执行

def sum_2_num(num1, num2):"""对两个数字的求和"""return num1 + num2
result = sum_2_num(10, 20)
print("计算结果是 %d" % result)

10.4 函数的嵌套调用

  • 一个函数里面 又调用另外一个函数,这就是 函数嵌套调用
  • 如果函数 test2 中,调用了另外一个函数 test1
    • 那么执行到调用 test1 函数时,会先把函数 test1 中的任务都执行完
    • 才会回到 test2 中调用函数 test1 的位置,继续执行后续的代码
def test1():print("*" * 50)print("test 1")print("*" * 50)
def test2():print("-" * 50)print("test 2")   test1()    print("-" * 50)
test2()

10.5 使用模块中的函数

模块是 Python 程序架构的一个核心概念

  • 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要 导入 import 这个模块

  • 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块

  • 在模块中定义的 全局变量函数 都是模块能够提供给外界直接使用的工具

  • 可以 在一个 Python 文件定义 变量 或者 函数

  • 然后在 另外一个文件中 使用 import 导入这个模块

  • 导入之后,就可以使用 模块名.变量 / 模块名.函数 的方式,使用这个模块中定义的变量或者函数

模块可以让 曾经编写过的代码 方便的被 复用

10.5.1 模块名也是一个标识符

  • 标示符可以由 字母下划线数字 组成
  • 不能以数字开头
  • 不能与关键字重名

注意:如果在给 Python 文件起名时,以数字开头 是无法在 PyCharm 中通过导入这个模块的

10.5.2 Pyc 文件

Ccompiled 编译过 的意思

操作步骤

  1. 浏览程序目录会发现一个 __pycache__ 的目录
  2. 目录下会有一个 hm_10_分隔线模块.cpython-35.pyc 文件,cpython-35 表示 Python 解释器的版本
  3. 这个 pyc 文件是由 Python 解释器将 模块的源码 转换为 字节码
    • Python 这样保存 字节码 是作为一种启动 速度的优化

字节码

Python 在解释源程序时是分成两个步骤的

  1. 首先处理源代码,编译 生成一个二进制 字节码
  2. 再对 字节码 进行处理,才会生成 CPU 能够识别的 机器码

有了模块的字节码文件之后,下一次运行程序时,如果在 上次保存字节码之后 没有修改过源代码,Python 将会加载 .pyc 文件并跳过编译这个步骤, 当 Python 重编译时,它会自动检查源文件和字节码文件的时间戳,如果你又修改了源代码,下次程序运行时,字节码将自动重新创建

11. 高级变量类型

Python 中,所有 非数字型变量 都支持以下特点:

  1. 都是一个 序列 sequence,也可以理解为 容器
  2. 取值 []
  3. 遍历 for in
  4. 计算长度最大/最小值比较删除
  5. 链接 +重复 *
  6. 切片

11.1 列表

11.1.1 列表的定义

  • List(列表) 是 Python 中使用 最频繁 的数据类型
  • 专门用于存储 一串信息
  • 列表用 [] 定义,数据 之间使用 , 分隔
  • 列表的 索引0 开始
name_list = ["zhangsan", "lisi", "wangwu"]

11.1.2 列表常用操作

序号 分类 关键字 / 函数 / 方法 说明
1 增加 列表.insert(索引, 数据) 在指定位置插入数据
列表.append(数据) 在末尾追加数据
列表.extend(列表2) 将列表2 的数据追加到列表
2 修改 列表[索引] = 数据 修改指定索引的数据
3 删除 del 列表[索引] 删除指定索引的数据
列表.remove[数据] 删除第一个出现的指定数据
列表.pop 删除末尾数据
列表.pop(索引) 删除指定索引数据
列表.clear 清空列表
4 统计 len(列表) 列表长度
列表.count(数据) 数据在列表中出现的次数
5 排序 列表.sort() 升序排序
列表.sort(reverse=True) 降序排序
列表.reverse() 逆序、反转

del 关键字

  • 使用 del 关键字(delete) 同样可以删除列表中元素
  • del 关键字本质上是用来 将一个变量从内存中删除的
  • 如果使用 del 关键字将变量从内存中删除,后续的代码就不能再使用这个变量了
del name_list[1]

在日常开发中,要从列表删除数据,建议 使用列表提供的方法

11.1.3 循环遍历

  • Python 中为了提高列表的遍历效率,专门提供的 迭代 iteration 遍历
  • 使用 for 就能够实现迭代遍历
# for 循环内部使用的变量 in 列表
for name in name_list:循环内部针对列表元素进行操作print(name)

11.1.4 应用场景

尽管 Python列表 中可以 存储不同类型的数据,但是在开发中,更多的应用场景是

  1. 列表 存储相同类型的数据
  2. 通过 迭代遍历,在循环体内部,针对列表中的每一项元素,执行相同的操作

11.2 元组

11.2.1 元组的定义

  • Tuple(元组)与列表类似,不同之处在于元组的 元素不能修改

    • 元组 表示多个元素组成的序列
    • 元组Python 开发中,有特定的应用场景
  • 用于存储 一串 信息数据 之间使用 , 分隔
  • 元组用 () 定义
info_tuple = ("zhangsan", 18, 1.75)

创建空元组:

info_tuple = ()

元组中 只包含一个元素 时,需要 在元素后面添加逗号

info_tuple = (50, )

11.2.2 元组常用操作

  • ipython3 中定义一个 元组,例如:info = ()
  • 输入 info. 按下 TAB 键,ipython 会提示 元组 能够使用的函数如下:
info.count  info.index

11.2.3 循环遍历

# for 循环内部使用的变量 in 元组
for item in info:循环内部针对元组元素进行操作print(item)

Python 中,可以使用 for 循环遍历所有非数字型类型的变量:列表元组字典 以及 字符串
提示:在实际开发中,除非 能够确认元组中的数据类型,否则针对元组的循环遍历需求并不是很多

11.2.4 应用场景

尽管可以使用 for in 遍历 元组但是在开发中,更多的应用场景是:

  • 函数的 参数 和 返回值,一个函数可以接收 任意多个参数,或者 一次返回多个数据
  • 格式字符串,格式化字符串后面的 () 本质上就是一个元组
  • 让列表不可以被修改,以保护数据安全
info = ("zhangsan", 18)
print("%s 的年龄是 %d" % info)

11.2.5 元组和列表之间的转换

  • 使用 list 函数可以把元组转换成列表
list(元组)
  • 使用 tuple 函数可以把列表转换成元组
tuple(列表)

11.3 字典

11.3.1 字典的定义

  • dictionary(字典) 是 除列表以外 Python 之中 最灵活 的数据类型
  • 字典同样可以用来 存储多个数据,通常用于存储 描述一个 物体 的相关信息
  • 和列表的区别
    • 列表有序 的对象集合
    • 字典无序 的对象集合
  • 字典用 {} 定义
  • 字典使用 键值对 存储数据,键值对之间使用 , 分隔
    • key 是索引
    • value 是数据
    • 之间使用 : 分隔
    • 键必须是唯一的
    • 可以取任何数据类型,但 只能使用 字符串数字元组
xiaoming = {"name": "小明","age": 18,"gender": True,"height": 1.75}

11.3.2 字典常用操作

ipython3 中定义一个 字典,例如:xiaoming = {}
输入 xiaoming. 按下 TAB 键,ipython 会提示 字典 能够使用的函数如下:

In [1]: xiaoming.
xiaoming.clear       xiaoming.items       xiaoming.setdefault
xiaoming.copy        xiaoming.keys        xiaoming.update
xiaoming.fromkeys    xiaoming.pop         xiaoming.values
xiaoming.get         xiaoming.popitem

11.3.3 循环遍历

# for 循环内部使用的 `key 的变量` in 字典
for k in xiaoming:print("%s: %s" % (k, xiaoming[k]))

提示:在实际开发中,由于字典中每一个键值对保存数据的类型是不同的,所以针对字典的循环遍历需求并不是很多

11.3.4 应用场景

尽管可以使用 for in 遍历 字典,但是在开发中,更多的应用场景是:

  • 使用 多个键值对,存储 描述一个 物体 的相关信息 —— 描述更复杂的数据信息
  • 多个字典 放在 一个列表 中,再进行遍历,在循环体内部针对每一个字典进行 相同的处理
card_list = [{"name": "张三","qq": "12345","phone": "110"},{"name": "李四","qq": "54321","phone": "10086"}]

11.4 字符串

11.4.1 字符串的定义

  • 字符串 就是 一串字符,是编程语言中表示文本的数据类型
  • 在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串
    • 虽然可以使用 \" 或者 \' 做字符串的转义,但是在实际开发中:

      • 如果字符串内部需要使用 ",可以使用 ' 定义字符串
      • 如果字符串内部需要使用 ',可以使用 " 定义字符串
  • 可以使用 索引 获取一个字符串中 指定位置的字符,索引计数从 0 开始
  • 也可以使用 for 循环遍历 字符串中每一个字符

大多数编程语言都是用 " 来定义字符串

string = "Hello Python"
for c in string:print(c)

11.4.2 字符串的常用操作

  • ipython3 中定义一个 字符串,例如:hello_str = ""
  • 输入 hello_str. 按下 TAB 键,ipython 会提示 字符串 能够使用的 方法 如下:
In [1]: hello_str.
hello_str.capitalize    hello_str.isidentifier  hello_str.rindex
hello_str.casefold      hello_str.islower       hello_str.rjust
hello_str.center        hello_str.isnumeric     hello_str.rpartition
hello_str.count         hello_str.isprintable   hello_str.rsplit
hello_str.encode        hello_str.isspace       hello_str.rstrip
hello_str.endswith      hello_str.istitle       hello_str.split
hello_str.expandtabs    hello_str.isupper       hello_str.splitlines
hello_str.find          hello_str.join          hello_str.startswith
hello_str.format        hello_str.ljust         hello_str.strip
hello_str.format_map    hello_str.lower         hello_str.swapcase
hello_str.index         hello_str.lstrip        hello_str.title
hello_str.isalnum       hello_str.maketrans     hello_str.translate
hello_str.isalpha       hello_str.partition     hello_str.upper
hello_str.isdecimal     hello_str.replace       hello_str.zfill
hello_str.isdigit       hello_str.rfind
11.4.2.1 判断类型 - 9
方法 说明
string.isspace() 如果 string 中只包含空格,则返回 True
string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True
string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True
string.isdecimal() 如果 string 只包含数字则返回 True,全角数字
string.isdigit() 如果 string 只包含数字则返回 True,全角数字\u00b2
string.isnumeric() 如果 string 只包含数字则返回 True,全角数字汉字数字
string.istitle() 如果 string 是标题化的(每个单词的首字母大写)则返回 True
string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True
string.isupper() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True
11.4.2.2 查找和替换 - 7
方法 说明
string.startswith(str) 检查字符串是否是以 str 开头,是则返回 True
string.endswith(str) 检查字符串是否是以 str 结束,是则返回 True
string.find(str, start=0, end=len(string)) 检测 str 是否包含在 string 中,如果 start 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回 -1
string.rfind(str, start=0, end=len(string)) 类似于 find(),不过是从右边开始查找
string.index(str, start=0, end=len(string)) 跟 find() 方法类似,不过如果 str 不在 string 会报错
string.rindex(str, start=0, end=len(string)) 类似于 index(),不过是从右边开始
string.replace(old_str, new_str, num=string.count(old)) 把 string 中的 old_str 替换成 new_str,如果 num 指定,则替换不超过 num 次
11.4.2.3 大小写转换 - 5
方法 说明
string.capitalize() 把字符串的第一个字符大写
string.title() 把字符串的每个单词首字母大写
string.lower() 转换 string 中所有大写字符为小写
string.upper() 转换 string 中的小写字母为大写
string.swapcase() 翻转 string 中的大小写
11.4.2.4 文本对齐 - 3
方法 说明
string.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
11.4.2.5 去除空白字符 - 3
方法 说明
string.lstrip() 截掉 string 左边(开始)的空白字符
string.rstrip() 截掉 string 右边(末尾)的空白字符
string.strip() 截掉 string 左右两边的空白字符
11.4.2.6 拆分和连接 - 5
方法 说明
string.partition(str) 把字符串 string 分成一个 3 元素的元组 (str前面, str, str后面)
string.rpartition(str) 类似于 partition() 方法,不过是从右边开始查找
string.split(str="", num) 以 str 为分隔符拆分 string,如果 num 有指定值,则仅分隔 num + 1 个子字符串,str 默认包含 ‘\r’, ‘\t’, ‘\n’ 和空格
string.splitlines() 按照行(’\r’, ‘\n’, ‘\r\n’)分隔,返回一个包含各行作为元素的列表
string.join(seq) 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串

11.4.3 字符串的切片

  • 切片 方法适用于 字符串列表元组

    • 切片 使用 索引值 来限定范围,从一个大的 字符串切出 小的 字符串
    • 列表元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据
    • 字典 是一个 无序 的集合,是使用 键值对 保存数据

字符串[开始索引:结束索引:步长]

注意

  1. 指定的区间属于 左闭右开[开始索引, 结束索引) => 开始索引 >= 范围 < 结束索引
    起始 位开始,到 结束位的前一位 结束(不包含结束位本身)
  2. 从头开始,开始索引 数字可以省略,冒号不能省略
  3. 到末尾结束,结束索引 数字可以省略,冒号不能省略
  4. 步长默认为 1,如果连续切片,数字和冒号都可以省略

索引的顺序和倒序:

  • 在 Python 中不仅支持 顺序索引,同时还支持 倒序索引
  • 所谓倒序索引就是 从右向左 计算索引
    • 最右边的索引值是 -1,依次递减
num_str = "0123456789"# 1. 截取从 2 ~ 5 位置 的字符串
print(num_str[2:6])# 2. 截取从 2 ~ `末尾` 的字符串
print(num_str[2:])# 3. 截取从 `开始` ~ 5 位置 的字符串
print(num_str[:6])# 4. 截取完整的字符串
print(num_str[:])# 5. 从开始位置,每隔一个字符截取字符串
print(num_str[::2])# 6. 从索引 1 开始,每隔一个取一个
print(num_str[1::2])# 倒序切片
# -1 表示倒数第一个字符
print(num_str[-1])# 7. 截取从 2 ~ `末尾 - 1` 的字符串
print(num_str[2:-1])# 8. 截取字符串末尾两个字符
print(num_str[-2:])# 9. 字符串的逆序(面试题)
print(num_str[::-1])

11.5 公共方法

11.5.1 Python 内置函数

Python 包含了以下内置函数:

函数 描述 备注
len(item) 计算容器中元素个数
del(item) 删除变量 del 有两种方式
max(item) 返回容器中元素最大值 如果是字典,只针对 key 比较
min(item) 返回容器中元素最小值 如果是字典,只针对 key 比较
cmp(item1, item2) 比较两个值,-1 小于/0 相等/1 大于 Python 3.x 取消了 cmp 函数

注意

  • 字符串 比较符合以下规则: “0” < “A” < “a”

11.5.2 切片

描述 Python 表达式 结果 支持的数据类型
切片 “0123456789”[::-2] “97531” 字符串、列表、元组
  • 切片 使用 索引值 来限定范围,从一个大的 字符串切出 小的 字符串
  • 列表元组 都是 有序 的集合,都能够 通过索引值 获取到对应的数据
  • 字典 是一个 无序 的集合,是使用 键值对 保存数据

11.5.3 运算符

运算符 Python 表达式 结果 描述 支持的数据类型
+ [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表、元组
* [“Hi!”] * 4 [‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’] 重复 字符串、列表、元组
in 3 in (1, 2, 3) True 元素是否存在 字符串、列表、元组、字典
not in 4 not in (1, 2, 3) True 元素是否不存在 字符串、列表、元组、字典
> >= == < <= (1, 2, 3) < (2, 2, 3) True 元素比较 字符串、列表、元组

注意

  • in 在对 字典 操作时,判断的是 字典的键
  • innot in 被称为 成员运算符
  • 在对 字典 操作时,判断的是 字典的键

11.5.4 完整的 for 循环语法

Python 中完整的 for 循环 的语法如下:

for 变量 in 集合: 循环体代码
else:没有通过 break 退出循环,循环结束后,会执行的代码

11.5.5应用场景

  • 迭代遍历 嵌套的数据类型时,例如 一个列表包含了多个字典
  • 需求:要判断 某一个字典中 是否存在指定的值
    • 如果 存在,提示并且退出循环
    • 如果 不存在,在 循环整体结束 后,希望 得到一个统一的提示
students = [{"name": "阿土","age": 20,"gender": True,"height": 1.7,"weight": 75.0},{"name": "小美","age": 19,"gender": False,"height": 1.6,"weight": 45.0},
]find_name = "阿土"
for stu_dict in students:print(stu_dict)if stu_dict["name"] == find_name:print("找到了")break
else:print("没有找到")
print("循环结束")

12.综合应用–名片管理系统

系统需求

  1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单
**************************************************
欢迎使用【名片管理系统】V1.01. 新建名片
2. 显示全部
3. 查询名片0. 退出系统
**************************************************
  1. 用户用数字选择不同的功能
  2. 根据功能选择,执行不同的功能
  3. 用户名片需要记录用户的 姓名电话QQ邮件
  4. 如果查询到指定的名片,用户可以选择 修改 或者 删除 名片

12.1 框架搭建

12.1.1 文件准备

  1. 新建 cards_main.py 保存 主程序功能代码

    • 程序的入口
    • 每一次启动名片管理系统都通过 main 这个文件启动
  2. 新建 cards_tools.py 保存 所有名片功能函数
    • 将对名片的 新增查询修改删除 等功能封装在不同的函数中

12.1.2 编写主运行循环

cards_main 中添加一个 无限循环

while True:# TODO(小明) 显示系统菜单action = input("请选择操作功能:")print("您选择的操作是:%s" % action)# 根据用户输入决定后续的操作if action in ["1", "2", "3"]:passelif action == "0":print("欢迎再次使用【名片管理系统】")breakelse:print("输入错误,请重新输入")

字符串判断:

if action in ["1", "2", "3"]:
  1. 使用 in 针对 列表 判断,避免使用 or 拼接复杂的逻辑条件
  2. 没有使用 int 转换用户输入,可以避免 一旦用户输入的不是数字,导致程序运行出错

pass:

  • pass 就是一个空语句,不做任何事情,一般用做占位语句
  • 是为了保持程序结构的完整性

TODO 注释:

  • # 后跟上 TODO,用于标记需要去做的工作
# TODO(作者/邮件) 显示系统菜单

12.1.3 在 cards_tools 中增加四个新函数

def show_menu():"""显示菜单"""passdef new_card():"""新建名片"""print("-" * 50)print("功能:新建名片")def show_all():"""显示全部"""print("-" * 50)print("功能:显示全部")def search_card():"""搜索名片"""print("-" * 50)print("功能:搜索名片")

12.1.4 导入模块

cards_main.py 中使用 import 导入 cards_tools 模块

import cards_tools

修改 while 循环的代码如下:

import cards_tools
while True:cards_tools.show_menu()action = input("请选择操作功能:")print("您选择的操作是:%s" % action)# 根据用户输入决定后续的操作if action in ["1", "2", "3"]:if action == "1":cards_tools.new_card()elif action == "2":cards_tools.show_all()elif action == "3":cards_tools.search_card()elif action == "0":print("欢迎再次使用【名片管理系统】")breakelse:print("输入错误,请重新输入:")

至此:cards_main 中的所有代码全部开发完毕

1.5 完成 show_menu 函数

def show_menu():"""显示菜单"""print("*" * 50)print("欢迎使用【菜单管理系统】V1.0")print("")print("1. 新建名片")print("2. 显示全部")print("3. 查询名片")print("")print("0. 退出系统")print("*" * 50)

12.2 保存名片数据的结构

  • 使用 字典 记录 每一张名片 的详细信息
  • 使用 列表 统一记录所有的 名片字典

定义名片列表变量

  • cards_tools 文件的顶部增加一个 列表变量
# 所有名片记录的列表
card_list = []

注意

  1. 所有名片相关操作,都需要使用这个列表,所以应该 定义在程序的顶部
  2. 程序刚运行时,没有数据,所以是 空列表

12.3 新增名片

12.3.1 功能分析

  1. 提示用户依次输入名片信息
  2. 将名片信息保存到一个字典
  3. 将字典添加到名片列表
  4. 提示名片添加完成

12.3.2 实现 new_card 方法

def new_card():"""新建名片"""print("-" * 50)print("功能:新建名片")# 1. 提示用户输入名片信息name = input("请输入姓名:")phone = input("请输入电话:")qq = input("请输入 QQ 号码:")email = input("请输入邮箱:")# 2. 将用户信息保存到一个字典card_dict = {"name": name,"phone": phone,"qq": qq,"email": email}# 3. 将用户字典添加到名片列表card_list.append(card_dict)print(card_list)# 4. 提示添加成功信息print("成功添加 %s 的名片" % card_dict["name"])

技巧:在 PyCharm 中,可以使用 SHIFT + F6 统一修改变量名

12.4 显示所有名片

12.4.1 功能分析

  • 循环遍历名片列表,顺序显示每一个字典的信息

12.4.2 基础代码实现

def show_all():"""显示全部"""print("-" * 50)print("功能:显示全部")for card_dict in card_list:print(card_dict)

12.4.3 增加标题和使用 \t 显示

def show_all():"""显示全部"""print("-" * 50)print("功能:显示全部")# 打印表头for name in ["姓名", "电话", "QQ", "邮箱"]:print(name, end="\t\t")print("")# 打印分隔线print("=" * 50)for card_dict in card_list:print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],card_dict["phone"],card_dict["qq"],card_dict["email"]))

12.4.4 增加没有名片记录判断

def show_all():"""显示全部"""print("-" * 50)print("功能:显示全部")# 1. 判断是否有名片记录if len(card_list) == 0:print("提示:没有任何名片记录")return

注意

  • 在函数中使用 return 表示返回
  • 如果在 return 后没有跟任何内容,只是表示该函数执行到此就不再执行后续的代码

12.5 查询名片

12.5.1 功能分析

  1. 提示用户要搜索的姓名
  2. 根据用户输入的姓名遍历列表
  3. 搜索到指定的名片后,再执行后续的操作

12.5.2 代码实现

查询功能实现

def search_card():"""搜索名片"""print("-" * 50)print("功能:搜索名片")# 1. 提示要搜索的姓名find_name = input("请输入要搜索的姓名:")# 2. 遍历字典for card_dict in card_list:if card_dict["name"] == find_name:print("姓名\t\t\t电话\t\t\tQQ\t\t\t邮箱")print("-" * 40)            print("%s\t\t\t%s\t\t\t%s\t\t\t%s" % (card_dict["name"],card_dict["phone"],card_dict["qq"],card_dict["email"]))print("-" * 40)           # TODO(小明) 针对找到的字典进行后续操作:修改/删除breakelse:print("没有找到 %s" % find_name)
  • 增加名片操作函数:修改/删除/返回主菜单
def deal_card(find_dict):"""操作搜索到的名片字典:param find_dict:找到的名片字典"""print(find_dict)action_str = input("请选择要执行的操作 ""[1] 修改 [2] 删除 [0] 返回上级菜单")if action == "1":print("修改")elif action == "2":print("删除")

12.6 修改和删除

12.6.1 查询成功后删除名片

  • 由于找到的字典记录已经在列表中保存
  • 要删除名片记录,只需要把列表中对应的字典删除即可
    elif action == "2":card_list.remove(find_dict)print("删除成功")

12.6.2 修改名片

由于找到的字典记录已经在列表中保存
要修改名片记录,只需要把列表中对应的字典中每一个键值对的数据修改即可

    if action == "1":find_dict["name"] = input("请输入姓名:")find_dict["phone"] = input("请输入电话:")find_dict["qq"] = input("请输入QQ:")find_dict["email"] = input("请输入邮件:")print("%s 的名片修改成功" % find_dict["name"])

修改名片细化:

  • 如果用户在使用时,某些名片内容并不想修改,应该如何做呢?—— 既然系统提供的 input 函数不能满足需求,那么就新定义一个函数 input_card_info 对系统的 input 函数进行扩展
def input_card_info(dict_value, tip_message):"""输入名片信息:param dict_value: 字典原有值:param tip_message: 输入提示信息:return: 如果输入,返回输入内容,否则返回字典原有值"""# 1. 提示用户输入内容result_str = input(tip_message)# 2. 针对用户的输入进行判断,如果用户输入了内容,直接返回结果if len(result_str) > 0:return result_str# 3. 如果用户没有输入内容,返回 `字典中原有的值`else:        return dict_value

12.7 Linux 上的 Shebang 符号(#!)

  • #!这个符号叫做 Shebang 或者 Sha-bang
  • Shebang 通常在 Unix 系统脚本的中 第一行开头 使用
  • 指明 执行这个脚本文件解释程序

使用 Shebang 的步骤:

  1. 使用 which 查询 python3 解释器所在路径
$ which python3
  1. 修改要运行的 主 python 文件,在第一行增加以下内容
#! /usr/bin/python3
  1. 修改 主 python 文件 的文件权限,增加执行权限
$ chmod +x cards_main.py
  1. 在需要时执行程序即可
./cards_main.py

12.8 完整代码

#! /usr/bin/python3import cards_tools# 无限循环,由用户主动决定什么时候退出循环!
while True:# 显示功能菜单cards_tools.show_menu()action_str = input("请选择希望执行的操作:")print("您选择的操作是【%s】" % action_str)# 1,2,3 针对名片的操作if action_str in ["1", "2", "3"]:# 新增名片if action_str == "1":cards_tools.new_card()# 显示全部elif action_str == "2":cards_tools.show_all()# 查询名片elif action_str == "3":cards_tools.search_card()# 0 退出系统elif action_str == "0":print("欢迎再次使用【名片管理系统】")break# 如果在开发程序时,不希望立刻编写分支内部的代码# 可以使用 pass 关键字,表示一个占位符,能够保证程序的代码结构正确!# 程序运行时,pass 关键字不会执行任何的操作!# pass# 其他内容输入错误,需要提示用户else:print("您输入的不正确,请重新选择")
# 记录所有的名片字典
card_list = []def show_menu():"""显示菜单"""print("*" * 50)print("欢迎使用【名片管理系统】V 1.0")print("")print("1. 新增名片")print("2. 显示全部")print("3. 搜索名片")print("")print("0. 退出系统")print("*" * 50)def new_card():"""新增名片"""print("-" * 50)print("新增名片")# 1. 提示用户输入名片的详细信息name_str = input("请输入姓名:")phone_str = input("请输入电话:")qq_str = input("请输入QQ:")email_str = input("请输入邮箱:")# 2. 使用用户输入的信息建立一个名片字典card_dict = {"name": name_str,"phone": phone_str,"qq": qq_str,"email": email_str}# 3. 将名片字典添加到列表中card_list.append(card_dict)print(card_list)# 4. 提示用户添加成功print("添加 %s 的名片成功!" % name_str)def show_all():"""显示所有名片"""print("-" * 50)print("显示所有名片")# 判断是否存在名片记录,如果没有,提示用户并且返回if len(card_list) == 0:print("当前没有任何的名片记录,请使用新增功能添加名片!")# return 可以返回一个函数的执行结果# 下方的代码不会被执行# 如果 return 后面没有任何的内容,表示会返回到调用函数的位置# 并且不返回任何的结果return# 打印表头for name in ["姓名", "电话", "QQ", "邮箱"]:print(name, end="\t\t")print("")# 打印分隔线print("=" * 50)# 遍历名片列表依次输出字典信息for card_dict in card_list:print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],card_dict["phone"],card_dict["qq"],card_dict["email"]))def search_card():"""搜索名片"""print("-" * 50)print("搜索名片")# 1. 提示用户输入要搜索的姓名find_name = input("请输入要搜索的姓名:")# 2. 遍历名片列表,查询要搜索的姓名,如果没有找到,需要提示用户for card_dict in card_list:if card_dict["name"] == find_name:print("姓名\t\t电话\t\tQQ\t\t邮箱")print("=" * 50)print("%s\t\t%s\t\t%s\t\t%s" % (card_dict["name"],card_dict["phone"],card_dict["qq"],card_dict["email"]))# 针对找到的名片记录执行修改和删除的操作deal_card(card_dict)breakelse:print("抱歉,没有找到 %s" % find_name)def deal_card(find_dict):"""处理查找到的名片:param find_dict: 查找到的名片"""print(find_dict)action_str = input("请选择要执行的操作 ""[1] 修改 [2] 删除 [0] 返回上级菜单")if action_str == "1":find_dict["name"] = input_card_info(find_dict["name"], "姓名:")find_dict["phone"] = input_card_info(find_dict["phone"], "电话:")find_dict["qq"] = input_card_info(find_dict["qq"], "QQ:")find_dict["email"] = input_card_info(find_dict["email"], "邮箱:")print("修改名片成功!")elif action_str == "2":card_list.remove(find_dict)print("删除名片成功!")def input_card_info(dict_value, tip_message):"""输入名片信息:param dict_value: 字典中原有的值:param tip_message: 输入的提示文字:return: 如果用户输入了内容,就返回内容,否则返回字典中原有的值"""# 1. 提示用户输入内容result_str = input(tip_message)# 2. 针对用户的输入进行判断,如果用户输入了内容,直接返回结果if len(result_str) > 0:return result_str# 3. 如果用户没有输入内容,返回 `字典中原有的值`else:return dict_value

13. 变量进阶

13.1 变量的引用

变量 和 数据 都是保存在 内存 中的
Python函数 的 参数传递 以及 返回值 都是靠 引用 传递的

Python
变量数据 是分开存储的,数据 保存在内存中的一个位置,变量 中保存着数据在内存中的地址,变量记录数据的地址,就叫做 引用
使用 id() 函数可以查看变量中保存数据所在的 内存地址

13.2 可变和不可变类型

不可变类型,内存中的数据不允许被修改:

  • 数字类型 int, bool, float, complex, long(2.x)
  • 字符串 str
  • 元组 tuple

可变类型,内存中的数据可以被修改:

  • 列表 list
  • 字典 dict

注意:字典的 key 只能使用不可变类型的数据

哈希 (hash)

Python 中内置有一个名字叫做 hash(o) 的函数
接收一个 不可变类型 的数据作为 参数返回 结果是一个 整数,其作用就是提取数据的 特征码(指纹)
Python 中,设置字典的 键值对 时,会首先对 key 进行 hash 已决定如何在内存中保存字典的数据,以方便 后续 对字典的操作:增、删、改、查

13.3 局部变量和全局变量

13.3.1 局部变量

  • 局部变量 是在 函数内部 定义的变量,只能在函数内部使用
  • 函数执行结束后,函数内部的局部变量,会被系统回收
  • 不同的函数,可以定义相同的名字的局部变量,但是 彼此之间 不会产生影响

局部变量的作用:在函数内部使用,临时 保存 函数内部需要使用的数据

13.3.2 全局变量

全局变量 是在 函数外部定义 的变量,所有函数内部都可以使用这个变量

注意:函数执行时,需要处理变量时 会:

  1. 首先 查找 函数内部 是否存在 指定名称 的局部变量如果有,直接使用
  2. 如果没有,查找 函数外部 是否存在 指定名称 的全局变量如果有,直接使用
  3. 如果还没有,程序报错!
13.3.2.1 函数不能直接修改 全局变量的引用

在函数内部,可以 通过全局变量的引用获取对应的数据,但是不允许直接修改全局变量的引用 —— 使用赋值语句修改全局变量的值

注意:在函数内部定义了一个局部变量,只是变量名相同 —— 在函数内部不能直接修改全局变量的值

13.3.2.2 在函数内部修改全局变量的值

如果在函数中需要修改全局变量,需要使用 global 进行声明

num = 10
def demo1():# global 关键字,告诉 Python 解释器 num 是一个全局变量global num# 只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已num = 100print(num)
demo1()
print("over")
13.3.2.3 全局变量定义的位置

为了保证所有的函数都能够正确使用到全局变量,应该 将全局变量定义在其他函数的上方

代码结构示意图如下

13.3.2.4 全局变量命名的建议

为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:全局变量名前应该增加 g_ 或者 gl_ 的前缀

14. 函数进阶

  • 函数参数和返回值的作用
  • 函数的返回值 进阶
  • 函数的参数 进阶
  • 递归函数

14.1 函数参数和返回值的作用

  1. 如果函数 内部处理的数据不确定,就可以将外界的数据以参数传递到函数内部
  2. 如果希望一个函数 执行完成后,向外界汇报执行结果,就可以增加函数的返回值

14.1.1 无参数,无返回值

  1. 只是单纯地做一件事情,例如 显示菜单
  2. 在函数内部 针对全局变量进行操作,例如:新建名片,最终结果 记录在全局变量

注意:
如果全局变量的数据类型是一个 可变类型,在函数内部可以使用 方法 修改全局变量的内容 —— 变量的引用不会改变
在函数内部,使用赋值语句 才会 修改变量的引用

14.1.2 无参数,有返回值

采集数据,例如 温度计,返回结果就是当前的温度,而不需要传递任何的参数

14.1.3 有参数,无返回值

函数内部的代码保持不变,针对 不同的参数 处理 不同的数据
例如 名片管理系统 针对 找到的名片修改删除 操作

14.1.4 有参数,有返回值

函数内部的代码保持不变,针对 不同的参数 处理 不同的数据,并且 返回期望的处理结果
例如 名片管理系统 使用 字典默认值提示信息 提示用户输入内容

  • 如果输入,返回输入内容
  • 如果没有输入,返回字典默认值

14.2 函数的返回值 进阶

问题:一个函数执行后能否返回多个结果?

14.2.1 温度和湿度测量

假设要开发一个函数能够同时返回当前的温度和湿度

def measure():"""返回当前的温度"""print("开始测量...")temp = 39wetness = 10print("测量结束...")return (temp, wetness)

提示:如果一个函数返回的是元组,括号可以省略

技巧

Python 中,可以 将一个元组 使用 赋值语句 同时赋值给 多个变量
注意:变量的数量需要和元组中的元素数量保持一致

result = temp, wetness = measure()

14.2.2 面试题 —— 交换两个数字

题目要求

  1. 有两个整数变量 a = 6, b = 100
  2. 不使用其他变量,交换两个变量的值

解法 1 —— 使用其他变量

# 解法 1 - 使用临时变量
c = b
b = a
a = c

解法 2 —— 不使用临时变量

# 解法 2 - 不使用临时变量
a = a + b
b = a - b
a = a - b

解法 3 —— Python 专有,利用元组

a, b = b, a

14.3 函数的参数 进阶

14.3.1. 不可变和可变的参数

  1. 无论传递的参数是 可变 还是 不可变 ,只要 针对参数 使用 赋值语句,会在 函数内部 修改 局部变量的引用不会影响到 外部变量的引用

  2. 传递的参数是 可变类型,在函数内部,使用 方法 修改了数据的内容,同样会影响到外部的数据

def mutable(num_list):num_list.extend([1, 2, 3])print(num_list)gl_list = [6, 7, 8]
mutable(gl_list)
print(gl_list)

面试题 —— +=

  • python 中,列表变量调用 += 本质上是在执行列表变量的 extend 方法,不会修改变量的引用

14.3.2 缺省参数

定义函数时,可以给 某个参数 指定一个默认值,具有默认值的参数就叫做 缺省参数,调用函数时,如果没有传入 缺省参数 的值,则在函数内部使用定义函数时指定的 参数默认值,函数的缺省参数,将常见的值设置为参数的缺省值,从而 简化函数的调用
例如:对列表排序的方法

gl_num_list = [6, 3, 9]# 默认就是升序排序,因为这种应用需求更多
gl_num_list.sort()
print(gl_num_list)# 只有当需要降序排序时,才需要传递 `reverse` 参数
gl_num_list.sort(reverse=True)
print(gl_num_list)
14.3.2.1 指定函数的缺省参数

在参数后使用赋值语句,可以指定参数的缺省值

def print_info(name, gender=True):gender_text = "男生"if not gender:gender_text = "女生"print("%s 是 %s" % (name, gender_text))

提示

  1. 缺省参数,需要使用 最常见的值 作为默认值!
  2. 如果一个参数的值 不能确定,则不应该设置默认值,具体的数值在调用函数时,由外界传递!
14.3.2.2 缺省参数的注意事项
  1. 缺省参数的定义位置
    必须保证 带有默认值的缺省参数 在参数列表末尾
def print_info(name, gender=True, title):
  1. 调用带有多个缺省参数的函数
    调用函数时,如果有 多个缺省参数需要指定参数名,这样解释器才能够知道参数的对应关系!
def print_info(name, title="", gender=True):gender_text = "男生"if not gender:gender_text = "女生"print("%s%s 是 %s" % (title, name, gender_text))print_info("小明")
print_info("老王", title="班长")
print_info("小美", gender=False)

14.3.3 多值参数

14.3.3.1 定义支持多值参数的函数

有时可能需要 一个函数 能够处理的参数 个数 是不确定的,这个时候,就可以使用 多值参数
python 中有 两种 多值参数:

  • 参数名前增加 一个 * 可以接收 元组
  • 参数名前增加 两个 * 可以接收 字典

一般在给多值参数命名时,习惯使用以下两个名字

  • *args —— 存放 元组 参数,前面有一个 *

  • **kwargs —— 存放 字典 参数,前面有两个 *

    `args` 是 `arguments` 的缩写,有变量的含义`kw` 是 `keyword` 的缩写,`kwargs` 可以记忆 **键值对参数**
    
def demo(num, *args, **kwargs):print(num)print(args)print(kwargs)demo(1, 2, 3, 4, 5, name="小明", age=18, gender=True)
14.3.3.2 计算任意多个数字的和

需求

  1. 定义一个函数 sum_numbers,可以接收的 任意多个整数
  2. 功能要求:将传递的 所有数字累加 并且返回累加结果
def sum_numbers(*args):num = 0# 遍历 args 元组顺序求和for n in args:num += nreturn numprint(sum_numbers(1, 2, 3))
14.3.3.3 元组和字典的拆包

在调用带有多值参数的函数时,如果希望:

  • 将一个 元组变量,直接传递给 args
  • 将一个 字典变量,直接传递给 kwargs

就可以使用 拆包,简化参数的传递,拆包 的方式是:

  • 元组变量前,增加 一个 *
  • 字典变量前,增加 两个 *
def demo(*args, **kwargs):print(args)print(kwargs)# 需要将一个元组变量/字典变量传递给函数对应的参数
gl_nums = (1, 2, 3)
gl_xiaoming = {"name": "小明", "age": 18}# 会把 num_tuple 和 xiaoming 作为元组传递个 args
# demo(gl_nums, gl_xiaoming)
demo(*gl_nums, **gl_xiaoming)

14.4 函数的递归

14.4.1 递归函数的特点

  1. 函数内部的 代码 是相同的,只是针对 参数 不同,处理的结果不同
  2. 参数满足一个条件 时,函数不再执行。这个非常重要,通常被称为递归的出口,否则 会出现死循环
def sum_numbers(num):print(num)# 递归的出口很重要,否则会出现死循环if num == 1:returnsum_numbers(num - 1)sum_numbers(3)

14.4.2 计算数字累加

需求

  1. 定义一个函数 sum_numbers
  2. 能够接收一个 num 的整数参数
  3. 计算 1 + 2 + … num 的结果
def sum_numbers(num):if num == 1:return 1# 假设 sum_numbers 能够完成 num - 1 的累加temp = sum_numbers(num - 1)# 函数内部的核心算法就是 两个数字的相加return num + tempprint(sum_numbers(2))

传送门

下一章:Python 第二部分 面向对象

Python 第一部分 Python基础相关推荐

  1. 美女讲师教你学Python第一季:基础入门-秦红华-专题视频课程

    美女讲师教你学Python第一季:基础入门-448人已学习 课程介绍         本课程以最新的Python3为基础,面向Python编程语言的初学者: 精选教材,内容反复锤炼,精炼详实,既有实用 ...

  2. 趣学PYTHON 第一章python不是大蟒蛇

    趣学PYTHON 第一章python不是大蟒蛇 把我自己的学习记录在这里,留下一片回忆. Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:3 ...

  3. bigbrother的python第一天 复习基础知识

    一, 关于编写 1, python是不同层级进行缩进的 2, 单行注释使用# 多行使用''' ''' 二, 关于数据类型 Tuple是(),不可变的 List是[] 是可变的 字典dict 是{},是 ...

  4. Python第一天学习---基础语法

    1.字符串的用法(String) Python 中的字符串有两种索引方式,从左往右以 0 开始,从右往左以 -1 开始. Python中的字符串不能改变. Python 没有单独的字符类型,一个字符就 ...

  5. python导入excel模块_Excel到python第一章python利用pandas和numpy模块导入数据

    原博文 2019-08-29 21:18 − import numpy as np import pandas as pd # 导入数据 # 读取csv数据 df = pd.read_csv(open ...

  6. 第一章 python筑基

    python 第一章 python基础 print函数:输出变量或者对象的值.接下来我们会经常用到,再次不做赘述. 如果对于该函数不了解的,可以通过help(print)和help(print())查 ...

  7. python 论坛搭建_Python第一课 - python的开发环境的搭建

    Python第一课 - python的开发环境的搭建 一.下载安装Python的安装包 打开官网 https://www.python.org/downloads/windows/ 下载中心 [标记为 ...

  8. python课程怎么样-python课程体系是怎么样的?

    好的python课程体系是怎么样的? Python从1991年走到今天,已经有了28年的历史了,在开发行业来说也是老江湖了,那么python为什么可以在开发行业屹立不倒呢?其实python最吸引程序员 ...

  9. python代码基础题-python第一部分基础题1-80题

    各位Python的第一部分1-80道基础题已经整理好了,希望面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之 ...

最新文章

  1. 需要恢复中断状态的一个场景
  2. linux 批量重命名文件
  3. 电源适配器变压器计算与元器件选型、细,全!【上篇-适配器设计计算23步骤】...
  4. pyqt5中信号与槽的认识
  5. 解决归档出错,ORA-00257: archiver error. Connect internal only, until freed.
  6. 软件工程概论_课堂测试
  7. SQL Server2000 “mcc 无法创建管理单元”
  8. 容器源码分析之TreeMap(十)
  9. 电脑知识:磁盘分区相关知识笔记!
  10. ASP.NET Core 2.0 : 图说管道,唐僧扫塔的故事
  11. Spring Boot –使用执行器端点在运行时配置日志级别
  12. (转) Dockerfile 中的 COPY 与 ADD 命令
  13. java输出hello word,教你如何配置java环境输出"hello word!"?
  14. poj 楼天成的男人八题系列 A New Stone Game 博弈问题
  15. GartnerSynergy:一场IBM云业务营收引发的争议
  16. java 打印数据_Java 中的打印流
  17. [插件安装] VS插件番茄的安装
  18. 编程-----相反数求解算法
  19. 大话设计模式之设计原则
  20. 弹跳蚂蚱 Jumping Grasshopper

热门文章

  1. rocket MQ 实战应用
  2. javaweb(八)文件上传
  3. 直接插入排序算法C++实现
  4. Ubuntu安装Anaconda详细步骤
  5. Photoshop CS4 存储与载入选区
  6. 机器学习-自动筛选特征
  7. DEFCON议题解读|Dll劫持新思路——修改环境变量
  8. chrome android 分屏,谷歌开发Android平板分屏多任务功能
  9. python 多线程编程
  10. android 前摄屏幕补光,没有光线时该如何自拍?OPPO R9屏幕补光帮你忙