社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

30天入门Python(基础篇)——第7天:Python高级特性

码上编程学习社 • 3 月前 • 206 次点击  
资料已经打包好了,需要的关注公众号发送“111”领取


“学了一堆零散技巧,遇到实际问题还是不会用?”

“别人一行代码搞定的事,我写十行还报错?”

——这是新手学完基础后最常犯的愁。

今天咱们不拆单独知识点,而是把切片、迭代、列表生成式、生成器、迭代器这5个“高级武器”,融入“学生成绩分析”的实战场景,教你怎么组合使用,让代码效率翻倍。

场景导入:处理班级成绩数据

假设我们有一份班级成绩数据:scores = [85, 92, 78, 90, 88, 65, 72, 95, 83, 79, 58, 81],需要完成“提取高分、计算排名、生成分析报告”等任务,咱们用高级特性一步步搞定。

一、切片:3秒提取目标数据

需求:提取前5名成绩、后3名成绩,以及所有成绩的倒序排列。用切片不用循环,精准又快速。

scores = [85, 92, 78, 90, 88, 65, 72, 95, 83, 79, 58, 81]# 1. 先排序(升序),再切片sorted_scores = sorted(scores)# 提取后3名(高分,因为sorted默认升序)top3 = sorted_scores[-3:]print("前三名成绩:", top3)  # 输出[909295]# 提取后3名的倒序(从高到低)top3_desc = sorted_scores[-3:][::-1]print("前三名(从高到低):", top3_desc)  # 输出[959290]# 提取中间6-10名成绩(左闭右开,取索引5到9)middle = sorted_scores[5:10]print("中间5名成绩:", middle)  # 输出[7981838588]


避坑点:切片可以叠加使用(如[-3:][::-1]),但要注意顺序,先取范围再反转,不能搞反。

二、迭代+列表生成式:一行生成分析数据

需求:给每个成绩标注“等级”(≥90优秀,≥80良好,否则合格),生成“成绩-等级”的对照表。用迭代+列表生成式,一行替代3行循环。

# 列表生成式中嵌套条件判断,迭代成绩并标注等级score_level = [    (score, "优秀"if score >= 90     else (score, "良好"if score >= 80     else (score, "合格"    for score in scores]print("成绩等级对照表:", score_level)# 输出示例:[(85, '良好'), (92, '优秀'), ...]# 进阶:只保留良好及以上的成绩good_scores = [s for s, level in score_level if level != "合格"]print("良好及以上成绩:", good_scores)  # 输出[85, 92, 78, ...](过滤掉65以下)


列表生成式的核心是“表达式+循环+条件”,比普通for循环代码短、执行快,是Python的“招牌技巧”。

三、生成器:处理大数据不卡机

需求:如果班级有10万学生,计算每个学生的“成绩排名百分比”(如95分是99%的排名,意味着比99%的人高)。用生成器按需计算,避免内存爆炸。

def rank_percent(large_scores):    # 先排序,计算总人数    sorted_large = sorted(large_scores)    total = len(sorted_large)    for score in large_scores:        # 计算比当前成绩低的人数        lower_count = len([s for s in sorted_large if s < score])        # 计算百分比并返回,遇到yield暂停        yield (score, round(lower_count / total * 1002))


    
# 模拟10万条成绩数据(这里用12条演示,实际可替换为大数据)large_scores = scores * 8333  # 12*8333≈10万# 用生成器计算,内存占用仅几KBrank_gen = rank_percent(large_scores)# 取前5条数据查看for _ in range(5):    print("成绩-排名百分比:"next(rank_gen))


核心优势:10万条数据用列表生成式会占几十MB内存,用生成器只占几十字节,运行更流畅。

四、迭代器:统一遍历各种数据

需求:将“成绩列表”“等级字典”“生成器结果”三种不同数据,统一遍历输出分析报告。用迭代器让遍历逻辑一致,不用改代码。

# 1. 成绩列表转迭代器score_iter = iter(scores)# 2. 等级字典转迭代器(迭代键值对)level_dict = {"优秀"3"良好"6"合格"3}level_iter = iter(level_dict.items())# 3. 生成器本身就是迭代器rank_iter = rank_percent(scores)# 统一遍历函数,接收任意迭代器def print_iter(iterator, desc):    print(f"\n{desc}:")    for item in iterator:        print(item)# 调用同一函数遍历不同数据print_iter(score_iter, "成绩数据")print_iter(level_iter, "等级分布")print_iter(rank_iter, "成绩排名百分比")


迭代器的价值是“统一接口”,不管是list、dict还是生成器,都能用for循环或next()遍历,让代码更通用。

五、综合实战:生成完整分析报告

把上面的技巧组合起来,写一个“班级成绩分析”函数,一键生成报告:

def score_analysis(scores):    # 1. 基础统计(切片+列表生成式)    sorted_s = sorted(scores)    top3 = sorted_s[-3:][::-1]    avg_score = sum(scores) / len(scores)    # 2. 等级分布(列表生成式)    level_count = {"优秀":0"良好":0"合格":0}    for s in scores:        level = "优秀" if s>=90 else "良好" if s>=80 else "合格"        level_count[level] +=1    # 3. 生成排名百分比(生成器)    rank_gen = rank_percent(scores)    # 4. 迭代输出报告    print("=== 班级成绩分析报告 ===")    print(f"平均分:{round(avg_score, 2)}")    print(f"前三名成绩:{top3}")    print(f"等级分布:{level_count}")    print("前5名排名百分比:")    for _ in range(5):        print(next(rank_gen))# 调用函数,一键生成报告score_analysis(scores)


今天的重点不是死记每个特性的定义,而是理解它们的“使用场景”:切片用于精准取数,列表生成式用于快速造数据,生成器用于大数据处理,迭代器用于统一遍历。

实际开发中,这些技巧往往是组合使用的,多敲几遍今天的实战代码,你就能慢慢找到感觉。

【今日任务】用今天学的技巧,处理“[15,22,31,44,53,67,72,88,91]”这组年龄数据:

① 用切片取30-80岁的年龄;

② 用列表生成式给年龄标注“青年(<30)、中年(30-60)、老年(>60)”;

③ 用生成器计算每个年龄占总人数的百分比。

最后

以上就是今天给你分享的内容,觉得有用的话欢迎点赞收藏哦!

如果你也对Python这门编程感兴趣的话,欢迎加入我们。(小白也可以参加)

  Python零基础实战特训营 
三更老师亲自上课示范,2天:理论+实操教学+直播教学演示+课后辅导

获取方式:

1. 关注下方公众号↓↓↓↓

2.点赞+再看

3.在后台发送:“python” 即可领取资料福利/开通上课权限

资料已经打包好了,需要的关注公众号发送“111”领取

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190016