基础语法
优美优于丑陋,明了优于隐晦简单优于复杂,复杂优于繁杂
扁平优于嵌套,稀疏优于稠密
可读性很重要!
特例亦不可违背原则,即使实用比纯粹更优。错误绝不能悄悄忽略,除非它明确需要如此
面对不确定性,拒绝妄加猜测。
任何问题应有一种,且最好只有一种,显而易见的解决方法。
做优于不做,然而不假思索还不 如不做。
很难解释的,必然是坏方法。
很好解释的,可能是好方法。
中文翻译为Python之禅,可以理解为Python语言的设计哲学。
缩进
Python 最具特色的就是使用缩进来表示代码块。不需要使用大括号 。
缩进的空格数是可变的,常见的有2个空格、4个空格、8个空格。但是同一个代码块的语句必须包含相同的缩进空格数。
后来出台的代码规范PEP 8,建议使用4个空格作为缩进。
if True:
print ("True")
else:
print ("False")
注释
注释是代码中不会被Python解释器执行的文本。用于解释代码,方便阅读。
Python 支持单行注释和多行注释。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 在过去,需要py文件编码声明utf-8才能正常显示中文,不过现在只有使用其他编码(如 GBK)时才需要声明。
# 单行注释使用#号,可以单独一行写在代码上方
a = 1
b = 2 # 也可以写在代码后面
"""
多行注释使用三个双引号。
通常写在代码文件的最上方,描述这个代码文件的用途。
或者写在函数、方法内,描述这个函数、方法的用途。
"""
# 在函数、类、方法中,可以使用三个双引号添加注释,这样的注释称为文档字符串(docstring)。
# 可以被正确解析为函数的属性。
# 在 docstring 前后都没有空行。
# 即便只有一行,也推荐这样写,这使得以后扩展它变得容易。
# 单行文档字符串不应是重复函数/方法参数的“签名”,最好写一些有用的信息,例如功能、参数的含义、返回值的含义。
def add_numbers(a,b):
"""
实现一个求和的函数
:param a: 第一个数
:param b: 第二个数
:return: 两数之和
"""
return a+b
print(add_numbers.__doc__)
# 输出:
# 实现一个求和的函数
# :param a: 第一个数
# :param b: 第二个数
# :return: 两数之和
class Person:
"""Person类,描述一个Person对象"""
def __init__(self, name, age):
"""初始化一个Person对象"""
pass
print(Person.__doc__)
# 输出:
# Person类,描述一个Person对象
print(Person.__init__.__doc__)
# 输出:
# 初始化一个Person对象
如果你违反这些惯例,最坏的结果也不过是招来一些不友好的目光。
但有些软件(如 PEP 256 和 PEP 258 的 Docutils 文档字符串处理系统)会知晓这些惯例,因此遵循它们将为你带来最佳效果。
丰富的内置内容
Python易于学习的另外一个原因,就是丰富的内置内容。所有的内置对象在代码编辑器中都会有Code Highlight?。
内置保留字
保留字即关键字,是Python语言中预先定义的标识符。
我们把它们用作标识符名称会引发错误或导致其功能失效。
Python 的标准库提供了一个 keyword module,可以输出当前版本的所有保留字,后续我们会深入学习每一个保留字的作用。
import keyword
print(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基础语法,确实可以只学习这六类基础数据类型。
事实上,Python3.12内置有数据类型非常多。
注意:Python中,
bool
是int
的子类。
而且Python中你自己创建一个新类,设置一下实例,就是一种新的数据类型。
内置异常
异常是Python中用于处理错误和异常情况的关键机制。
内置函数
内置函数指的是Python解释器自带的函数,不需要导入模块、不需要定义就可以使用。
内置常量
Python3.12中,内置常量有:
Ellipsis
: 用于切片操作,等价于...
。False
: 布尔值False。None
: 空值。NotImplemented
: 用于在类中重载运算符,表示该运算符未实现。True
: 布尔值True。__debug__
: 用于判断是否为开发模式(注意与调试模式区分)。
对于常量我们倾向用is
判断是否相等,而不是==
。
对于Ellipsis
,我们实际使用中,一般使用...
来代替。
import numpy as np
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a[Ellipsis]) # 输出整个列表
# 等价于
print(a[...])
# 判断...是否是Ellipsis
print(... is Ellipsis) # 输出True
标准库
标准库就是内置的模块库,不需要安装,直接导入就可以使用。
运算符
运算符和内置部分一样,可以直接使用。我们假设a = 10
,b = 20
。
算术运算符
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b 输出结果 30 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
/ | 除 - x 除以 y | b / a 输出结果 2 |
// | 整除 - 返回商的整数部分(地板除法,向下取整) | 9 // 2 输出结果 4 |
% | 取模 - 返回除法的余数 | b % a 输出结果 0 |
** | 幂 - 返回 x 的 y 次幂 | a**b 为 10 的 20 次方, 输出结果 100000000000000000000 |
比较(关系)运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True. |
> | 大于 - 返回 x 是否大于 y | (a > b) 返回 False。 |
< | 小于 - 返回 x 是否 小于 y。返回True或False。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回 x 是否大于等于 y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回 x 是否小于等于 y。 | (a <= b) 返回 True。 |
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | 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 |
逻辑运算符
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 该运算符返回的值不一定为布尔值,如果 x 为 False 或假值,返回 x 的值,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔"或" - 该运算符返 回的值不一定为布尔值,如果 x 为 True 或真值,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔"非" - 该运算符返回的值为布尔值,如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符 | a & b 输出结果 0 ,二进制解释: 0000 0000 |
| | 按位或运算符 | a | b 输出结果 30 ,二进制解释: 0001 1110 |
^ | 按位异或运算符 | a ^ b 输出结果 30 ,二进制解释: 0001 1110 |
~ | 按位取反运算符 | ~a 输出结果 -11 ,二进制解释: 在补码形式中为 ~10 = -(10+1) = -11 |
<< | 左移动运算符 | a << 2 输出结果 40 ,二进制解释: 0010 1000 |
>> | 右移动运算符 | a >> 2 输出结果 2 ,二进制解释: 0000 0010 |
成员运算符
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
身份运算符
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
运算符优先级
运算符 | 描述 |
---|---|
** | 指数 (最高优先级) |
~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
* / % // | 乘,除,取模和取整除 |
+ - | 加法减法 |
>> << | 右移,左移运算符 |
& | 位 'AND' |
^| | 位运算符 |
<= < > >= | 比较运算符 |
== != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not or and | 逻辑运算符 |