ython 高级语法
第 1 天推导式列表 / 字典 / 集合推导式推导式是 Python 特有的简写语法用一行代码快速生成列表、字典、集合替代传统for循环拼接数据代码更简洁、执行效率更高。分为三类列表推导式、字典推导式、集合推导式二、语法通用格式1.基础版【表达式 for 变量 in 可迭代对象】2.带条件版【表达式 for 变量 in 可迭代对象 if 对象】1. 列表推导式最常用含义快速创建 / 转换列表替代多行 for 循环。Demo1基础用法生成 0~9 数字列表#列表推导式写法list2 [i for i in range(10)]print(列表推导式:,list2)Demo2带条件筛选只保留偶数#筛选0-1的偶数even_lst [ i for i in range(10) if i % 20]print(筛选偶数:,even_lst)说明if i % 2 0过滤条件只把满足条件的元素加入列表。Demo3表达式加工元素做运算#每个数字乘以2double_lt [i *2 for i in rang(5)]print(元素乘2, double_lst)2.字典推导式含义快速生成、转化字典格式用{键值 for ...}Demo列表转字典 条件筛选#基础 下表元素组成字典data [a,b,c]dict1 { index: val for index, val in enumerate(data)}#enumerate 同时去出元素的下标和元素值print(下标元素组成字典:,dict1)条件筛选只保留大于1的项dict2 { k,v for k,v in {1:10,2:20,3:30}.items() if k1} #字典的item遍历字段逐个去除每一组的key和value3. 集合推导式生成集合自动去重格式{元素 for ...} 用发和列表推导式几乎一致Dmeo列表去重old_lst [1,2,2,3,3,3]new_set {x for x in old_lst}print(去重后的集合:,new_set)今日小结核心一行代码替代 for 循环优先掌握列表推导式工作用得最多格式记忆[元素 for 变量 in 遍历对象 if 条件]生成器 Generstor一、含义讲解1、列表推导式会一次性把所有数据存入内存数据量大时占用内存极高2、生成器是惰性迭代器用一个取一个不会一次性加载全部数据极大节省内存3、两种创建方式生成器表达式、生成器函数带 yield生成器表达式和列表推导式仅符号不同把列表推导式的[]改成()就是生成器表达式。#列表推导式lst [ i for i in range(10000)]print(列表推导式:,type(lst))#生成器表达式 :惰性加载gen (i for i in range(10000))print(生成器类型, type(gen))#取值方式1next逐个取print(next(gen))print(next(gen))#取值方式2for循环遍历推荐for num in gen:if num 5 :breakprint(num, end )关键说明生成器只能向前遍历不会回退取完就空了大数据场景百万 / 千万条数据优先用生成器。2.生成器函数yield关键词含义普通函数用return返回结果执行结束生成器函数用yield返回数据暂停执行下次取值继续往下走Demo1基础 yield 用法def my_generator():print(生成器函数开始)yield 1 #暂停 返回1print(生成器函数继续)yield 2 #暂停 返回2print(生成器函数结束)return 3 #返回值调用函数得到生成器对象my_gen my_generator()#第一次next:执行到第一个yield暂停next(my_gen)print(第一次next:,next(my_gen))#第二次next:执行到第二个yield暂停next(my_gen)print(第二次next:,next(my_gen))#第三次next:执行到return语句结束生成器函数print(第三次next:,next(my_gen))#第四次next:抛出StopIteration异常next(my_gen)Demo2实战 - 无限数列生成器经典场景def infinite_num():n 0while True:yield nn 1g infinite_num()#循环取值不会内存溢出for _ in range(5):print(next(g))今日小结列表一次性加载占内存生成器惰性取值省内存。标识()生成器表达式 / 函数内写yield就是生成器。取值next()或for循环。第 3 天迭代器 Iterator 可迭代对象 Iterable1、含义讲解1.可迭代对象iterable凡是能用for循环遍历的对象列表、字典、字符串、元组、集合、生成器等内部实现了__iter__方法。2.迭代器iterator:是可迭代对象的取值器内部实现__item__和__next_,可以用next逐个取值3.关系可得带对象 - 通过item转化未迭代器lst [1,2,3]print(isinstance(lst, iterable)) #True 可迭代print(isinstance(lst, Iterator)) #False 不是迭代器#2.iter()把可迭代对象转为迭代器it iter(lst)print(isinstance(it, Iterator)) #True 是迭代器#3.next()取值print(next(it))print(next(it))Demo2自定义迭代器手写迭代器类通过类实现__iter__和__next__打造自己的迭代器。class MyIterator:def __init__(self, start, end):self.start startself.end end#必需实现:返回迭代器资深def __iter__(self):return self#必须实现 每次next执行返回下一个元素def __next__(self):if self.startself.end:#遍历完成抛出停止迭代异常raise StopIterationres self.startself.start 1return res#使用自适应迭代器obj MyIterator(1, 5)for i in obj:print(i)今日小结可迭代对象能for遍历 迭代器能next取值生成器本事就是一个特殊的迭代器装饰器 Decoratorh含义1.装饰器本职 闭包函数参数 是一个包装函数2.作用在不修改原函数代码、不改变原函数调用方式的前提下给函数新增功能日志、计时、权限校验、缓存等。3.语法糖装饰器名简化调用。1. 基础装饰器无参数Demo1手写计时装饰器统计函数执行时间import time#定义装饰器def timer(func):#内层函数包装原有功能def wrapper():start time.time()#执行原函数func()end time.time()rpint(f函数执行耗时{end - start}秒)#返回内层函数不调用return wrapper#使用装饰器 timer 等价于 test timer(test)def test():print(测试函数)time.sleep(1)print(原函数执行完毕)#timer(func)接收被装饰的函数作为参数wrapper增强后的函数先执行新增逻辑再执行原函数timerPython 语法糖一行绑定装饰器Demo2被装饰函数带参数def logger(func):def wrapper(*args,**kwargs):print(日志函数开始执行)#把参数传给原数据res func(*args,**kwargs)print(f函数执行完毕{func.__name__})return wrapperloggerdef add(a,b):return abprint(add(1,2))print(add(3,4))说明*args **kwargs接收任意位置参数、关键字参数通用写法。2. 带参数的装饰器#外层函数接受装饰器参数def out(flag):def decorator(func):def wrapper():if flag:print(开启权限校验)func()return wrapperreturn decorator#传参給装饰器outer(flagTrue)def hello():print(hello world)hello()hello()今日小结核心原则开闭原则不改原函数扩展功能。三层结构无参装饰器外层接收函数→内层包装有参装饰器多一层外层接收参数。常用场景日志、计时、接口鉴权、缓存。第 5 天闭包 nonlocal 关键字一、含义讲解闭包定义在函数内部的内层函数引用了外层函数的变量且外层函数返回内层函数着中国组合就是闭包2特点内层函数会保留外层函数的变量环境外层函数执行完毕后变量不会被销毁。3、nonlcal修改外层函数局部变量Demo1基础闭包pythondef out():num 10 外层局部变量#内层函数 引用外层变量def inner():print(num)#返回内层函数 闭包return inner#接受闭包函数func out()func() #输出10外层函数已执行完变量任保存Demo2nonlocal 修改变量def outer():count 0def inner():#声明count不是本地变量是外层函数变量nonlocal countcount 1print(count)return innerf1 outer()f1()f1()f1()Demo3对比 global拓展num 100def test():global numnum 100print(num)test()区分global :修改全局变量nnlocal :修改外层函数 局部变量仅嵌套函数今日小结闭包三要素嵌套函数 内层引用外层变量外层返回内层nonlocal专门处理嵌套函数种外层变量的修改第 6 天匿名函数 lambda 高阶函数map/filter/sorted一、含义讲解1.lambda 匿名函数一行简单函数 无函数名合适临时简单逻辑语法lambda 参数表达式2.高阶函数接受参数作为参数的函数常用map、filter、sorted1. lambda 匿名函数Demodef add(a,b):return ab#等价lambda匿名函数f lambda a,b : abprint(f(1,2))#无参数lambdaf2 lambda: helloprint(f2())限制lambda 只能写一条表达式不能写魂环if语句快2. 高阶函数组合使用Demo1map () 映射对每个元素执行函数#列表每个元素乘2lst [1,2,3,4]map(处理逻辑, 要遍历的数据)#lambda x: x*2匿名函数res map(lambda x: x*2,lst)print(list(res))Demo2filter () 过滤保留条件为 True 的元素#筛选偶数lst [1,2,3,4,5]res filter(lambda x: x%20,lst)print(list(res))#sotrted()自定义排序#按字典value排序data [{name:a, age:20}, {name:b, age:15}]#按key指定排序依据new sorted(data,key lambda x: x[age])print(new)今日小结lambda简短逻辑临时函数一行表达式map:批量处理元素filter过滤元素sorted自定义排序第 7 天上下文管理器 with 魔术方法enter/exit1、含义讲解with上下文管理器自动资源管理代码块结束后自动关闭资源文件、数据库连接、网络请求等无需手动写close()就算代码报错也能正常释放资源。底层依赖两个魔法方法_enter_:进入winf代码块时自动执行_exit_:离开代码块时自动执行1. 内置 with 用法文件操作最常用Demo#传统写法需要手动close异常可能导致资源不释放f open(test.txt,w,encodingutf-8)f.write(hello world)f.close()#with写法自动关闭文件with open(test.txt,w,encodingutf-8) as f:f.write(hello world)print(文件写入完成)#出了代码快文件自动关闭2. 自定义上下文管理器手写类实现class MyResource:#进入with快执行def __enter__(self):print(资源获取成功)return self #对应as后变量#离家with快执行异常也会触发def __exit__(self,exc_type,exc_val,exc_tb):print(关闭资源)#返回True压制异常。False不压制异常return Truedef do_something(self):print(做些什么)#使用自定义上下文管理with MyResource() as res:res.do_something()# 主动报错测试异常场景1 / 0今日小结with 核心自动释放资源替代手动 close。自定义管理器靠__enter__和__exit__两个魔术方法。作场景文件、MySQL 连接、Redis 连接、网络请求。什么是高阶函数满足任意一条接受高阶函数1.接受另一个函数作为参数2.讲函数作为返回值返回Python 里函数是一等公民可以赋值、传参、返回、存进容器这是高阶函数能实现的基础。2. 前置铺垫函数赋值必懂普通函数可以像变量一样赋值給嵌套名称调用方式不变#定义普通函数def hello(name):print(fhello {name})#把函数复制給变量f (注意不要加,加是调用函数)f helloprint(f(测试开发))解析hello是函数对象本身hello()是执行函数并拿返回值f hello两个变量指向同一个函数后续f()等价hello()二、第一类高阶函数函数作参数工作最常用场景说明把逻辑函数传给工具函数工具函数统一做遍历、过滤、转换测开里数据处理、批量请求、筛选测试数据天天用。示例 1手写简易高阶函数理解底层自己实现一个接收函数参数的高阶函数看懂原理。#1.定义逻辑函数业务逻辑def double(x):return x*2#定义高阶函数接受函数 列表def handle_lista(func,lst):res []for i in lst:res.append(func(i))return res#3.使用把double函数传进去不穿data [1,2,3,4]res handle_lista(double,data)print(res)逐行解析1、handle_list(func, lst)func专门接收函数对象2、func(item)执行外部传入的函数处理每一个元素3、调用时handle_list(double, data)只写函数名代表传函数本身拓展换不同逻辑函数不用改handle_list符合开闭原则def square(x):return x **2print(handle_list(square, data)) # [1, 4, 9, 16]python 内置三大经典高阶函数面试 工作核心map/filter/sorted搭配lambda匿名函数使用最多分模块讲解。1. map () 映射函数含义map(函数可迭代对象)作业对可迭代对象中每一个元素一次执行传入的函数返回值迭代器需要转列表 / 元组查看结果适用批量转换、批量计算测试数据Demo1基础用法#普通函数 mapdef add_one(x):return x 1nums [10,20,30]#map(函数列表)it map(add_one,nums)print(list(it))# [11, 21, 31]Demo2搭配 lambda主流写法一行搞定nums [1, 2, 3] # 每个元素 * 3 res list(map(lambda x: x * 3, nums)) print(res) # [3, 6, 9]Demo多个可迭代对象a [1,2]b [10,20]#依次取a\b对应元素相加res list(map(lambda x,y: xy,a,b))print(res)#[11, 22]2 filtter过滤函数含义filter(判断函数可迭代对象)作业更具函数返回的布厄值筛选元素函数返回True 保留当前元素函数返回Flase舍弃当前元素返回值迭代器demo1基础用法def is_enen(x):return x%2 0nums [1,2,3,4,5,6]res list(filter(is_enen,nums))print(res)#[2, 4, 6]Demo2搭配 lambda高频# 筛选大于 3 的数字nums [1, 4, 2, 5, 3]res list(filter(lambda x: x 3, nums))print(res) # [4, 5]测开场景过滤无效测试数据、筛选失败用例、提取指定日志内容。3.sorted() 排序函数重点含义sorted(可迭代对象key函数reverse布耳值)key 指定排序规则函数高阶函数核心reverseTrue降序False升序默认升序区别list.sort()原地修改sorted()返回新列表不改动原数据Demo1基础排序 自定义规则#按元素绝对值排序nums [-5,3,-2,4]res sorted(nums,keylambda x: abs(x))print(res)#[3, -2, 4, -5]Demo2测开最常用场景 —— 字典 / 对象排序接口返回、测试数据大多是嵌套字典必掌握。sort_age_asc sorted(user_list ,keylambda x: x[age])print(按年龄升序, sort_age_asc)#2.按age降序排序sorted(user_list,keylambda x: x[age],reverseTrue)print(按年龄降序, sorted(user_list,keylambda x: x[age],reverseTrue))测开场景接口响应结果排序、测试报告数据排序、用例按优先级排序。四、第二类高阶函数函数作为返回值闭包 / 装饰器底层