Skip to main content

基础语法

info

优美优于丑陋,明了优于隐晦简单优于复杂,复杂优于繁杂

扁平优于嵌套,稀疏优于稠密

可读性很重要!

特例亦不可违背原则,即使实用比纯粹更优。错误绝不能悄悄忽略,除非它明确需要如此

面对不确定性,拒绝妄加猜测。

任何问题应有一种,且最好只有一种,显而易见的解决方法。

做优于不做,然而不假思索还不如不做。

很难解释的,必然是坏方法。

很好解释的,可能是好方法。

PEP 20 – The Zen of Python

中文翻译为Python之禅,可以理解为Python语言的设计哲学

缩进

Python 最具特色的就是使用缩进来表示代码块。不需要使用大括号

缩进的空格数是可变的,常见的有2个空格、4个空格、8个空格。但是同一个代码块的语句必须包含相同的缩进空格数。

后来出台的代码规范PEP 8,建议使用4个空格作为缩进。

test.py
if True:
print ("True")
else:
print ("False")
info

PEP由社区讨论、起草 PEP、社区公开评议和修改、指导委员会决策、开发者编码实现。

查看官方PEP索引,你可以回到过去,了解当年开发者们的想法。

PEP 8 即 Python Enhancement Proposal 8,直译是Python增强提案第8号,规定了Python代码的编写规范,是必读PEP之一。

注释

注释是代码中不会被Python解释器执行的文本。用于解释代码,方便阅读。

Python 支持单行注释和多行注释。

test.py
#!/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对象
info

如果你违反这些惯例,最坏的结果也不过是招来一些不友好的目光。

但有些软件(如 PEP 256 和 PEP 258 的 Docutils 文档字符串处理系统)会知晓这些惯例,因此遵循它们将为你带来最佳效果。

PEP 257 – 文档字符串规范

丰富的内置内容

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中,boolint 的子类。

而且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 = 10b = 20

算术运算符

运算符描述实例
+加 - 两个对象相加a + b 输出结果 30
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -10
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 200
/除 - x 除以 yb / 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

逻辑运算符

运算符逻辑表达式描述实例
andx and y布尔"与" - 该运算符返回的值不一定为布尔值,如果 x 为 False 或假值,返回 x 的值,否则它返回 y 的计算值。(a and b) 返回 20。
orx or y布尔"或" - 该运算符返回的值不一定为布尔值,如果 x 为 True 或真值,它返回 x 的值,否则它返回 y 的计算值。(a or b) 返回 10。
notnot 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。

身份运算符

运算符描述实例
isis 是判断两个标识符是不是引用自一个对象x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False
is notis not 是判断两个标识符是不是引用自不同对象x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

运算符优先级

运算符描述
**指数 (最高优先级)
~ + -按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)
* / % //乘,除,取模和取整除
+ -加法减法
>> <<右移,左移运算符
&位 'AND'
^|位运算符
<= < > >=比较运算符
== !=等于运算符
= %= /= //= -= += *= **=赋值运算符
is is not身份运算符
in not in成员运算符
not or and逻辑运算符