文章目录
- 0.常用
- 1.环境搭建
- 2.VSCode运行Python脚本
- 3.基础语法
-
- [3.1 注释](#3.1 注释)
- [3.2 多行语句](#3.2 多行语句)
- [3.3 print 输出](#3.3 print 输出)
- [3.4 import 导入](#3.4 import 导入)
- 4.基本数据类型
-
- [4.1 类型判断](#4.1 类型判断)
- [4.2 Number(数字)](#4.2 Number(数字))
-
- [4.2.1 int](#4.2.1 int)
- [4.2.2 float](#4.2.2 float)
- [4.2.3 bool](#4.2.3 bool)
- [4.2.4 complex(复数)](#4.2.4 complex(复数))
- [4.3 String(字符串)](#4.3 String(字符串))
- [4.4 list (列表)](#4.4 list (列表))
- [4.5 tuple (元组)](#4.5 tuple (元组))
- [4.6 dict (字典)](#4.6 dict (字典))
- [4.7 set (集合)](#4.7 set (集合))
- 5.数据类型转换
- 6.运算符
-
- [5.1 算术运算符](#5.1 算术运算符)
- [5.2 比较运算符](#5.2 比较运算符)
- [5.3 赋值运算符](#5.3 赋值运算符)
-
- [5.3.1 海象运算符](#5.3.1 海象运算符)
- [5.4 位运算符](#5.4 位运算符)
- [5.5 逻辑运算符](#5.5 逻辑运算符)
- [5.6 成员运算符 in](#5.6 成员运算符 in)
- [5.7 身份运算符 is](#5.7 身份运算符 is)
- [5.8 is 与 == 区别](#5.8 is 与 == 区别)
- [7. 函数](#7. 函数)
-
- [7.1 数学函数](#7.1 数学函数)
- [7.2 随机函数](#7.2 随机函数)
- [7.3 三角函数](#7.3 三角函数)
- [7.4 数学常量](#7.4 数学常量)
- 8.条件控制
-
- [8.1 if...elif...else](#8.1 if...elif...else)
- [8.2 match...case](#8.2 match...case)
- 9.循环语句
-
- [9.1 while...else](#9.1 while...else)
- [9.2 for](#9.2 for)
- [9.3 for...else](#9.3 for...else)
- [9.4 pass](#9.4 pass)
- 10.推导式
-
- [10.1 列表推导式](#10.1 列表推导式)
- [10.2 字典推导式](#10.2 字典推导式)
- [10.3 集合推导式](#10.3 集合推导式)
- [10.4 元组推导式](#10.4 元组推导式)
- 11.迭代器和生成器
-
- [11.1 迭代器 iter](#11.1 迭代器 iter)
- [11.2 生成器 generator](#11.2 生成器 generator)
- 12.函数
-
- [12.1 可更改(mutable)与不可更改(immutable)对象:](#12.1 可更改(mutable)与不可更改(immutable)对象:)
- [12.2 参数](#12.2 参数)
- [12.3 lambda 表达式](#12.3 lambda 表达式)
- 13.模块
-
- [13.1 \_\name\\_属性](#13.1 __name__属性)
- [13.2 dir()](#13.2 dir())
- 14.输入和输出
-
- [14.1 读取键盘输入](#14.1 读取键盘输入)
- 15.文件/目录操作
-
- [15.1 文件操作](#15.1 文件操作)
- [15.2 目录操作](#15.2 目录操作)
- [16 序列化与反序列化](#16 序列化与反序列化)
-
- [16.1 序列化(dump,dumps)](#16.1 序列化(dump,dumps))
- [16.2 反序列化(load,loads)](#16.2 反序列化(load,loads))
- 17.错误和异常
-
- [17.1 抛出异常 raise](#17.1 抛出异常 raise)
- [17.2 断言 assert](#17.2 断言 assert)
- [17.3 with 关键字](#17.3 with 关键字)
- 18.面向对象
-
- [18.1 类](#18.1 类)
- [18.2 类属性和方法](#18.2 类属性和方法)
- [18.3 类的专有方法](#18.3 类的专有方法)
- [18.4 继承](#18.4 继承)
- [18.5 多继承](#18.5 多继承)
- [18.6 方法重写](#18.6 方法重写)
- 19.作用域
-
- [19.1 特殊情况](#19.1 特殊情况)
0.常用
-
输出
python# 不换行输出 print('hello world', '') # 带参数输出 name = 'ming' print('hello {0}'.format(name))
-
截取
python变量[头下标:尾下标:步长] list[0:] # 从头到尾
-
range()
pythonrange(5) # [0, 1, 2, 3, 4] range(5, 9) # [5, 6, 7, 8] range(5, 9, 2) # [5, 7]
-
遍历技巧
-
在字典中遍历时,关键字和对应的值可以使用 items() 方法同时解读出来:
pytHondic = {'key1': 'value1', 'key2': 'value2'} for k, v in dic.items(): print(k, v) ''' key1 value1 key2 value2 '''
-
在序列中遍历时,索引位置和对应值可以使用 enumerate() 函数同时得到:
pythonfor i, v in enumerate(['apple', 'banana', 'pear']): print(i, v) ''' 0 apple 1 banana 2 pear '''
-
同时遍历两个或更多的序列,可以使用 zip() 组合:
pythonquestions = ['name', 'sex', 'favorite color'] answers = ['Bob', 'mboy', 'blue'] for q, a in zip(questions, answers): print('What is your {0}? It is {1}.'.format(q, a)) ''' What is your name? It is Bob. What is your sex? It is mboy. What is your favorite color? It is blue. '''
-
要反向遍历一个序列,首先指定这个序列,然后调用 reversed() 函数:
python>>> for i in reversed(range(1, 10, 2)): ... print(i) ... 9 7 5 3 1
-
1.环境搭建
参考菜鸟教程配置:Python3 环境搭建 | 菜鸟教程 (runoob.com)
运行脚本:
cmd
python script.py
2.VSCode运行Python脚本
使用vscode编写、运行Python程序_vscode写python-CSDN博客
3.基础语法
3.1 注释
python
# 第一个注释
# 第二个注释
'''
第三注释
第四注释
'''
"""
第五注释
第六注释
"""
print ("Hello, Python!")
3.2 多行语句
python
total = item_one + \
item_two + \
item_three
3.3 print 输出
python
# 换行输出
print(x)
# 不换行输出
print(x, end="")
3.4 import 导入
python
# 将整个模块(somemodule)导入
import somemodule
# 从某个模块中导入某个函数
from somemodule import somefunction
# 从某个模块中导入多个函数
from somemodule import firstfunc, secondfunc, thirdfunc
# 将某个模块中的全部函数导入
from somemodule import *
4.基本数据类型
- **不可变数据(3 个):**Number(数字)、String(字符串)、Tuple(元组);
- **可变数据(3 个):**List(列表)、Dictionary(字典)、Set(集合)。
4.1 类型判断
- type()不会认为子类是一种父类类型。
- isinstance()会认为子类是一种父类类型。
4.2 Number(数字)
4.2.1 int
4.2.2 float
4.2.3 bool
bool 是 int 的子类,True 和 False 可以和数字相加,True==1、False == 0
0、空字符串、空列表、空元组 等被视为 False
4.2.4 complex(复数)
4.3 String(字符串)
-
字符串截取:
python# 包含头,不包含尾 变量[头下标:尾下标:步长]
python# 加号 + 是字符串的连接符, 星号 * 表示复制当前字符串,与之结合的数字为复制的次数 str = 'Runoob' print (str) # 输出字符串 print (str[0:-1]) # 输出第一个到倒数第二个的所有字符 print (str[0]) # 输出字符串第一个字符 print (str[2:5]) # 输出从第三个开始到第五个的字符 print (str[2:]) # 输出从第三个开始的后的所有字符 print (str * 2) # 输出字符串两次,也可以写成 print (2 * str) print (str + "TEST") # 连接字符串 ''' Runoob Runoo R noo noob RunoobRunoob RunoobTEST '''
-
转义字符
python# python 使用反斜杠 \ 转义特殊字符,如果你不想让反斜杠发生转义,可以在字符串前面添加一个 r,表示原始字符串 >>> print('Ru\noob') Ru oob >>> print(r'Ru\noob') Ru\noob >>>
-
4.4 list (列表)
- 基本操作
python
list = [1, "red", "blue", 3, "yellow"]
print(list[0])
print(list[-2])
print(list[0: -1: 2])
'''
1
3
[1, 'blue']
'''
-
脚本操作符
列表对 + 和 * 的操作符与字符串相似。+ 号用于组合列表,* 号用于重复列表。
pythonL1 = [1, 2, 3] L2 = [4, 5, 6] print(L1 + L2) print(L1 * 3) ''' [1, 2, 3, 4, 5, 6] [1, 2, 3, 1, 2, 3, 1, 2, 3] '''
-
列表嵌套
pythonlist = [['a', 'b', 'c'], [1, 2, 3]] print(list[1][0]) # 1
-
列表比较
pythonimport operator a = [1, 2] b = [2, 3] c = [2, 3] print("operator.eq(a,b): ", operator.eq(a,b)) print("operator.eq(c,b): ", operator.eq(c,b)) ''' False True '''
-
列表函数&方法
Python包含以下函数:
序号 函数 1 len(list) 列表元素个数 2 max(list) 返回列表元素最大值 3 min(list) 返回列表元素最小值 4 list(seq) 将元组转换为列表 Python包含以下方法:
方法 描述 list.append(x) 把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]。 list.extend(L) 通过添加指定列表的所有元素来扩充列表,相当于 a[len(a):] = L。 list.insert(i, x) 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如 a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。 list.remove(x) 删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。 list.pop([i]) 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除。(方法中 i 两边的方括号表示这个参数是可选的,而不是要求你输入一对方括号,你会经常在 Python 库参考手册中遇到这样的标记。) list.clear() 移除列表中的所有项,等于del a[:]。 list.index(x) 返回列表中第一个值为 x 的元素的索引。如果没有匹配的元素就会返回一个错误。 list.count(x) 返回 x 在列表中出现的次数。 list.sort() 对列表中的元素进行排序。 list.reverse() 倒排列表中的元素。 list.copy() 返回列表的浅复制,等于a[:]。
4.5 tuple (元组)
特点:元组中的元素不能修改
python
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d" # 不需要括号也可以
print(type(tup3))
<class 'tuple'>
# 元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:
tup1 = (50)
print(type(tup1)) # 不加逗号,类型为整型 <class 'int'>
tup1 = (50,)
print(type(tup1)) # 加上逗号,类型为元组 <class 'tuple'>
4.6 dict (字典)
python
dic = {'Name': 'Ming', 'Age': 7, 'Class': 'First'}
print(dic['Name'])
# 更新
dic['Age'] = 18
# 添加
dic['School'] = "菜鸟教程"
print(type(dic))
-
字典内置函数&方法
-
Python字典包含了以下内置函数:
序号 函数及描述 实例 1 len(dict) 计算字典元素个数,即键的总数。 >>> tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> len(tinydict) 3
2 str(dict) 输出字典,可以打印的字符串表示。 >>> tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> str(tinydict) "{'Name': 'Runoob', 'Class': 'First', 'Age': 7}"
3 type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。 >>> tinydict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> type(tinydict) <class 'dict'>
Python字典包含了以下内置方法:
序号 函数及描述 1 dict.clear() 删除字典内所有元素 2 dict.copy() 返回一个字典的浅复制 3 dict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 4 dict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值 5 key in dict 如果键在字典dict里返回true,否则返回false 6 dict.items() 以列表返回一个视图对象 7 dict.keys() 返回一个视图对象 8 dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default 9 dict.update(dict2) 把字典dict2的键/值对更新到dict里 10 dict.values() 返回一个视图对象 11 [pop(key,default]) 删除字典 key(键)所对应的值,返回被删除的值。 12 popitem() 返回并删除字典中的最后一对键和值。
4.7 set (集合)
集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。
python
# 创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
emptySet = set()
print(type(emptySet))
# 直接使用大括号创建集合
set1 = {1, 2, 3, 4}
# 使用 set() 函数从列表创建集合
set2 = set([4, 5, 6, 7])
-
集合基本操作
pythonset3 = { 'apple', 'watermelon', 'pear', } # 添加元素 set3.add('banana') print(set3) # {'pear', 'watermelon', 'banana', 'apple'} set3.update(set([1, 2])) print(set3) # {'pear', 1, 2, 'apple', 'watermelon', 'banana'} # 移除元素 set3.remove('apple') print(set3) # 随机移除元素 print('随机移除的元素: ', '') print(set3.pop()) print('随机移除后的集合:', '') print(set3)
5.数据类型转换
函数 | 描述 |
---|---|
[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) | 将一个整数转换为一个八进制字符串 |
6.运算符
5.1 算术运算符
以下假设变量 a=10 ,变量 b=21:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b 输出结果 31 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -11 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 210 |
/ | 除 - x 除以 y | b / a 输出结果 2.1 |
% | 取模 - 返回除法的余数 | b % a 输出结果 1 |
** | 幂 - 返回x的y次幂 | a**b 为10的21次方 |
// | 取整除 - 往小的方向取整数 | >>> 9//2 4 >>> -9//2 -5 |
5.2 比较运算符
以下假设变量 a 为 10,变量 b 为20:
运算符 | 描述 | 实例 |
---|---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True。 |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
5.3 赋值运算符
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | 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 版本新增运算符。 |
5.3.1 海象运算符
python
# 传统写法
n = 10
if n > 5:
print(n)
# 使用海象运算符
if (n := 10) > 5:
print(n)
# n 次循环的一般写法:
n = 5
while n:
print('hello, walrus operator!')
n -= 1
# n 次循环使用海象运算符:
n = 5
while (n := n - 1) + 1: # 需要加1是因为执行输出前n就减1了
print('hello, walrus operator!')
5.4 位运算符
下表中变量 a 为 60,b 为 13二进制格式如下:
python
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011, 在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
5.5 逻辑运算符
Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔"与" - 如果 x 为 False,x and y 返回 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 |
5.6 成员运算符 in
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。 |
python
a = 10
b = 20
list = [1, 2, 3, 4, 5 ]
if ( a in list ):
print ("1 - 变量 a 在给定的列表中 list 中")
else:
print ("1 - 变量 a 不在给定的列表中 list 中")
if ( b not in list ):
print ("2 - 变量 b 不在给定的列表中 list 中")
else:
print ("2 - 变量 b 在给定的列表中 list 中")
# 修改变量 a 的值
a = 2
if ( a in list ):
print ("3 - 变量 a 在给定的列表中 list 中")
else:
print ("3 - 变量 a 不在给定的列表中 list 中")
'''
1 - 变量 a 不在给定的列表中 list 中
2 - 变量 b 不在给定的列表中 list 中
3 - 变量 a 在给定的列表中 list 中
'''
5.7 身份运算符 is
身份运算符用于比较两个对象的存储单元
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y , 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(x) != id(y)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
注: id() 函数用于获取对象内存地址。
python
a = 20
b = 20
if ( a is b ):
print ("1 - a 和 b 有相同的标识")
else:
print ("1 - a 和 b 没有相同的标识")
if ( id(a) == id(b) ):
print ("2 - a 和 b 有相同的标识")
else:
print ("2 - a 和 b 没有相同的标识")
# 修改变量 b 的值
b = 30
if ( a is b ):
print ("3 - a 和 b 有相同的标识")
else:
print ("3 - a 和 b 没有相同的标识")
if ( a is not b ):
print ("4 - a 和 b 没有相同的标识")
else:
print ("4 - a 和 b 有相同的标识")
'''
1 - a 和 b 有相同的标识
2 - a 和 b 有相同的标识
3 - a 和 b 没有相同的标识
4 - a 和 b 没有相同的标识
'''
5.8 is 与 == 区别
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
python
>>>a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True
7. 函数
7.1 数学函数
函数 | 返回值 ( 描述 ) |
---|---|
abs(x) | 返回数字的绝对值,如abs(-10) 返回 10 |
ceil(x) | 返回数字的上入整数,如math.ceil(4.1) 返回 5 |
cmp(x, y) | 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换。 |
exp(x) | 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 |
fabs(x) | 以浮点数形式返回数字的绝对值,如math.fabs(-10) 返回10.0 |
floor(x) | 返回数字的下舍整数,如math.floor(4.9)返回 4 |
log(x) | 如math.log(math.e)返回1.0,math.log(100,10)返回2.0 |
log10(x) | 返回以10为基数的x的对数,如math.log10(100)返回 2.0 |
max(x1, x2,...) | 返回给定参数的最大值,参数可以为序列。 |
min(x1, x2,...) | 返回给定参数的最小值,参数可以为序列。 |
modf(x) | 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 |
pow(x, y) | x**y 运算后的值。 |
[round(x ,n]) | 返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。其实准确的说是保留值将保留到离上一位更近的一端。 |
sqrt(x) | 返回数字x的平方根。 |
7.2 随机函数
函数 | 描述 |
---|---|
choice(seq) | 从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。 |
[randrange (start,] stop [,step]) | 从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1 |
random() | 随机生成下一个实数,它在[0,1)范围内。 |
[seed(x]) | 改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。 |
shuffle(lst) | 将序列的所有元素随机排序 |
uniform(x, y) | 随机生成下一个实数,它在[x,y]范围内。 |
7.3 三角函数
函数 | 描述 |
---|---|
acos(x) | 返回x的反余弦弧度值。 |
asin(x) | 返回x的反正弦弧度值。 |
atan(x) | 返回x的反正切弧度值。 |
atan2(y, x) | 返回给定的 X 及 Y 坐标值的反正切值。 |
cos(x) | 返回x的弧度的余弦值。 |
hypot(x, y) | 返回欧几里德范数 sqrt(xx + yy)。 |
sin(x) | 返回的x弧度的正弦值。 |
tan(x) | 返回x弧度的正切值。 |
degrees(x) | 将弧度转换为角度,如degrees(math.pi/2) , 返回90.0 |
radians(x) | 将角度转换为弧度 |
7.4 数学常量
常量 | 描述 |
---|---|
pi | 数学常量 pi(圆周率,一般以π来表示) |
e | 数学常量 e,e即自然常数(自然常数) |
8.条件控制
8.1 if...elif...else
python
age = int(input("请输入你家狗狗的年龄: "))
print("")
if age <= 0:
print("你是在逗我吧!")
elif age == 1:
print("相当于 14 岁的人。")
elif age == 2:
print("相当于 22 岁的人。")
elif age > 2:
human = 22 + (age -2)*5
print("对应人类年龄: ", human)
### 退出提示
input("点击 enter 键退出")
8.2 match...case
python
# switch...case
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
mystatus=400
print(http_error(400))
9.循环语句
9.1 while...else
python
while <expr>:
<statement(s)>
else:
<additional_statement(s)>
9.2 for
python
for <variable> in <sequence>:
<statements>
else:
<statements>
9.3 for...else
for...else 语句用于在循环结束后执行一段代码
python
for item in iterable:
# 循环主体
else:
# 循环结束后执行的代码
9.4 pass
pass是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句
.
10.推导式
推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体
10.1 列表推导式
python
[表达式 for 变量 in 列表 if 条件]
[out_exp_res for out_exp in input_list if condition]
python
# 计算 30 以内可以被 3 整除的整数:
multiples = [i for i in range(30) if i % 3 == 0]
print(multiples, end='\n\n')
# 过滤掉长度小于或等于3的字符串列表,并将剩下的转换成大写字母:
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
new_names = [name.upper() for name in names if len(name) > 3]
print(new_names, '\n\n')
10.2 字典推导式
python
{ key_expr: value_expr for value in collection if condition }
python
# 使用字符串及其长度创建字典:
listdemo = ['Google','Runoob', 'Taobao']
newdict = {key:len(key) for key in listdemo}
print(newdict)
10.3 集合推导式
python
{ expression for item in Sequence if conditional }
python
# 判断不是 abc 的字母并输出:
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a, type(a), '\n\n')
10.4 元组推导式
- 元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。
- 元组推导式和列表推导式的用法也完全相同,只是元组推导式是用 () 圆括号将各部分括起来,而列表推导式用的是中括号 [ ] ,另外元组推导式返回的结果是一个生成器对象。
python
(expression for item in Sequence if conditional )
python
a = (x for x in range(1, 10))
print(a, type(a)) # <generator object <genexpr> at 0x0000024B70D5F1D0> <class 'generator'>
print(tuple(a)) # (1, 2, 3, 4, 5, 6, 7, 8, 9)
11.迭代器和生成器
11.1 迭代器 iter
迭代器有两个基本的方法:
iter()和
next()
python
import sys # 引入 sys 模块
list=[1, 2, 3, 4]
it = iter(list) # 创建迭代器对象
while True:
try:
print(next(it))
except StopIteration:
sys.exit()
创建一个迭代器:
-
iter():返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__() 方法并通过 StopIteration 异常标识迭代的完成
-
next():返回下一个迭代器对象
-
StopIteration:用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
python
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)
11.2 生成器 generator
使用了 yield 的函数被称为生成器(generator)
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
python
def countdown(n):
while n > 0:
yield n
n -= 1
# 创建生成器对象
generator = countdown(5)
# 通过迭代生成器获取值
print(next(generator)) # 输出: 5
print(next(generator)) # 输出: 4
print(next(generator)) # 输出: 3
# 使用 for 循环迭代生成器
for value in generator:
print(value) # 输出: 2 1
12.函数
pythondef 函数名(参数列表): 函数体
函数的第一行语句可以选择性地使用文档字符串---用于存放函数说明。
12.1 可更改(mutable)与不可更改(immutable)对象:
-
不可变类型:
strings, tuples, numbers
如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
-
可变类型:
list, dict
如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响
python
# 函数传递不可变对象
def change(a):
print(id(a)) # 指向的是同一个对象
a = 10
print(id(a)) # 一个新对象
a = 1
print(id(a))
change(a)
'''
140733829894952
140733829894952
140733829895240
'''
# 函数传递可变对象
def changeme(mylist):
print(id(mylist))
mylist.append([4, 5, 6])
print(id(mylist))
mylist = [1, 2, 3]
print(id(mylist))
changeme(mylist)
'''
1758081367872
1758081367872
1758081367872
'''
12.2 参数
-
默认参数
pythondef printinfo( name, age = 35 ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) return #调用printinfo函数 printinfo( age=50, name="runoob" ) print ("------------------------") printinfo( name="runoob" )
-
关键字参数
pythondef printinfo( name, age ): "打印任何传入的字符串" print ("名字: ", name) print ("年龄: ", age) return #调用printinfo函数 printinfo( age=50, name="runoob" )
-
不定长参数
加了星号 ***** 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
pythondef functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
pythondef printinfo( arg1, *vartuple ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vartuple) # 调用printinfo 函数 printinfo( 70, 60, 50 )
加了两个星号 *
*****的参数会以字典的形式导入
pythondef functionname([formal_args,] **var_args_dict ): "函数_文档字符串" function_suite return [expression]
pythondef printinfo( arg1, **vardict ): "打印任何传入的参数" print ("输出: ") print (arg1) print (vardict) # 调用printinfo 函数 printinfo(1, a=2,b=3) ''' 1 {'a': 2, 'b': 3} '''
-
强制位置参数
/: / 前面的形参必须使用指定位置参数,不能使用关键字参数的形式
,后的参数必须用关键字传入
pythondef f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f) # 正确使用 f(10, 20, 30, d=40, e=50, f=60)
12.3 lambda 表达式
python
lambda [arg1 [,arg2,.....argn]]:expression
python
sum = lambda arg1, arg2: arg1 + arg2
# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))
13.模块
-
搜索路径
sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表
pythonimport sys print(sys.path) # 'd:\\学习\\PythonLearn\\脚本', 'D:\\Software\\Python\\python311.zip', 'D:\\Software\\Python\\DLLs', 'D:\\Software\\Python\\Lib', 'D:\\Software\\Python', 'D:\\Software\\Python\\Lib\\site-packages']
-
导入模块
pythonimport module1[, module2[,... moduleN]
pythondef log( par ): print ("logFun : ", par) return def log1( par ): print ("log1Fun : ", par) return
-
import
python# import导入 import support support.log('import导入') support.log1('import导入')
-
from...import
从模块中导入一个指定的部分到当前命名空间中
python# from...import导入 from support import log, log1 log('from...import导入') log1('from...import导入')
-
**from...import ***
把一个模块的所有内容全都导入到当前的命名空间
python# from...import* 导入 from support import* log('from...import* 导入') log1('from...import* 导入')
13.1 __name__属性
每个模块都有一个__name__属性,当其值是'
main'时,表明该模块自身在运行,否则是被引入
python
if __name__ == '__main__':
print('程序自身在运行')
else:
print('程序被另一模块引用')
运行该脚本:
python
程序自身在运行
python
import support
# 运行输出:程序被另一模块引用
13.2 dir()
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回
python
print(dir(support))
# ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'log', 'log1']
14.输入和输出
14.1 读取键盘输入
input()
python
str = input("请输入:");
print ("你输入的内容是: ", str)
15.文件/目录操作
15.1 文件操作
**注意:**使用
open()方法一定要保证关闭文件对象,即调用
close() 方法。
python
'''
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。
'''
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
rb、rb+、wb、wb+、ab、ab+
都是以二进制格式读写文件
文件对象的方法:
序号 | 方法及描述 |
---|---|
1 | file.close()关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next()**Python 3 中的 File 对象不支持 next() 方法。**返回文件下一行。 |
6 | [file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | [file.readline(size])读取整行,包括 "\n" 字符。 |
8 | [file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | [file.seek(offset, whence])移动文件读取指针到指定位置 |
10 | file.tell()返回文件当前位置。 |
11 | [file.truncate(size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。 |
12 | file.write(str)将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
15.2 目录操作
os 模块:
序号 | 方法及描述 |
---|---|
1 | os.access(path, mode) 检验权限模式 |
2 | os.chdir(path) 改变当前工作目录 |
3 | os.chflags(path, flags) 设置路径的标记为数字标记。 |
4 | os.chmod(path, mode) 更改权限 |
5 | os.chown(path, uid, gid) 更改文件所有者 |
6 | os.chroot(path) 改变当前进程的根目录 |
7 | os.close(fd) 关闭文件描述符 fd |
8 | os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 |
9 | os.dup(fd) 复制文件描述符 fd |
10 | os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 |
11 | os.fchdir(fd) 通过文件描述符改变当前工作目录 |
12 | os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 |
13 | os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 |
14 | os.fdatasync(fd) 强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息。 |
15 | [os.fdopen(fd, mode[, bufsize]]) 通过文件描述符 fd 创建一个文件对象,并返回这个文件对象 |
16 | os.fpathconf(fd, name) 返回一个打开的文件的系统配置信息。name为检索的系统配置的值,它也许是一个定义系统值的字符串,这些名字在很多标准中指定(POSIX.1, Unix 95, Unix 98, 和其它)。 |
17 | os.fstat(fd) 返回文件描述符fd的状态,像stat()。 |
18 | os.fstatvfs(fd) 返回包含文件描述符fd的文件的文件系统的信息,Python 3.3 相等于 statvfs()。 |
19 | os.fsync(fd) 强制将文件描述符为fd的文件写入硬盘。 |
20 | os.ftruncate(fd, length) 裁剪文件描述符fd对应的文件, 所以它最大不能超过文件大小。 |
21 | os.getcwd() 返回当前工作目录 |
22 | os.getcwdb() 返回一个当前工作目录的Unicode对象 |
23 | os.isatty(fd) 如果文件描述符fd是打开的,同时与tty(-like)设备相连,则返回true, 否则False。 |
24 | os.lchflags(path, flags) 设置路径的标记为数字标记,类似 chflags(),但是没有软链接 |
25 | os.lchmod(path, mode) 修改连接文件权限 |
26 | os.lchown(path, uid, gid) 更改文件所有者,类似 chown,但是不追踪链接。 |
27 | os.link(src, dst) 创建硬链接,名为参数 dst,指向参数 src |
28 | os.listdir(path) 返回path指定的文件夹包含的文件或文件夹的名字的列表。 |
29 | os.lseek(fd, pos, how) 设置文件描述符 fd当前位置为pos, how方式修改: SEEK_SET 或者 0 设置从文件开始的计算的pos; SEEK_CUR或者 1 则从当前位置计算; os.SEEK_END或者2则从文件尾部开始. 在unix,Windows中有效 |
30 | os.lstat(path) 像stat(),但是没有软链接 |
31 | os.major(device) 从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field)。 |
32 | os.makedev(major, minor) 以major和minor设备号组成一个原始设备号 |
33 | [os.makedirs(path, mode]) 递归文件夹创建函数。像mkdir(), 但创建的所有intermediate-level文件夹需要包含子文件夹。 |
34 | os.minor(device) 从原始的设备号中提取设备minor号码 (使用stat中的st_dev或者st_rdev field )。 |
35 | [os.mkdir(path, mode]) 以数字mode的mode创建一个名为path的文件夹.默认的 mode 是 0777 (八进制)。 |
36 | [os.mkfifo(path, mode]) 创建命名管道,mode 为数字,默认为 0666 (八进制) |
37 | [os.mknod(filename, mode=0600, device]) 创建一个名为filename文件系统节点(文件,设备特别文件或者命名pipe)。 |
38 | [os.open(file, flags, mode]) 打开一个文件,并且设置需要的打开选项,mode参数是可选的 |
39 | os.openpty() 打开一个新的伪终端对。返回 pty 和 tty的文件描述符。 |
40 | os.pathconf(path, name) 返回相关文件的系统配置信息。 |
41 | os.pipe() 创建一个管道. 返回一对文件描述符(r, w) 分别为读和写 |
42 | [os.popen(command, mode[, bufsize]]) 从一个 command 打开一个管道 |
43 | os.read(fd, n) 从文件描述符 fd 中读取最多 n 个字节,返回包含读取字节的字符串,文件描述符 fd对应文件已达到结尾, 返回一个空字符串。 |
44 | os.readlink(path) 返回软链接所指向的文件 |
45 | os.remove(path) 删除路径为path的文件。如果path 是一个文件夹,将抛出OSError; 查看下面的rmdir()删除一个 directory。 |
46 | os.removedirs(path) 递归删除目录。 |
47 | os.rename(src, dst) 重命名文件或目录,从 src 到 dst |
48 | os.renames(old, new) 递归地对目录进行更名,也可以对文件进行更名。 |
49 | os.rmdir(path) 删除path指定的空目录,如果目录非空,则抛出一个OSError异常。 |
50 | os.stat(path) 获取path指定的路径的信息,功能等同于C API中的stat()系统调用。 |
51 | [os.stat_float_times(newvalue]) 决定stat_result是否以float对象显示时间戳 |
52 | os.statvfs(path) 获取指定路径的文件系统统计信息 |
53 | os.symlink(src, dst) 创建一个软链接 |
54 | os.tcgetpgrp(fd) 返回与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组 |
55 | os.tcsetpgrp(fd, pg) 设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。 |
56 | os.tempnam([dir[, prefix]]) **Python3 中已删除。**返回唯一的路径名用于创建临时文件。 |
57 | os.tmpfile() **Python3 中已删除。**返回一个打开的模式为(w+b)的文件对象 .这文件对象没有文件夹入口,没有文件描述符,将会自动删除。 |
58 | os.tmpnam() **Python3 中已删除。**为创建一个临时文件返回一个唯一的路径 |
59 | os.ttyname(fd) 返回一个字符串,它表示与文件描述符fd 关联的终端设备。如果fd 没有与终端设备关联,则引发一个异常。 |
60 | os.unlink(path) 删除文件路径 |
61 | os.utime(path, times) 返回指定的path文件的访问和修改的时间。 |
62 | [os.walk(top, topdown=True[, οnerrοr=None[, followlinks=False]]]) 输出在文件夹中的文件名通过在树中游走,向上或者向下。 |
63 | os.write(fd, str) 写入字符串到文件描述符 fd中. 返回实际写入的字符串长度 |
64 | os.path 模块 获取文件的属性信息。 |
65 | os.pardir() 获取当前目录的父目录,以字符串形式显示目录名。 |
66 | os.replace() 重命名文件或目录。 |
16 序列化与反序列化
Python3 中可以使用 json 模块来对 JSON 数据进行编解码
,它主要提供了四个方法: dump、dumps、load、loads
。
格式转换表:

16.1 序列化(dump,dumps)
-
dump
python''' obj -- 序列化对象 fp -- 文件描述符,将序列化的str保存到文件中。 skipkeys -- 默认为False。如果skipkeys是True则将跳过不是基本类型(str,int,float,bool,None)的dict键,不会引发TypeError ensure_ascii -- 默认值为True,能将所有传入的非ASCII字符转义输出。如果ensure_ascii为False,则这些字符将按原样输出(ensure_ascii=False,让文件中的中文可以直接显示!) check_circular -- 默认值为True。如果check_circular为False,则将跳过对容器类型的循环引用检查,循环引用将导致OverflowError allow_nan -- 默认值为True。如果allow_nan为True,则将使用它们的JavaScript等效项(NaN,Infinity,-Infinity)。如果allow_nan为False,则严格遵守JSON规范,序列化超出范围的浮点值(nan,inf,-inf)会引发ValueError indent -- 设置缩进格式,默认值为None,选择的是最紧凑的表示。如果indent是非负整数或字符串,那么JSON数组元素和对象成员将使用该缩进级别进行输入;indent为0,负数或""仅插入换行符;indent使用正整数缩进多个空格;如果indent是一个字符串(例如"\t"),则该字符串用于缩进每个级别。 separators -- 去除分隔符后面的空格,默认值为None。如果指定,则分隔符应为(item_separator,key_separator)元组。如果缩进为None,则默认为(',',':');要获得最紧凑的JSON表示,可以指定(',',':')以消除空格。 default -- 默认值为None。如果指定,则default应该是为无法以其他方式序列化的对象调用的函数。它应返回对象的JSON可编码版本或引发TypeError。如果未指定,则引发TypeError。 sort_keys -- 默认值为False。如果sort_keys为True,则字典的输出将按键值排序。 ''' json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
-
dumps
python# dumps函数不需要传文件描述符(fp),其他的参数和dump函数的一样。 json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)
-
例子
python# dumps可以格式化所有的基本数据类型为字符串 data1 = json.dumps([]) # 列表 print(data1, type(data1)) data2 = json.dumps(2) # 数字 print(data2, type(data2)) data3 = json.dumps('3') # 字符串 print(data3, type(data3)) dict = {"name": "Tom", "age": 18} # 字典 data4 = json.dumps(dict) print(data4, type(data4)) with open("test.json", "w", encoding='utf-8') as f: # indent 格式化保存字典,默认为None,小于0为零个空格。indent=4缩进4个空格 f.write(json.dumps(dict, indent=4)) # json.dump(dict, f, indent=4) # 传入文件描述符,和dumps一样的结果
16.2 反序列化(load,loads)
-
load
python''' fp -- 文件描述符,将fp(.read()支持包含JSON文档的文本文件或二进制文件)反序列化为Python对象 object_hook -- 默认值为None,object_hook是一个可选函数,此功能可用于实现自定义解码器。指定一个函数,该函数负责把反序列化后的基本类型对象转换成自定义类型的对象。 parse_float -- 默认值为None。如果指定了parse_float,用来对JSON float字符串进行解码,这可用于为JSON浮点数使用另一种数据类型或解析器 parse_int -- 默认值为None。如果指定了parse_int,用来对JSON int字符串进行解码,这可以用于为JSON整数使用另一种数据类型或解析器 parse_constant -- 默认值为None,如果指定了parse_constant,对-Infinity,Infinity,NaN字符串进行调用。如果遇到了无效的JSON符号,会引发异常。如果进行反序列化(解码)的数据不是一个有效的JSON文档,将会引发 JSONDecodeError异常。 ''' json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
-
loads
python''' s -- 将s(包含JSON文档的str,bytes或bytearray实例)反序列化为Python对象 ''' json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)
-
例子
pythonimport json dict = '{"name": "Tom", "age": 18}' # 将字符串还原为dict data1 = json.loads(dict) print(data1, type(data1)) with open("test.json", "r", encoding='utf-8') as f: data2 = json.loads(f.read()) # load的传入参数为字符串类型 print(data2, type(data2)) f.seek(0) # 将文件游标移动到文件开头位置 data3 = json.load(f) print(data3, type(data3))
17.错误和异常
python
try:
## normal block
except A:
## exc A block
except:
## exc other block
else:
## noError block
finally:
## 无论异常是否发生都会执行
17.1 抛出异常 raise
python
raise [Exception [, args [, traceback]]]
17.2 断言 assert
assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常
python
>>> assert 1==1 # 条件为 true 正常执行
>>> assert 1==2 # 条件为 false 触发异常
import sys
assert ('linux' in sys.platform), "该代码只能在 Linux 下执行"
# 接下来要执行的代码
17.3 with 关键字
with语句用于异常处理,封装了
try...except...finally 编码范式,提高了易用性
python
'''
不使用 with,也不使用 try...except...finally
如果在调用 write 的过程中,出现了异常,则 close 方法将无法被执行,因此资源就会一直被该程序占用而无法被释放。
'''
file = open('./test_runoob.txt', 'w')
file.write('hello world !')
file.close()
'''
使用 try...except...finally
对可能发生异常的代码处进行 try 捕获,发生异常时执行 except 代码块,finally 代码块是无论什么情况都会执行,所以文件会被关闭,不会因为执行异常而占用资源。
'''
with open('./test_runoob.txt', 'w') as file:
file.write('hello world !')
# 使用 with 关键字系统会自动调用 f.close() 方法, with 的作用等效于 try/finally 语句是一样的。
with open('./test_runoob.txt') as f:
f.write('hello world !')
18.面向对象
18.1 类
python
# 简单类实例
class People:
# 构造函数
def __init__(self, name, age):
self.name = name
self.age = age
def fun(self):
return (self.name, self.age)
# 实例化类
p = People('ming', 18)
# 访问类的属性和方法
print(p.name)
print(p.fun())
18.2 类属性和方法
- 类的私有属性
__private_attrs :两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。 - 类的方法
类方法必须包含参数 self ,且为第一个参数,self 代表的是类的实例 - 类的私有方法
__private_method :两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
python
#!/usr/bin/python3
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('菜鸟教程', 'www.runoob.com')
x.who() # 正常输出
x.foo() # 正常输出
x.__foo() # 报错
18.3 类的专有方法
- init : 构造函数,在生成对象时调用
- del : 析构函数,释放对象时使用
- repr : 打印,转换
- setitem : 按照索引赋值
- getitem: 按照索引获取值
- len: 获得长度
- cmp: 比较运算
- call: 函数调用
- add: 加运算
- sub: 减运算
- mul: 乘运算
- truediv: 除运算
- mod: 求余运算
- pow: 乘方
18.4 继承
python
# 子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
# BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
python
#!/usr/bin/python3
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
s = student('ken',10,60,3)
s.speak()
# ken 说: 我 10 岁了,我在读 3 年级
18.5 多继承
python
'''
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
'''
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
python
#!/usr/bin/python3
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
#另一个类,多继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
#多继承
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("Tim",25,80,4,"Python")
test.speak() #方法名同,默认调用的是在括号中参数位置排前父类的方法
# 我叫 Tim,我是一个演说家,我演讲的主题是 Python
18.6 方法重写
python
#!/usr/bin/python3
class Parent: # 定义父类
def myMethod(self):
print ('调用父类方法')
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法
# 调用子类方法
# 调用父类方法
19.作用域
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
python
if True:
msg = "hello world"
print(msg)
# hello world
def test():
msg_inner = 'I am inner'
print(msg_inner)
# 未定义"msg_inner"
-
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域
python#!/usr/bin/python3 total = 0 # 这是一个全局变量 # 可写函数说明 def sum( arg1, arg2 ): #返回2个参数的和." total = arg1 + arg2 # total在这里是局部变量. print ("函数内是局部变量 : ", total) return total #调用sum函数 sum( 10, 20 ) print ("函数外是全局变量 : ", total) # 函数内是局部变量 : 30 # 函数外是全局变量 : 0
-
global 和 nonlocal 关键字
当内部作用域想修改外部作用域的变量时,就要用到 global 和 nonlocal 关键字了
python#!/usr/bin/python3 num = 1 def fun1(): global num # 需要使用 global 关键字声明 print(num) num = 123 print(num) fun1() print(num)
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了
python#!/usr/bin/python3 def outer(): num = 10 def inner(): nonlocal num # nonlocal关键字声明 num = 100 print(num) inner() print(num) outer()
19.1 特殊情况
python
#!/usr/bin/python3
a = 10
def test():
a = a + 1
print(a)
test()
# UnboundLocalError: cannot access local variable 'a' where it is not associated with a value
# 错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改
#!/usr/bin/python3
a = 10
def test():
global a
a = a + 1
print(a)
test()
# 11