使用代码段的形式,记录 Python 的大部分语法
查看 Python 版本
python -V
python --version
第一个 Python 程序
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print('Hello World!')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
print('Hello World!')
运行 Python 脚本
python hello.py
python3 hello.py
指定 Python 编码
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
# -*- coding: utf-8 -*-
# coding=utf-8
# I want to use coding=utf-8
指定 Python 解释器
指定 Python 的解释器后,当直接 ./hello.py
执行 Python 脚本时,会自动选择解释器。文章源自十年又十年-https://www.bbigsun.com/461.html
#!/usr/bin/env python
#!/usr/bin/python
Python 标识符
- 标识符第一个字符必须是字母表中的字母
A-Z
a-z
或者下划线_
。 - 标识符其他字符由
字母
数字
和下划线
组成。 - 标识符对大小写敏感。
- 不能与保留字重名。
Python 保留字
输出当前版本的所有保留字文章源自十年又十年-https://www.bbigsun.com/461.html
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', '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 命名规范(个人总结)
程序设计语言的命名规范中有几种:文章源自十年又十年-https://www.bbigsun.com/461.html
- 常量单词全部大写,单词之间用下划线连接:MAX_NUMBER
- 变量/函数单词全部小写,单词之间用下划线连接:student_number
- 类名单词首字母大写:BookTemplate
- 目录不要使用
-
:DirName 或者 dir_name 或者 dirname - 文件单词全部小写,单词之间用下划线连接:get_python_log.py
Python 导入模块
Python 用 import
或 from ... import ...
来导入模块文章源自十年又十年-https://www.bbigsun.com/461.html
- 将整个模块导入:
import somemodule
- 从某个模块中导入某个函数:
from somemodule import somefunction
- 从某个模块中导入多个函数:
from somemodule import firstfunc, secondfunc, thirdfunc
- 将某个模块中的全部函数导入:
from somemodule import *
- 从某个目录导入某个文件:
from somedir import somefile
- 从某个文件导入某个函数:
from somefile import somefunction
Python 注释
单行注释,#
文章源自十年又十年-https://www.bbigsun.com/461.html
# 这是一行单行注释
多行注释,''''''
""""""
文章源自十年又十年-https://www.bbigsun.com/461.html
"""
这是第一行注释
这是第二行注释
"""
'''
这是第一行注释
这是第二行注释
'''
Python 行与缩进
Python 通过行与缩进区分代码块,同一块代码,缩进格数要保持一致。文章源自十年又十年-https://www.bbigsun.com/461.html
if True:
print('True')
else:
print('False')
Python 多行语句
Python 多行语句用反斜杠 \
连接文章源自十年又十年-https://www.bbigsun.com/461.html
sum = a + \
b + \
c
特例:[]
{}
()
多行不需要反斜杠 \
连接文章源自十年又十年-https://www.bbigsun.com/461.html
sum = [1, 2,
3, 4]
Python 单行多条语句
Python 在一行中使用多条语句,用 ;
隔开文章源自十年又十年-https://www.bbigsun.com/461.html
a = 10; print(a)
Python 输入
Python2 是 raw_input();Python3 是 input()
单行输入
s = input("等待用户输入:")
print(s)
多行输入
while True:
s = input("等待用户输入:")
if s == 'exit':
break
print(s)
Python 输出
student_name = "Tom"
student_age = "18"
# 输出为一行
print(student_name, student_age)
# 输出为两行,因为 print() 函数默认以回车键结尾
print(student_name)
print(student_age)
# 格式化输出
print("{} is {} years old!".format(student_name, student_age))
print(f"{student_name} is {student_age} years old!")
print("%s is %s years old" % student_name, student_age)
Python sys 输入输出
输入
sys.stdin 读取输入时会带上回车符 \n
,可以用 strip() 函数去除
import sys
line1 = sys.stdin.readline()
line2 = sys.stdin.readline().strip()
read()
:将文件一次全部读取成一个字符串,包括特殊字符,需要较大内存readline()
:将文件根据换行符一行一行读取readlines()
:将文件一次性读取到内存,依行为单位读取为一个列表对象
输出
import sys
sys.stdout.write('hello' + '\n')
Python 标准数据类型
- Number(数字)
- int、float、bool、complex(复数)。
- String(字符串)
- bool(布尔类型)
- bool 是 int 的子类,True == 1,False == 0
- List(列表)
- Tuple(元组)
- Set(集合)
- Dictionary(字典)
不可变数据:
- Number(数字)
- String(字符串)
- Tuple(元组)
可变数据:
- List(列表)
- Dictionary(字典)
- Set(集合)
Python 运算符
- 算术运算符
-
+
-
*
/
%
**
//
- 比较(关系)运算符
==
!=
>
<
>=
<=
- 赋值运算符
=
+=
-=
*=
/=
%=
**=
//=
:=
- 逻辑运算符
and
or
not
- 位运算符
&
|
^
~
<<
>>
- 成员运算符
in
not in
- 身份运算符
is
is not
- 运算符优先级
括号
>读取、切片、调用
>算数运算符
>位运算符
>比较运算符
>逻辑运算符
>条件、lambada、赋值表达式
Python 数据类型转换
- 隐式类型转换 - 自动完成
- 显式类型转换 - 需要使用类型函数来转换
类型转换函数
int(x [,base]):将x转换为一个整数
float(x):将x转换到一个浮点数
complex(real [,imag]):创建一个复数
str(x):将对象 x 转换为字符串
repr(x):将对象 x 转换为表达式字符串
eval(str):用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s):将序列 s 转换为一个元组
list(s):将序列 s 转换为一个列表
set(s):转换为可变集合
dict(d):创建一个字典。d 必须是一个 (key, value)元组序列。
frozenset(s):转换为不可变集合
chr(x):将一个整数转换为一个字符
ord(x):将一个字符转换为它的整数值
hex(x):将一个整数转换为一个十六进制字符串
oct(x):将一个整数转换为一个八进制字符串
Python 赋值
var = 1
a, b = 1, 2
Python 交换变量值
a, b = 1, 2
a, b = b, a
Python 字符串基础
定义,使用 单引号 ''
或者 双引号 ""
对字符串定义
单行
s1 = 'string1'
s2 = "string2"
多行
s1 = '''line1
line2
line3
'''
s2 = """line1
line2
line3
"""
索引, 使用 []
进行索引
s = '123456789'
# 取第2个字符
print(s[1])
# 取倒数第1个字符
print(s[-1])
# 取倒数第5个字符
print(s[-5])
切片, 使用 [:]
进行切片,左闭右开
s = '123456789'
# 取第3到第8个字符
print(s[2:8])
# 取第2到最后一个字符
print(s[2:])
# 取第一个到第8个字符
print(s[:8])
# 字符串反转
print(s[::-1])
# 只取偶数
print(s[1::2])
# 只取3的倍数
print(s[2::3])
拼接,使用 +
进行拼接
s1 = 'hello'
s2 = 'world'
s3 = s1 + ' ' + s2
重复输出,使用 *
进行重复输出
s = 'a' * 5
格式化,使用 %
进行格式化
s = '%s is a good student, he is %d years old.' % ('Tom', 18)
Python 字符串转义
单引号内嵌双引号格式保持不变,双引号内嵌单引号会自动转义
去除转义
s = r'this is a string'
转义符号 \
Python 列表
定义
list1 = []
list2 = list()
Python 元组
定义
t1 = ()
t2 = turple()
Python 字典
定义
dic1 = {}
dic2 = dict()
Python 集合
定义
s = set()
Python 条件控制
一种情况:
if True:
print('true')
两种情况:非黑即白
if True:
print('true')
else:
print('false')
多种情况:
if True:
print('1')
elif True:
print('2')
else:
print('3')
if 嵌套:
if True:
if True:
print('true')
else:
print('false')
else:
print('false')
match...case Python3.10添加
status = input()
match status:
case 100 | 101:
print('not allowed')
case 400:
print('bad request')
case 404:
print('not found')
case 502:
print('ecs error')
case _:
print('Internet error')
Python for 循环
for i in range(10):
print(i)
for i in range(10):
print(i)
else:
print("for 循环完成")
Python while 循环
flag = 1
while (flag): print("true")
while i < 10:
print(i)
i += 1
while i < 10:
print(i)
i += 1
else:
print("while 循环完成")
Python 改变循环状态
- break :中止循环
- continue :继续执行
- pass :空语句
Python 推导式
列表推导式
l = [x for x in range(10)]
l = [x for x in range(10) if x > 5]
字典推导式
l = [x*x for x in range(10)]
dic = {key: len(key) for key in l}
l = [x*x for x in range(10)]
dic = {key: len(key) for key in l if k > 40}
集合推导式
l = {x*2 for x in (1,2,3)}
l = {x*2 for x in (1,2,3) if x%2 == 0}
元组推导式
# 返回的是生成器,需要转换为元组
t = (x for x in range(1,10))
t = turple(t)
Python 函数
定义函数:
def func(a, b):
return a + b
- def:关键字
- func:函数名称
- (a, b):参数列表
- return a + b:返回值
函数调用:
a , b = 1, 2
c = func(a, b)
参数传递:
- 不可变类型,传递的是值,改变后返回新的对象。
- 可变类型,传递的是引用,改变时会改变原对象。
参数:
- 必须参数
- 关键字参数
- 默认参数
- 不定长参数
def func(required_param, default_param=10, *var_turple)
print(f"{required_param} 是必须参数")
print(f"{default_param} 是默认参数,因为默认值为10")
print(f"{var_turple} 是不定长参数,是一个元组")
# 当使用关键字指定参数时,这个参数称之为关键字参数,此时可以不用按照顺序传入
func(default_param=100, required_param='此时是关键字参数')
Python 类
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
类定义
class SimpleClass:
pass
class People:
# 公有属性
name = ''
gender = ''
# 私有属性
__age = 0
# 构造方法
def __init___(self, name, gender, age):
self.name = name
self.gender = gender
self.__age = age
# 普通方法
def get_age(self):
print(self.__age)
# 实例化
p1 = People('xiaoming', 'boy', 18)
p1.get_age()
类的私有属性和私有方法都是在前面加双下划线 __
。公有属性和方法可以通过 .
被外部调用,私有的不可以!
类继承
单继承
class Student(People):
grade = ''
def __init__(self, name, gender, age, grade):
# 调用父类的构造方法
People.__init__(self, name, gender, age)'
self.grade = grade
多继承,多继承时,如果两个父类的方法相同,优先使用第一个父类的。
方法重写后,可以通过 super()
函数调用父类的方法
Python 支持运算符重载,我们可以对类的专有方法进行重载
类的专有方法:
__init__
: 构造函数,在生成对象时调用__del__
: 析构函数,释放对象时使用__repr__
: 打印,转换__setitem__
: 按照索引赋值__getitem__
: 按照索引获取值__len__
: 获得长度__cmp__
: 比较运算__call__
: 函数调用__add__
: 加运算__sub__
: 减运算__mul__
: 乘运算__truediv__
: 除运算__mod__
: 求余运算__pow__
: 乘方
Python 异常处理
try:
runoob()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('这句话,无论异常是否发生都会执行。')
Python 迭代器和生成器
迭代器有两个方法:iter() 和 next()
使用方法:
# 可迭代的序列
list = [1, 2, 3, 4, 5]
# 创建迭代器对象
it = iter(list)
# 输出迭代器下一个元素
print(next(it))
使用了 yield 的函数被称为生成器(generator)。跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
生成器与列表的区别,只有在使用时才会占用内存,列表是直接读取到了内存,生成器适用于大量数据的时候使用
使用方法:
def gen(n):
for i in range(n):
yield i
# 创建一个生成器
g = gen(10)
# 下一个数据
print(g.__next__())
# 打印数据
for i in g:
print(i)
Python 命名空间
命名空间是名称到对象的映射,大部分命名空间都是通过字典实现的。
命名空间一般分为三种:(内置 > 全局 > 局部)
- 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
- 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
- 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
作用域:就是程序可以访问命名空间的区域,与命名空间相反,作用域从内向外,可以分为四种:
- L(Local):最内层,包含局部变量,比如一个函数/方法内部。
- E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
- G(Global):当前脚本的最外层,比如当前模块的全局变量。
- B(Built-in): 包含了内建的变量/关键字等,最后被搜索。
内层修改外层:
num = 1
def fun1():
global num # 需要使用 global 关键字声明
num = 123
内层修改嵌套层:
def outer():
num = 10
def inner():
nonlocal num # nonlocal关键字声明
num = 100
纸上得来终觉浅,绝知此事要躬行。
评论