目录
[1. 顺序结构](#1. 顺序结构)
[2. 选择结构](#2. 选择结构)
[3. 循环结构](#3. 循环结构)
[a. range函数](#a. range函数)
[b. break 和 continue 语句](#b. break 和 continue 语句)
[c. 循环的 else 子句](#c. 循环的 else 子句)
[1. pass语句](#1. pass语句)
[2. match语句](#2. match语句)
[1. 定义函数](#1. 定义函数)
[2. 局部变量符号表](#2. 局部变量符号表)
[3. 默认值参数](#3. 默认值参数)
[4. 关键字参数](#4. 关键字参数)
[5. 实参列表](#5. 实参列表)
[6. 字典参数](#6. 字典参数)
[7. 函数注解](#7. 函数注解)
一、三种控制结构
1. 顺序结构
- 从上往下,从左至右。
2. 选择结构
3. 循环结构
- Python中的for循环和其他语言中的增强for循环不同,更像他们中的增强for循环或范围for。
- Python 的
for
语句没有迭代条件不能++。- 没有结束循环的判断条件。
- 只能在迭代器上迭代,按它们在序列中出现的顺序。
- 声明循环时后面有一个 :
a. range函数
讲到Python的循环就不得不讲到Python中的range函数:
b. break
和 continue
语句
c. 循环的 else
子句
二、其他语句
1. pass语句
pass 语句不执行任何动作。语法上需要一个语句,但程序毋需执行任何动作时,可以使用该语句。
- 需要一个什么都不做的死循环时,可以使用pass。
- 需要一个最小的类时可以使用pass。
class MyClass: pass- 需要一个什么都不做的函数时,可以使用pass。
- pass还可以当作占位符。
2. match语句
match 语句看起来像 C、Java 或 JavaScript(以及许多其他程序设计语言)中的 switch 语句,但其实它更像 Rust 或 Haskell 中的模式匹配。因为它只有第一个匹配的模式会被执行,并且它还可以提取值的组成部分(序列的元素或对象的属性)赋给变量。
- Python 3.10 版本后引入的。博主的python3.6用不了。(python --version 查看python的版本)
- match只执行第一个匹配的模式,不存在switch那样的穿透现象。
三、定义函数
1. 定义函数
2. 局部变量符号表
函数在 执行 时使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;
引用变量时,首先,在局部符号表里查找变量,然后,是外层函数局部符号表,再是全局符号表,最后是内置名称符号表。因此,尽管可以引用全局变量和外层函数的变量,但最好不要在函数内直接赋值(除非是 global 语句定义的全局变量,或 nonlocal 语句定义的外层函数变量)。
在调用函数时会将实际参数(实参)引入到被调用函数的局部符号表中;因此,实参是使用 按值调用 来传递的(其中的 值 始终是对象的 引用 而不是对象的值)。 [1] 当一个函数调用另外一个函数时,会为该调用创建一个新的局部符号表。
函数定义在当前符号表中把函数名与函数对象关联在一起。解释器把函数名指向的对象作为用户自定义函数。还可以使用其他名称指向同一个函数对象,并访问访该函数:
python>>> def fib(): pass >>> fib <function fib at 10042ed0>
3. 默认值参数
- 和C++中的缺省参数的使用规则一致。
- 定义时从右到左来定义默认值参数。
- 调用函数时,从左到右传参。
- 无论是定义还是调用,中间都不允许有空缺值。不允许出现:def fib(a = 1, b, c=3): pass
和 fib(,3,);这种情况。- 和C++的缺省参数不同的是,Python的默认值参数可以用变量来定义:
- 注意: 默认值只计算一次,即使是使用变量来定义的,他也不会随着变量修改,一直使用的是变量定义时的值。
- 所以默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果。因为默认值参数的值不变,所以每一次调用都使用的是同一个列表、字典或类实例。
- 如果不想多次调用共享同一个默认值,可以这样写:
4. 关键字参数
- 关键字参数就是指在调用函数时通过参数名来给参数赋值。这种key=value的形式就叫关键字参数。
- 关键字参数的作用在于:在函数的参数都有默认值的情况下,我们可以通过关键字参数来指定给某个参数赋值 。
- 注意,使用关键字参数必须保证前面的位置参数都已经被赋值。(位置参数就是没有默认值的参数)
- 有了关键字参数,我们可以在调用函数时不按参数定义的顺序来赋值:
5. 实参列表
- 可以接收多个值,有点像Java中的可变长参数。
- 在普通参数的参数名前加一个*,就变成了实参列表,它可以接收多个值。
- 不像Java中的可变长参数,在Python中对实参列表定义的位置没有要求。但是在实参列表后面的所有普通参数,都只能通过关键字参数的形式来调用。
- 实参列表生成的是一个元组,可以通过*来解包
6. 字典参数
- 还有一种可以接收字典的字典参数
- 定义函数时字典参数必须放在最后面 :
- 一个函数只能有一个字典参数:
7. 函数注解
- 可以在参数后加上**:参数类型**来标注参数类型。
- 可以在函数声明后加上**-> 返回值类型**来标注返回值类型。
- 可以通过**函数名.annotations**来获取函数注解。
四、Python编码风格
Python 项目大多都遵循 PEP 8 的风格指南;它推行的编码风格易于阅读、赏心悦目。Python 开发者均应抽时间悉心研读;以下是该提案中的核心要点:
缩进,用 4 个空格,不要用制表符。(不同软件中Tab的空格数是不一样的)
4 个空格是小缩进(更深嵌套)和大缩进(更易阅读)之间的折中方案。制表符会引起混乱,最好别用。
换行,一行不超过 79 个字符。
这样换行的小屏阅读体验更好,还便于在大屏显示器上并排阅读多个代码文件。
用空行分隔函数和类,及函数内较大的代码块。
最好把注释放到单独一行。
使用文档字符串。
运算符前后、逗号后要用空格:
a = f(1, 2) + g(3, 4)
。类和函数的命名要一致;按惯例,命名类用
UpperCamelCase(大驼峰命名法)
,命名函数与方法用lowercase_with_underscores(
下画线命名法)
。编写用于国际多语环境的代码时,不要用生僻的编码。Python 默认的 UTF-8 或纯 ASCII 可以胜任各种情况。
同理,就算多语阅读、维护代码的可能再小,也不要在标识符中使用非 ASCII 字符。
------------------------END-------------------------
才疏学浅,谬误难免,欢迎各位批评指正。