复习python时的记录
预备知识
1、环境信息输出
输入 | 输出 |
---|---|
python -V/–version | 输出Python版本号 |
python -d | 在解析时显示调试信息 |
2、注释:
单行注释以 # 开头
多行注释可以用多个 # 号,还有 ‘’' 和 “”"
3、声明文件的编码
# -*- coding: encoding -*-
‘encoding’ 可以替换为 cp1252 、 utf-8 或其他。
4、保留字
import keyword
print(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’]
5、linux/Unix编程
在脚本顶部添加以下命令让Python脚本可以像SHELL脚本一样可直接执行:
#! /usr/bin/env python3
修改脚本权限,使其有执行权限,命令如下:
$ chmod +x hello.py
6、模块
① from fibo import fib, fib2
② import fibo as fib
③ from fibo import fib as fibonacci
④ 内置函数 dir() 用于查找模块定义的名称
⑤ if __name__ == ‘__main__’:程序将运行
7、包
① 用“带点号模块名”来构造 Python 模块命名空间的一种方式。 例如,模块名 A.B 表示名为 A 的包中名为 B 的子模块
② 需要有 init.py 文件才能让 Python 将包含该文件的目录当作包来处理,在最简单的情况下,init.py 可以只是一个空文件,但它也可以执行包的初始化代码或设置 all 变量
__all__ = [“echo”, “surround”, “reverse”] # 这意味着 from sound.effects import * 将导入 sound.effects 包的三个命名子模块
注:如果没有定义 __all__,from sound.effects import * 语句 不会 把包 sound.effects 中的所有子模块都导入到当前命名空间;它只是确保包 sound.effects 已被导入(可能还会运行__init__.py 中的任何初始化代码),然后再导入包中定义的任何名称。
③ 相对导入:from . import echo
数据类型
python变量不需要声明,每个变量在使用前都必须赋值
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组)
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)
判断数据类型:type(a)或isinstance(a, int)
删除对象:del var_a, var_b
1、数字型
例: a, b, c, d = 20, 5.5, True, 4+3j
① 改变数字数据类型的值,将重新分配内存空间
② 可以使用del语句删除一些数字对象的引用
类型 | 解释 |
---|---|
int | 整数型 |
bool | 布尔型 |
float | 浮点型 |
complex | 复数 |
2、字符串
例:str = ‘Runoob’
① 定义:单引号 ’ 和双引号 " 使用完全相同,使用三引号(‘’’ 或 “”")可以指定一个多行字符串
② 转义符 \,使用 r 可以让反斜杠不发生转义
③ 字符串可以用 + 运算符连接在一起,用 * 运算符重复
④ 字符串切片 str[start : end : step],其中 start(包含)是切片开始的索引,end(不包含)是切片结束的索引,step表示步长;字符串索引从左往右以 0 开始,从右往左以 -1 开始
⑤ 索引字符串越界会出错,但切片会自动处理越界
⑥ 字符串不能修改,是 immutable 的,不能索引赋值
⑧ 内置函数 len() 返回字符串的长度
⑧ 可以用not in或者in来判断某个字符串或者字符是否在当前字符串中
3、列表
例:list = [ ‘abcd’, 786 , 2.23, ‘runoob’, 70.2 ]
① 用方括号标注,逗号分隔的一组值
② 元素的类型可以不相同,它支持数字,字符串甚至可以包含列表
③ 可以被索引和截取,列表被截取后返回一个包含所需元素的新列表
④ 为切片赋值可以改变列表大小,甚至清空整个列表(letters[:] = [])
⑤ 可以用 + 运算符连接在一起,用 * 运算符重复
⑥ 当rgba = rgb时,二者是同一地址,改变一个则另一个也会改变
4、元组
例:tuple = ( ‘abcd’, 786 , 2.23, ‘runoob’, 70.2 )
① 与列表类似,不同之处在于元组的元素不能修改
② 元组写在小括号 () 里,元素之间用逗号隔开
③ 可以被索引和截取
④ 元组的元素不可改变,但它可以包含可变的对象,比如list列表
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:tup1 = () # 空元组;tup2 = (20,) # 一个元素,需要在元素后添加逗号(这是因为在没有逗号的情况下,Python会将括号解释为数学运算中的括号,而不是元组的表示)
⑤ 可以使用 + 操作符进行拼接
5、集合
例:sites = {‘Google’, ‘Taobao’, ‘Runoob’, ‘Facebook’, ‘Zhihu’, ‘Baidu’}
sites = set(‘alacazam’)
① 是一种无序、可变的数据类型,用于存储唯一的元素。
② 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。
③ 在 Python 中,集合使用大括号 {} 表示,元素之间用逗号 , 分隔,也可以使用 set() 函数创建集合(创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典)
④ 可以进行运算:a - b(a 和 b 的差集)、a | b(a 和 b 的并集)、a & b(a 和 b 的交集)、a ^ b(a 和 b 中不同时存在的元素)
6、字典
例:tinydict = {‘name’: ‘runoob’,‘code’:1, ‘site’: ‘www.runoob.com’}
① 是无序的对象集合,通过键来存取的
② 是一种映射类型,字典用 { } 标识,是键(key) : 值(value) 的集合
③ 键(key)必须使用不可变类型。在同一个字典中,键(key)必须是唯一的
④ 构造方法:dict([(‘Runoob’, 1), (‘Google’, 2), (‘Taobao’, 3)])或者dict = {};dict[‘one’] = “1”
⑤ 输出所有key:tinydict.keys()、输出所有value:tinydict.values()
7、字节
例:x = bytes(“hello”, encoding=“utf-8”)
① bytes 类型表示的是不可变的二进制序列(byte sequence)。
② bytes 类型中的元素是整数值(0 到 255 之间的整数),而不是 Unicode 字符。通常用于处理二进制数据,比如图像文件、音频文件、视频文件等等
③ 创建:x = b"hello"或者x = bytes(“hello”, encoding=“utf-8”)
数据类型转换
1、隐式转换
number类型的数据进行运算时可以直接转换
2、显示转换
语法 | 解释 |
---|---|
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) | 将一个整数转换为一个八进制字符串 |
基础运算
1、算数运算:
类型 | 解释 |
---|---|
+/- | 加减运算 |
* | 乘法运算 |
** | 乘方运算 |
/ | 除法运算 返回浮点数 |
// | 除法运算 得到整数 |
% | 除法运算 得到余数 |
注:** 比 ± 的优先级更高
2、比较运算:
返回True或者Fals,,所有比较运算符返回1表示真,返回0表示假
类型 | 解释 |
---|---|
== | 等于 - 比较对象是否相等 (a == b) |
!= | 不等于 - 比较两个对象是否不相等 (a != b) |
> | 大于 - 返回x是否大于y (a > b) |
< | 小于 - 返回x是否小于y (a < b) |
>= | 大于等于 - 返回x是否大于等于y (a >= b) |
<= | 小于等于 - 返回x是否小于等于y (a <= b) |
3、赋值运算
类型 | 解释 |
---|---|
= | 简单的赋值运算符 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 |
:= | 海象运算符,这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。Python3.8 版本新增运算符。 |
#等价的操作
n = 10
if n > 5:
print(n)
if (n := 10) > 5:
print(n)
4、位运算
类型 | 解释 |
---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0 |
>> | 右移动运算符:把">>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数 |
5、逻辑运算
类型 | 解释 |
---|---|
and | x and y 布尔"与" - 如果 x 为 False,x and y 返回 x 的值,否则返回 y 的计算值 |
or | x or y 布尔"或" - 如果 x 是 True,它返回 x 的值,否则它返回 y 的计算值 |
not | not x 布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True |
6、成员运算
类型 | 解释 |
---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False |
7、身份运算
类型 | 解释 |
---|---|
is | 判断两个标识符是不是引用自一个对象,类似 id(x) == id(y) |
is not | 判断两个标识符是不是引用自不同对象,类似 id(x) != id(y) |
注: id() 函数用于获取对象内存地址。
8、lambda语句
语法:lambda [arg1 [,arg2,…argn]]:expression
add = lambda x, y: x+y
a = add(1, 2) # a = 3
#map映射
a = map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # a = [1, 4, 9, 16, 25]
a = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) # a = [3, 7, 11, 15, 19]
#reduce累计
a = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]) # a = 15 (1+2+3+4+5)
a = reduce(lambda x, y: x * 10 + y, [1, 3, 5, 7, 9]) # a = 13579
#sorted排序 语法:sorted(iterable, key=None, reverse=False) reverse = True 降序,False 升序
L=[('b',2),('a',1),('c',3),('d',4)]
a = sorted(L, key=lambda x:x[1]) # a = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
#filter过滤 语法:filter(function, iterable) 返回迭代器对象
newlist = filter(lambda x: x % 3 == 0, [1, 2, 3])
a = list(newlist) # a = [3]
注:参考
9、运算优先级
圆括号的表达式>切片>await x>乘方>正,负,按位非 NOT>乘,矩阵乘,除,整除,取余>加和减>移位>按位与>按位异或>按位或>比较运算>逻辑非>逻辑与>逻辑或>条件表达式(if else)>lambda 表达式>赋值表达式
注:① await语句可以参考这儿,讲的十分详细。
条件控制语句、循环语句和其他语句
1、条件控制语句
① if elif else:判断
② match,case:接受一个表达式并把它的值与一个或多个 case 块给出的一系列模式进行比较
match status:
case 400:
return "Bad request"
case 401 | 403 | 404:
return "Not found"
#可以组合if语句
match point:
case Point(x, y) if x == y:
print(f"Y=X at {x}")
case Point(x, y):
print(f"Not on the diagonal")
③ 注意事项
(1)比较操作支持链式操作。例如,a < b == c 校验 a 是否小于 b,且 b 是否等于 c
(2)比较操作可以用布尔运算符 and 和 or 组合,其参数从左至右求值,一旦可以确定结果,求值就会停止
(3)序列对象可以与相同序列类型的其他对象比较。这种比较使用字典式顺序:首先,比较前两个对应元素,如果不相等,则可确定比较结果;如果相等,则比较之后的两个元素,以此类推,直到其中一个序列结束
2、循环语句
① while:条件循环
② for:循环
③ 循环中的else子句:在 for 循环中,else 子句会在循环成功结束最后一次迭代之后执行;在 while 循环中,它会在循环条件变为假值后执行
④ 循环技巧
(1)range() :生成序列
for i in range(0, 10, 3)) # i = 0, 3, 6, 9
(2)len():输出长度
for i in range(len(a))
(3)enumerate():迭代器
for i, element in enumerate(seq)
(4)zip() :同时循环两个或多个序列时,可以将其内的元素一一匹配
for q, a in zip(questions, answers)
(5)reversed() :逆向对序列进行循环
for i in reversed(range(1, 10, 2)) # 9 7 5 3 1
(6)sorted() :按指定顺序循环序列
for i in sorted(basket)
(7)set():去除序列中的重复元素
for f in sorted(set(basket))
注:循环时不应当在循环内部改变判断变量的值(list等等)
3、其他语句
① break:跳出最近的一层 for 或 while 循环
② continue:继续执行循环的下一次迭代
③ pass:不执行任何动作。语法上需要一个语句,但程序毋需执行任何动作时,可以使用该语句;可用作函数或条件语句体的占位符
迭代器和生成器
1、迭代器
迭代器有两个基本的方法:iter() 和 next()。字符串,列表或元组对象都可用于创建迭代器
① 可以使用常规for语句进行遍历
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
for x in it:
print (x, end=" ")
②可以使用 next() 函数进行遍历
import sys # 引入 sys 模块
list=[1,2,3,4]
it = iter(list) # 创建迭代器对象
while True:
try:
print (next(it))
except StopIteration:
sys.exit()
③ 创建迭代器
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
2、生成器
使用了 yield 的函数被称为生成器(generator),是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
运行方式:当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。调用一个生成器函数,返回的是一个迭代器对象。
def countdown(n):
while n > 0:
yield n
n -= 1
# 创建生成器对象
generator = countdown(5)
# 使用 for 循环迭代生成器
for value in generator:
print(value) # 输出: 5 4 3 2 1
参考
python官方文档
总结文档