python基本知识--for、while两类循环

📅 发布时间:2026/10/13 10:29:42
python基本知识--for、while两类循环
目录for循环for-eachrange函数range与列表常用特性enumerate函数并行遍历序列-zip()基本用法-元素配对配对语法例1·列表配对例2·列表配对zip()的截断itertools.zip_longestfor...else...map()函数例1·单序列应用例2·多序列应用遍历字符串与可常见迭代对象迭代器基础iter(对象)next(迭代器)手动迭代while循环while循环语法Java/Python对照表结束循环条件条件收尾flag(多事件退出最清晰)break手动退出continue 跳过回开头while与列表for循环不适用于列表例1·列表搬元素例2·循环删除指定元素例3·综合列表/字典while:条件/标志/break本文系统讲解Python循环结构涵盖for循环、while循环及其控制语句break、continue重点介绍range()、enumerate()、zip()、map()等函数的用法与特性。通过实例演示列表遍历、并行处理、索引获取、迭代器机制及常见应用场景强调for循环不适用于边遍历边修改列表推荐使用while循环实现动态操作。内容结合Java对比深入浅出适合掌握循环逻辑与高效编程技巧。for循环for-each基本语法for 变量 in 可迭代对象: 循环体range函数语法range(stop) range(start, stop) range(start, stop, step)start起始值默认是0stop结束值不包含step步长默认是1本函数自stop开始到stop-1结束默认步长for i in range(0,20): #range(0,20)等价于range(20) print(i,end ) #0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19等价于Javapublic class Main { public static void main(String[] args) { for(int i 0; i 20; i) { System.out.print(i ); } } }步长step等于2for i in range(0,20,2): print(i,end )等价于javapublic class Main { public static void main(String[] args) { for(int i 0; i 20; i2) { System.out.print(i ); } } }倒叙打印for i in range(10,0,-1): print(i,end )等价于Javapublic class Main { public static void main(String[] args) { for(int i 10; i 0; i--) { System.out.print(i ); } } }range与列表List range(30) for i in List: print(i,end )常用特性r range(10) print(len(r)) # 10 print(3 in r) # True print(10 in r) # False print(r[2]) # 2 print(r[2:5]) # range(2, 5) print(list(r[2:5])) # [2, 3, 4]enumerate函数本函数专门解决 Python 的 for 不给索引 这个痛点替代for i in range(len(...))如for i, name in enumerate(names): # ← 一个函数同时解出 i 和 name语法enumerate(iterable, start)iterable任何可迭代对象如列表、元组、字符串、字典、文件等。start索引起始值默认0。返回一个enumerate 对象是迭代器不是列表。K [汤,伊尹,盘庚,妇好,武丁] for i in range(len(K)): print(K[i]) for t,name in enumerate(K): print(f第{t1}位商朝代表{name})enumerate(K) 每次产出一个元组(0, apple)(1, banana)(2, cherry)在for里u和name就对其解包对比range(len(List))和enumerateK [汤,伊尹,盘庚,妇好,武丁] for i in range(len(K)): print(f第{i1}位商朝代表{K[i]}) print() for t,name in enumerate(K): print(f第{t1}位商朝代表{name})写法说明range(len(lst))先取长度再按索引访问容易越界、可读性差enumerate(lst)直接同时得到索引和值更 Pythonic补充zip() 并行遍历、for...else、map()、嵌套循环的控制范围以及理解 for 循环本质所需的迭代器基础并行遍历序列-zip()目前的 for 一次只能遍历一个序列。zip() 可以把多个序列“对应位置”的元素配对打包成元组从而 实现并行遍历——这在处理“两个列表一一对应”时极常用。基本用法-元素配对配对语法for lst1,lst2,...lst in zip(list1,list2,...list): print(f{lst1},{lst2},...,{lst})例1·列表配对lst1 [秦,楚,燕,赵,韩,魏,齐] lst2 [秦孝公,楚灵王,燕昭王,赵武灵王,韩昭王,魏文侯,齐威王] for country,name in zip(lst1,lst2): print(f{country}:{name})例2·列表配对names [张三, 李四, 王五] scores [80, 95, 70] # zip 把对应元素配对(张三,80) (李四,95) (王五,70) for name, score in zip(names, scores): print(f{name} 考了 {score} 分)zip 出来的每个元素是元组用几个变量就解包几个。zip()的截断当zip()内的各列表长度不一致时截断到最短的那个lst1,lst2,lst3 [],[],[] for num1 in range(1000): lst1.append(num1) for num2 in range(100): lst2.append(num2) for num3 in range(10): lst3.append(num3) for lt1,lt2,lt3 in zip(lst1,lst2,lst3): print(f{lt1}:{lt2}:{lt3})zip 默认“按最短截断”。如果希望按最长的序列对齐、缺的位置填默认值用 itertools.zip_longestitertools.zip_longest需要用到的模块import itertoolsimport itertools lst1,lst2,lst3 [],[],[] for num1 in range(1000): lst1.append(num1) for num2 in range(100): lst2.append(num2) for num3 in range(10): lst3.append(num3) for lt1,lt2,lt3 in itertools.zip_longest(lst1,lst2,lst3): print(f{lt1}:{lt2}:{lt3})小技巧想同时得到“序号 两个序列的值”可以把 enumerate 和 zip 组合for i, (a, b) in enumerate(zip(x, y)): ...for...else...Python 的 for和 while可以带一个 else但它的含义和 if-else 完全不同•循环正常跑完没有被 break 打断 → 执行 else 里的代码•循环中途被 break 打断→ 不执行 else。#判断一个数是否为素数 n 17 for i in range(2, n): if n % i 0: # 能被整除 → 不是素数 print(n, 是合数) break # 找到因子中断循环else 不执行 else: print(n, 是素数) # 没被 break说明没找到因子map()函数1.map()是 Python 内置函数用来对可迭代对象中的每个元素应用同一个函数并返回一个迭代器2.map(函数, 序列)会把函数依次作用到序列的每个元素上把结果收集起来返回。它是“对一批数据 做同一种变换”的简洁写法map(function, iterable, ...)function要应用的函数iterable一个或多个可迭代对象返回map对象迭代器不是列表例1·单序列应用有列表用map()求其长度、取绝对值#集中求长度 print(list(map(len,[takes exactly one argument,line 7, in module])))#[26, 19] #集中求绝对值 print(list(map(abs,[-324435,-56,-114514,1000])))#[324435, 56, 114514, 1000]例2·多序列应用lst1 [1,2,3,4,5,6,100] lst2 [-1,-2,-3,-4,-5,-6,-100] lst3 [55,44,33,22,11] lst4 [何,文,傻] lst5 [金,大,福] print(list(map(lambda x,y,z:x*yz,lst1,lst2,lst3)))#[54, 40, 24, 6, -14] print(list(map(lambda x,y,z:x**abs(y)//z,lst1,lst2,lst3)))#[0, 0, 0, 11, 284] print(*list(map(lambda a,b:ab,lst4,lst5)))#何金 文大 傻福map 返回的是“迭代器”惰性、不立即占内存所以想看内容要包一层 list()。实际上同样的事用列表推导式[len(x) for x in ...] 更直观、更 Pythonicmap 了解即可看到别人代码能读懂。以上lambda表达式的内容可以通过for循环列表推导式zip()实现print(list((x*yz for x,y,z in zip(lst1,lst2,lst3))))#[54, 40, 24, 6, -14] print(list(x**abs(y)//z for x,y,z in zip(lst1,lst2,lst3)))#[0, 0, 0, 11, 284] print(*list((xy for x,y in zip(lst4,lst5))))#何金 文大 傻福必须加上 list否则generator object genexpr at 0x000002C1DCD31210print(((x*yz for x,y,z in zip(lst1,lst2,lst3)))) print((x**abs(y)//z for x,y,z in zip(lst1,lst2,lst3))) print(((xy for x,y in zip(lst4,lst5)))) generator object genexpr at 0x000002C1DCD31210 generator object genexpr at 0x000002C1DCD31210 generator object genexpr at 0x000002C1DCCF0AC0遍历字符串与可常见迭代对象for 能遍历的不只是列表。凡是“能依次取出元素”的对象都可以直接 for#1. 遍历字符串逐个字符 for ch in abc: print(ch) # a b c # 2. 遍历字典默认遍历键 d {a: 1, b: 2} for key in d: print(key, d[key]) # 3. 遍历集合顺序不保证 for x in {3, 1, 2}: print(x) # 4. 遍历文件逐行大文件也省内存 # with open(a.txt) as f: # for line in f: # print(line.rstrip())迭代器基础为什么 for 能遍历这么多对象背后有一个统一的“迭代协议”了解它能看懂很多高级写法。 两个关键内置函数iter(对象)向对象要一个“迭代器”负责逐个吐元素的助手next(迭代器)让迭代器吐出下一个元素没有元素时抛出 StopIteration。手动迭代我们写的 for 循环Python 内部其实自动做了这件事先 iter() 取迭代器再反复 next() 取值直到遇到 StopIteration 就结束。lst [10, 20, 30] it iter(lst) # 取得迭代器 print(next(it)) # 10 print(next(it)) # 20 print(next(it)) # 30 # next(it) # 再取会报 StopIteration#下面的 for for x in [1, 2, 3]: print(x) # 本质等价于这个手动过程 it iter([1, 2, 3]) while True: try: x next(it) except StopIteration: break print(x)range、enumerate、zip、map 返回的都不是列表而是这种“迭代器/可迭代对象”——它们不一次 性占内存而是用的时候才生成下一个值。这也是 Python 处理海量数据如几百万条评论时省内存的关键while循环while循环语法while 条件:代码块i 0 while i 10: print(i) i 1#终止条件循环10次后i10不满足-False退出while无本行则死循环 0 1 2 3 4 5 6 7 8 9执行过程判断i 5如果为True执行循环体执行完后再判断一次直到条件为False循环结束Java/Python对照表特性C/JavaPythonwhilewhile (x 5)while x 5:括号可省冒号收尾break一样一样continue一样一样do-while有没有要么 while 前置要么 while True break结束循环条件条件收尾message while message ! quit:#当messgae quit时退出循环 message input(输入)flag(多事件退出最清晰)active True while active: msg input(若输入“quit”则本循环结束) if msg quit:#判断,当msg quit时执行下条语句 active False #active由True更新为False转回while active等价于while 0为假循环结束 else: print(msg)关于flagflag适用多条件退出条件过多会导致代码臃肿可读性降低作用“充当交通信号灯”和 break 相比flag 退出后还能 善后执行break后break后面的代码都不会执行breakflag退出方式当场跳走我自己要走了只改状态我把灯关了退出后直接到循环后面也是到循环后面适用就一个退出点就地走人多个退出点或退出原因要在循环外判断典型while True 用户输 quit游戏主循环、菜单系统、事件驱动running True # flag while running: print(1. 看评论 2. 发评论 3. 退出) choice input(请选择) if choice 1: show_comments() # 执行功能但不关灯 elif choice 2: post_comment() elif choice 3: running False # 只有选退出才关灯break手动退出while True: city input(城市(quit结束) ) if city quit: breakcontinue 跳过回开头n 0 while n 10: n 1 if n % 2 0: continue print(n) # 1 3 5 7 9while与列表for循环不适用于列表不应该在 for 循环中修改列表——for 遍历时改列表会让 Python 数不清元素。要边遍历边改就用 while。典例sandwich_orders [三明治A,三明治B,三明治C,三明治D,pastrami,pastrami,pastrami,pastrami,pastrami] finished_sandwiches [] for sandwich in sandwich_orders: if pastrami in sandwich_orders: sandwich_orders.remove(pastrami) print(fI made your {sandwich}.) finished_sandwiches.append(sandwich)例1·列表搬元素lst1 [a,b,c,d,e,f] lst2 [] while lst1:#当lst1 []时等价于while 0 lst2.append(lst1.pop(-1)) print(lst1) print(flst2 {lst2}) lst2.sort() print(flst2 {lst2}) print(-----------------------------------------) Lst1 [a,b,c,d,e,f] Lst2 [] while Lst1: Lst2.append(Lst1.pop(0)) print(Lst1) print(fLst2 {Lst2})例2·循环删除指定元素# 删除所有特定值 pets [cat, dog, mouse,tiger] while cat in pets: pets.remove(cat) print(pets)#[dog, mouse, tiger]例3·综合列表/字典# 用户输入填充字典小型调查系统 responses {} active True while active: name input(名字) ans input(回答) responses[name] ans # 字典收集 if input(继续(yes/no)) no: active False for n, a in responses.items(): # 结束统一展示 print(f{n}: {a})while:条件/标志/break# ① 条件收尾输入 quit 停 message while message ! quit: message input(prompt) # ② 标志 flag多事件退出最清晰 active True while active: msg input(prompt) if msg quit: active False else: print(msg) # ③ break 立即退出while True break 手动喊停 while True: city input(城市(quit结束) ) if city quit: break # continue跳过本次回开头打印奇数 n 0 while n 10: n 1 if n % 2 0: continue print(n) # 1 3 5 7 9