字符串和数值类型是不可变数据类型,当对应的变量的值发生变化时,会开辟新的空间地址存放新的变量值,比如传值函数在函数内改变变量会产生新变量地址
- lambda匿名函数
定义匿名函数,临时创建一个函数,只能使用一次
lambda 形参列表: 函数体(一行代码)
不需要return,运算结果就是返回值
fun(lambda a,b: a if a>b else b, 3, 2)
#返回两个数的最大值
列表[]
快速生成列表:
[列表元素表达式 for 自定义变量 in 可迭代对象]
list = [ele*2 for ele in range(1,5)]
元组()
元组是不可变序列,不可以被修改
但可以修改元组中所包含的list列表元素
定义只有一个元素的元组,需要加逗号
tuple = (1,)
- 元组在创建时间和占用的空间上都优于列表
- 元组能够对不需要修改的数据写保护
字符串""
字符串是由unicode构成的不可变序列
- ord()字符转码值
- chr()码值转字符
集合{}
不重复,无序,就不支持索引
- 创建空集合------->set()
集合生成式
{集合元素的表达式 for 自定义变量 in 可迭代对象}
字典
dict = {key : value}
dict[key] = value
key通常是字符串或者数字,value可以是任意数据类型
创建空字典:
{}或者dict()
- 字典的key是唯一的,如果存在重复的key,那么后面的value会覆盖前面的
字典生成式
{字典key的表达式: 字典value的表达式 for 表示key的变量,表示value的变量 in zip(可迭代对象,可迭代对象)}
导入模块import
- import 模块
- 导入模块的指定功能 from 模块 import 函数、类、变量…导入的项将直接导入到当前命名空间中,这可能会导致命名冲突,特别是当两个模块有相同名称的函数、类或变量时。
- from math import *
- import 模块 as 别名
- from 模块 import 函数、类、变量… as 别名
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 使用__name__可以避免模块中测试代码的执行 ,
__name__
是模块名,如果模块是在最高层代码环境中执行的,__name__
被设为字符串__main__
- 使用
__all__
可以控制import *时,哪些功能被导入(import 模块方式,不受__all__
的限制,)形式:__all__ = ['function']
别的文件导入后只能使用特指的function()
包
-
从结构上看,包是一个文件夹,该文件夹包含一个__init__.py文件,该文件夹可以用于包含多个模块文件,从逻辑上看,包可以视为模块集合
-
导入包
import 包名.模块
包名.模块.功能
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
from 包名 import 模块
模块.功能
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
from 包名.模块 import 功能
直接调用功能
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
from 包名.模块 import * -
在__init__.py中增加__all__=[允许导入的模块列表](针对from 包 import *方式生效,对import ××方式不生效)
类
self代表当前对象本身
在方法内部,要访问成员变量和成员方法,需要使用self
静态方法
@staticmethod 可以将类内方法转换为静态方法,如果是一个静态方法,可以不带self
调用方法:1.通过对象实例调用 2 .通过类名调用
构造方法
def __init__(self, 参数列表):
........
一个类只有一个__init__方法,如果写了多个,只有最后一个生效
也有实现多个构造方法,
构造方法没有返回值
继承
class deriverclassname(baseclassname):
statement
派生类就会自动拥有基类定义的属性和方法,但私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
“object”是所有其他类的基类,pycharm里面使用ctrl+h查看类继承结构
多重继承
如果有同名的成员,遵循从左到右的继承优先级(左边的父类优先级高)
子类里面调用父类方法:
通过super().xx方式去调用父类的方法
比如super().init()在子类构造器里调用父类构造器
如果子类和父类出现同名的成员,可以通过父类名、super()访问父类的成员
类型注解
像a:str这种形式的,像rust里面的类型说明
dicts : dict[str,int] = {"no": 100}
注释里面n2 = 1 #type:int
函数方法中的类型注解
def 函数/方法名(形参名:类型,形参名:类型. . .) -> 返回类型值:
函数体
针对多个要求使用Union类型
Union[X, Y]
等价于X |Y
,满足X或Y
导入Union:from typing import Union
isinstance(object, classinfo)
用于判断对象是否为某个类或其子类的对象
当调用对象成员时,会和对象本身动态关联
魔术方法(像函数重载)
str()
class对象
将类本身当作对象使用
静态方法
@staticmethod将方法转换为静态方法
静态方法不会接受隐式的第一个参数self
j静态方法既可以由类调用,也可以由实例调用
抽象类
1.abc模块定义抽象基类
2.使用@abstractmethod声明抽象方法
from abc import ABC,abstractmethod
#抽象类
class typename(ABC):
#抽象方法
@abstractmethod
def func(self):
pass
抽象类不能实例化
子类继承抽象类,并实现抽象方法
抽象类需要继承ABC,并且需要至少一个抽象方法
如果一个类继承了抽象类,必须实现抽象类的所有抽象方法,否则它仍是一个抽象类
错误和异常
执行时检测到的错误就是异常
捕获异常的语法
try:
可能出现异常的代码
except [异常 as 别名]:
发生异常时,对异常处理的代码
[else:]
没有发生异常,执行的代码
[finally:]
不管有没有异常,都要执行的代码
可以由多个except子句,捕获不同的异常
如果发生异常,只会匹配一个except子句(先写具体的异常,再写基类异常)
一个except子句,可以捕获不同的异常(except (IndexError, ZeroDivisionError, NameError) as e:
)
主动触发异常
raise语句支持强制触发指定的异常
try:
raise ZeroDivisionError("主动触发除0异常")
except: ZeroDivisionError as e:
print(f"捕获到的异常信息->{e} 类型->{type(e)}")
自定义异常
要求:当接收person年龄时,要求范围在18-120之间,否则抛出一个自定义异常
class ageError(Exception):
pass
while True:
try:
age=int(input("请输入年龄(18-120):"))
if not (18<=age<=120):
raise ageError("年龄需要在18-120之间")
break
except ValueError as e:
print("你输入的不是整数")
except ageError as e:
print(e)
print(f"你输入的年龄是{age}")
文件操作
mode = w 如果文件不存在,会创建文件,写入时会清空文件内容
mode = a 是以追加方式写入
os.path.exists(path)
os.remove(path)
目录操作
import os
os.path.isdir(path)
os.mkdir(path)
创建多级目录-》os.makedirs(多级目录path)
os.rmdir(path)
删除多级目录-》os.removedirs(多级目录path)
文件信息
import os
import time
f_stat = os.stat(path)
print(f"文件大小->{f_stat.st_size} \n"
f"最近的访问时间->{time.ctime(f_stat.st_atime)} \n"
f"最近的修改时间->{time.ctime(f_stat.mtime)} \n"
f"文件创建时间->{time.ctime(f_stat.ctime)}")
with open("path", "r", encoding="UTF-8") as f:
lines = f.readlines()
print("-----文件内容-----")
for line in lines:
print(line, end="")
print("\n文件是否关闭->", f.closed)
输出多级目录下的文件信息
- 获取文件夹(目录)的所有内容(元素),包含了文件和目录
- 判断是文件还是目录,输出对应的信息
- 如果是目录,输出信息后递归处理
- 如果是文件,直接输出信息
def print_dir_all_content(dir_path):
content_list = os.listdir(dir_path)
for ele in content_list:
child_ele = dir_path + '/' + ele
if os.path.isdir(child_ele):
print(f"目录:{child_ele}")
print_dir_all_content(child_ele)
else:
print(f"文件:{child_ele}")
time模块
import time
t = time.time() #时间戳
t = time.localtime() #结构化时间
t = time.strftime('%Y-%m-%d %H:%M:%S', t)
def get_time():
t = time.localtime()
s = time.strftime('%Y-%m-%d %H:%M:%S', t)
return s