Python 3.10.2
目录
一、Python的优点
Python 程序简洁、易读,通常比实现同种功能的 C、C++、Java 代码短很多,原因如下:
-
高级数据类型允许在单一语句中表述复杂操作;
-
使用缩进,而不是括号实现代码块分组;
-
无需预声明变量或参数。
Python 可以扩展:可以用C语言快速为解释器增加新的内置函数或模块,不论是内容管理让核心程序以最高速度运行,还是把 Python 程序链接到只提供预编译程序的库(比如,硬件图形库)。轻松能把 Python 解释器和用 C 开发的应用链接在一起,用它来扩展和控制该应用。
二、Python解释器
在Linix系统中,我们可以在编写的Python程序的开头加上两句话(不能调换位置)
第一句能让程序在拥有可执行权限的情况下通过./+程序名运行该程序
第二句话表示该程序运用UTF-8编码(默认UTF-8编码)
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
在BSD等类Unix系统上,Python脚本可以直接执行,就像shell脚本一样,第一行添加:
#!/usr/bin/env python3.5
(假设解释器位于用户的 PATH
)脚本的开头,并将文件设置为可执行。 #!
必须是文件的前两个字符。在某些平台上,第一行必须以Unix样式的行结尾('\n'
)结束,而不是以Windows('\r\n'
)行结尾。请注意,散列或磅字符 '#'
在Python中代表注释开始。
可以使用 chmod 命令为脚本提供可执行模式或权限。
$ chmod +x myscript.py
三、Python速览
①数字运算
除法运算(/
)返回浮点数,用 //
运算符执行向下取整的结果是整数,计算余数用 %,
计算乘方用**,等号(=
)用于给变量赋值。赋值后,下一个交互提示符的位置不显示任何结果;如果变量未定义(即,未赋值),使用该变量会提示错误;Python 全面支持浮点数;混合类型运算数的运算会把整数转换为浮点数;交互模式下,上次输出的表达式会赋给变量 _
。
用round(x,2)对变量x保留两位小数(银行家舍入法(四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一)也有可能因为精度的问题而导致输出的数与我们所期盼的数不同)。
用bin()可以将数字转化为二进制表示
②字符串
字符串:用单引号和双引号是一样的,反斜杠 \
用于转义。(建议用print输出);如果不希望前置 \
的字符转义成特殊字符,可以使用 原始字符串,在引号前添加 r
即可。
字符串字面值可以实现跨行连续输入。实现方式是用三引号:"""..."""
或 '''...'''
,字符串行尾会自动加上回车换行,如果不需要回车换行,在行尾添加 \
即可。
字符串可以用 +
合并(粘到一起),也可以用 *
重复。
相邻的两个或多个 字符串字面值 (引号标注的字符)会自动合并。
字符串的编号可以从第一个字符(0)开始,也可以从最后一个字符(-1)开始。
Python支持切片索引提取子字符串(str[x:y]),切片索引省略开始索引时,默认值为 0,省略结束索引时,默认为到字符串的结尾。(输出结果包含切片开始,但不包含切片结束。因此,str[:i] + str[i:]
总是等于 s
)
Python 字符串不能修改,为字符串中某个索引位置赋值会报错。
内置函数 len() 返回字符串的长度。
③列表
Python支持多种复合数据类型,可将不同值组合在一起。最常用的列表是用[ ]标注,逗号分隔的一组值。列表 可以包含不同类型的元素,但一般情况下,各个元素的类型相同。
切片操作返回包含请求元素的新列表(b=a[:]是将a复制给b(浅拷贝/不完全复制),如果用b=a,相当于b是a的别名,更改b的同时也会更改a)。
浅拷贝:拷贝父对象,不会拷贝对象的内部的子对象。列表里的子对象仍然指向统一对象
b = a.copy()
深度拷贝:copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
import copy
b=copy.deepcopy(a)
列表内容可以改变。
列表可以进行解包
a=[1,2,3]
x,y,z=a
print(x,y,z)
'''
print(1,2,3)
'''
str.append(x)或str+=x:在列表str的结尾添加新元素x。
为切片赋值可以改变列表大小,甚至清空整个列表。
列表可以嵌套列表。
④元组
Python 的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号 ( ),列表使用方括号 [ ]。
元组在定义的时候可以省略小括号。
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。
元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。
⑤集合
集合(set)是一个无序的不重复元素序列,填入相同的元素会自动去重。实际上,集合的底层是字典实现,集合所有元素都是字典的键对象。
使用大括号 { } 或者 set() 函数(set()函数只能接收一个参数,如果想一次传入多个参数,可以用()使其形成一个元组(参数)传入)创建集合。
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # 演示去重功能
print('orange' in basket) # 快速判断元素是否在集合内
用add()添加元素
a={1,}
a.add(2)
print(a)
#结果为:{1, 2}
用remove()删除指定元素
a={1,2}
a.remove(2)
print(a)
#结果为:{1}
用clear()清空集合
a={1,2}
a.clear()
print(a)
#结果为:set()
两个集合间的运算:
a - b # 集合a中包含而集合b中不包含的元素
a | b # 集合a或b中包含的所有元素
a & b # 集合a和b中都包含了的元素
a ^ b # 不同时包含于a和b的元素
⑥字典
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:
d = {key1 : value1, key2 : value2 }
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组
字典值可以没有限制地取任何Python对象,可以是标准的对象,也可以是用户定义的,但键不行
⑦print()函数
print() 函数输出给定参数的值。与表达式不同,它能处理多个参数,包括浮点数与字符串。它输出的字符串不带引号,且各参数项之间会插入一个空格,这样可以实现更好的格式化操作。运用关键字参数 end 可以取消输出后面的换行, 或用另一个字符串结尾。
⑧其他
多重赋值: a, b = 0, 1(交换可以用a,b=b,a实现)
右表达式求值顺序为从左到右。
同一块语句的每一行的缩进相同。
Python的三目运算
y="zero" if x==0 else "not zero"
#如果x等于0那么y为zero,否则y为not zero
四、流程控制工具
①while循环
while循环只要条件保持为真就会一直执行。Python 和 C 一样,任何非零整数都为真,零为假。这个条件也可以是字符串或列表的值,事实上,任何序列都可以;长度非零就为真,空序列则为假。
while 条件:
语句1
语句2
....
循环外语句1
循环外语句2
....
②if语句
if 语句包含零个或多个elif子句,及可选的else子句。关键字elif 是else if的缩写,适用于避免过多的缩进。可以把if...elif...elif... 序列看作是其他语言中switch或case语句的替代品。
if 条件1:
语句1
语句2
elif 条件2:
语句3
语句4
else 条件3:
语句5
语句6
条件外语句1
条件外语句1
③for语句
Python 的for语句与 C 或 Pascal 中的不同。Python 的for语句不迭代算术递增数值,或是给予用户定义迭代步骤和暂停条件的能力(如 C),而是迭代列表或字符串等任意序列,元素的迭代顺序与在序列中出现的顺序一致。(Python中的for是遍历元素)
Python支持二元遍历
遍历某个字典的同时修改该字典的内容,很难获取想要的结果。要在遍历时修改字典的内容,应该遍历该字典的副本或创建新的字典:
users = {'Hans': 'active', 'Éléonore': 'inactive', '景太郎': 'active'}
#方法一:遍历复制的,然后去操作原先的
for user, status in users.copy().items():
if status == 'inactive':
del users[user]
#方法二:创建一个新的
active_users = {}
for user, status in users.items():
if status == 'active':
active_users[user] = status
④range()函数
range() 常用于生成左闭右开的数字序列,该函数可以生成算术级数,range()可以不从 0 开始,还可以按指定幅度递增(递增幅度称为 '步进',支持负数),若只填一个数,则默认从0开始。
range() 和 len() 组合在一起,可以按索引迭代序列:
strs = "Hello World."
for i in range(len(strs)):
print(strs[i],end = " ")
#H e l l o W o r l d .
⑤循环中的else
子句
Python的循环语句支持 else 子句:
for 循环中,可迭代对象中的元素全部循环完毕时
while 循环的条件为假时,执行该子句
总而言之:没有break语句终止循环,就会执行else子句
⑥pass语句
pass 语句不执行任何操作。语法上需要一个语句,但程序不实际执行任何动作时,可以使用该语句。pass 可以用作函数或条件子句的占位符。
⑦match语句
match 语句接受一个表达式并将它的值与以一个或多个 case 语句块形式给出的一系列模式进行比较。 这在表面上很类似 C (以及许多其他语言) 中的 switch 语句,但它还能够从值中提取子部分 (序列元素或对象属性) 并赋值给变量。
⑧定义函数
定义函数使用关键字def,后跟函数名与括号内的形参列表。
函数语句从下一行开始,并且必须缩进。
定义的函数中的return 语句返回函数的值,当return 语句不带表达式参数时返回 None。函数执行完毕退出也返回 None。
默认参数规则和C相同。
可以对定义函数时的变量进行赋值来进行传值
def MAX(a,b):
if(a>b):
return a
else :
return b
print(MAX(a=1,b=2))
#输出2
可以用*解包传入元组、列表,用**解包传入字典(必须要一一对应)
def MAX(a,b):
if(a>b):
return a
else :
return b
c=[1,2]
print(MAX(*c))
c= {'a':1, 'b':2}
print(MAX(**c))
'''
输出:
2
2
'''
⑨Lambda 表达式
lambda 关键字用于创建小巧的匿名函数。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。lambda 函数可以引用包含作用域中的变量
add=lambda a, b: a+b
#函数名称=lambda 传入参数:传出参数
五、数据结构
①列表、字典详解
a.append(x)
在列表末尾添加一个元素,相当于 a[len(a):] = [x]
a.extend(iterable)
用可迭代对象的元素扩展列表。相当于 a[len(a):] = iterable 。
在list列表末尾一次性追加iterable序列中的多个值(用新列表扩展原来的列表)
a.insert(i, x)
在指定位置插入元素。第一个参数是插入元素的索引
因此,a.insert(0, x) 在列表开头插入元素, a.insert(len(a), x) 等同于 a.append(x)
list.remove(x)
从列表中删除第一个值为 x 的元素
a.pop(i)
删除列表中指定位置的元素,并返回被删除的元素
未指定位置时,a.pop() 删除并返回列表的最后一个元素
a.clear()
删除列表里的所有元素,相当于 del a[:] 。
list.index(x,start,end)
在list的start到end之间查找x,返回列表中第一次出现x的位置
list.count(x)
返回列表中元素 x 出现的次数
list.sort(key=None, reverse=False)
key -- 指定可迭代对象中的一个元素来进行排序,需要写一个函数进行
def takeSecond(q):
return q[1]
list = [(2, 2), (3, 4), (4, 1), (1, 3)]
list.sort(key=takeSecond)
print(list)
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)
list.reverse()
翻转列表中的元素
②列表、集合、字典推导式
列表、集合、字典的推导式类似
列表推导式的方括号内包含以下内容:一个表达式,后面为一个 for
子句,然后,是零个或多个 for
或 if
子句。结果是由表达式依据 for
和 if
子句求值计算而得出一个新列表
'''
a=[]
for i in range(10):
a.append(i**2)
print(a)
'''
a = [i**2 for i in range(10)]
print(a)
生成0-9的平方的列表
'''
a = []
for x in [1,2,3]:
for y in [3,1,4]:
if x != y:
a.append((x, y))
print(a)
'''
a=[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
print(a)
生成x!=y的列表
③循环的技巧
·
items()
在字典中循环时,用items()方法可同时取出键和对应的值
a= {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in a.items():
print(k, v)
·
enumerate()
在序列中循环时,用enumerate()函数可以同时取出位置索引和对应的值
for i, v in enumerate(['tic', 'tac', 'toe']):
print(i, v)
·
zip()
同时循环两个或多个序列时,用zip()函数可以将其内的元素一一匹配
list1 = ['a', 'b', 'c']
list2 = [1,2,3]
for x,y in zip(list1, list2):
print(x,y)
·
reversed()
逆向循环序列时,先正向定位序列,然后调用reversed()函数
for i in reversed(range(1, 10)):
print(i)
·
sorted()
按指定顺序循环序列,可以用sorted()函数,在不改动原序列的基础上,返回一个重新的序列
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(basket):
print(i)
·
去重
使用 set() 去除序列中的重复元素
使用 sorted() 加 set() 则按排序后的顺序,循环遍历序列中的唯一元素
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(set(basket)):
print(i)
六、模块
退出 Python 解释器后,再次进入时,之前在 Python 解释器中定义的函数和变量就丢失了。因此,编写较长程序时,建议用文本编辑器代替解释器,执行文件中的输入内容,这就是编写脚本。随着程序越来越长,为了方便维护,最好把脚本拆分成多个文件。编写脚本还一个好处,不同程序调用同一个函数时,不用每次把函数复制到各个程序。
为实现这些需求,Python 把各种定义存入一个文件,在脚本或解释器的交互式实例中使用。这个文件就是模块;模块中的定义可以 导入 到其他模块或主模块(在顶层和计算器模式下,执行脚本中可访问的变量集)。
模块是包含 Python 定义和语句的文件。其文件名是模块名加后缀名.py 。
'''
在以主文件为根的同目录下的python_lesson的文件夹内的a.py文件储存
def fib(n):
a, b = 0, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
'''
#可以通过下面这种方式导入a.py中的fib函数并用别名fib2
from python_lesson.a import fib as fib2
#或者用以下方式导入a.py,在调用fib函数时应为a.fib()
from python_lesson import a
七、输入与输出
①旧式字符串格式化方法
% 运算符可用于字符串格式化。给定 'string' % values,则 string 中的 % 实例会以零个或多个 values 元素替换。(类似于C++中的printf中的格式操作)
import math
print('The value of pi is approximately %5.3f.' % math.pi)
#The value of pi is approximately 3.142.
②读写文件
fin=open(filename, mode)
第一个实参是文件名字符串
第二个实参是包含描述文件使用方式字符的字符串。mode 的值包括'r',表示文件只能读取;'w'表示只能写入(现有同名文件会被覆盖);'a'表示打开文件并追加内容,任何写入的数据会自动添加到文件末尾。'r+'
表示打开文件进行读写。mode 省略时的默认值为 'r'
。
一般使用with关键字
'''
从本文件的同文件夹下的python_lesson里的test.txt中读取内容并命名为fin
'''
with open('python_lesson/test.txt','r') as fin:
print(fin.read())
#
with open('python_lesson/test.txt', 'r') as fin:
print(fin.readlines()) #以列表的形式储存每一行内容
#
with open('python_lesson/test.txt','r') as fin:
for line in fin:
print(line,end='') #支持迭代操作,每行输出
读取
'''
向本文件的同文件夹下的python_lesson里的test.txt中写入内容并命名为fout
'''
with open('python_lesson/test.txt','w') as fout:
fout.write('输出的字符串')
输出
八、错误和异常
在实际应用程序中,finally 子句对于释放外部资源(例如文件或者网络连接)非常有用,无论是否成功使用资源
def divide(x, y):
try:
result = x / y
except Exception as e: #遇到异常时输出异常
print(str(e))
else: #没有遇到异常时输出结果
print("result is", result)
finally: #无论有没有遇到异常都执行的语句
print("executing finally clause")
九、类
①类的变量和成员函数
直接在类内定义一个变量,那么这个变量就相当于C++里的静态变量,所有的都共用这一个变量
class q:
a=[]
a=q()
b=q()
a.a.append(1)
b.a.append(2)
print(a.a)
#结果为[1, 2]
如果要定义不共用的一般类则需用def __init__(self)
class q:
def __init__(self):
self.a=[]
a=q()
b=q()
a.a.append(1)
b.a.append(2)
print(a.a)
#结果为[1]
也可以和函数一样进行传参
class q:
def __init__(self,x,y):
self.a=[x,y]
a=q(7,7)
a.a +=[7,7]
print(a.a)
#结果为[7, 7, 7, 7]
'''
class q:
def __init__(self,x,y):
self.a=[x,y]
a=q(y=7,x=7)
a.a +=[7,7]
print(a.a)
'''
'''
class q:
def __init__(self,x,y):
self.a=[x,y]
b=[7,7]
a=q(*b)
a.a +=[7,7]
print(a.a)
'''
Python可以在类的外部使用类内未定义的成员变量
class q:
def __init__(self):
self.a=[]
a=q()
a.x=5
print(a.x)
#结果为5
Python中的成员函数
class q:
def __init__(self):
self.a=[]
def update(self):
for i in range(len(self.a)):
self.a[i]*=2
a=q()
a.a +=[7,7,7,7]
a.update()
print(a.a)
#结果为[14, 14, 14, 14]
②类的继承
通过super().__init__()来调用基类的构造函数,如果没有super().__init__()语句,则无法调用q内的构造函数,但可以调用q内定义的值。
class q:
def __init__(self):
self.a=[]
class w(q):
def __init__(self):
super().__init__()
a=w()
print(a.a)
#结果为[]