文章目录
1. while循环
1.1 什么是循环?
-
主要强调一个周而复始的概念,即满足条件重复执行。 但是有3个注意条件:
- 循环开始
- 判断条件
- 控制判断条件的增减,即,步长
-
根据上面的提示,我们可以去联想一些生活中的案例,分析一下,有什么相同的地方 ?。
- 操场跑圈
- 打印机打印文件
- 切黄瓜
- 爱你一万年
-
通过
print("跑了第i 圈")
输出的形式,模拟操场跑圈。- 第一种情况: 跑5圈。
- 第二种情况: 跑1万圈。
#第一种情况,跑5圈 print("跑了第1圈") print("跑了第2圈") print("跑了第3圈") print("跑了第4圈") print("跑了第5圈") # 那么跑 1万圈 怎么实现? 复制+黏贴?
1.2 while 循环
1.2.1 语法结构
-
循环三要素:
- 起始化值,
- 循环条件,
- 步长(控制循环)。
-
while
循环的语法格式:- 注意 步长控制的格式缩进.,
1.初始化值 while 2.判断条件: 执行语句(需要循环地方) 3.控制循环(步长)
-
结合语法结构, 完成跑操场跑一万圈.
- 第一个注意: 格式上的缩进.
- 第二个注意: 字符串输出的格式化
f " {} "
#第二种情况使用while语法格式跑1万圈 #1. 初始化值 i=1 while i<=10000 :#2.判断条件 # 需要循环的语句 print(f"跑了第{i}圈") #3.步长控制循环 i+=1
1.2.2 循环中的异类
-
无限循环又叫做 “死循环”,就是不会停止
- 请思考, 什么情况下会出现死循环?
# 1. 什么是无限循环 ? while True: # 判断条件永远会执行. print("永远和你在一起")
-
自己动手,通过 Debug 来查看循环的执行过程? 并给出你的结论.
- 注意观看 Debug控制台.
- 注意观看 Debug控制台.
1.3 while循环使用案例
1.3.1 求1~100之间的和
- 相当于从1累加到100.
- 提示: 起始值从 1开始.
""" 1. 第一种计算 1到100和 1.1 相当于 1+2+3...+100. 1.2 循环三要素: 初始化值 判断条件 步长(控制循环) """ #1. 初始值 i = 1 #3. 累计每一次的和 sum =0 #2.1-100之间的和 判断条件 i<=100 while i<=100: sum=sum+i #相当于每次循环累计一次. i+=1 # 步长控制循环 #循环结束输出 sum值 print(sum) #5050
1.3.2 求1~100之间偶数之和
-
什么是偶数?
- 需要使用运算符
%
去解决. - 使用Debug 查看.
# i%2==0 就是偶数 i = 1 oushu = 0 while i <= 100: # 进行判断偶数 if i % 2 == 0: oushu = oushu + i i += 1 # 步长 print(f"偶数之和{oushu}") #2550
- 需要使用运算符
-
第二种方式,通过改变控制条件, 来得到偶数.
- 需要注意初始化值. 思考?从0开始和从2开始的区别?
- 如果是使用步长控制值的变化,那么还需要使用选择结构去进行判断么?
# 第二种写法 i = 0 #既然是偶数相加可以从0开始,或者从2开始. oushu = 0 while i <= 100: #就不用判断了. oushu = oushu + i # 通过步长来控制循环,相当于2 i = i + 2 print(f"偶数之和是{oushu}")#2550
-
自己动手做: 请算出 1~100奇数之和.
- 思考一下, 这两种写法有什么区别? 用自己的语言描述一下.
#提示: 什么是奇数? #通过步长控制? #TODO coding
1.3.3 循环中的"标志变量"
-
妈妈每次都要问小明,“你作业做完了么?”,小明只有作业做完了才能出去玩, 没有做完就继续做,直到做完作业才可以.
- 循环中标志变量的使用.
''' 1. 标志变量一般在循环中相当于一个开关, 碰到了该变量就会停止, ''' # 声明一个标志变量 answer = "no" while answer == "no": print("作业中.....") answer = input("妈妈问: 小明作业做完了么?")#相当于步长. print(f"小明的回答是{answer}") print("程序结束")
- 第二种模式, 使用分支结构.
- 循环只有为True才能循环, 为False跳出循环.
answer = True while answer: answer = input("作业做完了么?") # print(f"小明回答,{answer}") if answer=="no": #如果回答no 就需要继续循环,循环就是为True时,才可以. answer=True else: answer = False print("程序结束")
-
扩展: 如果我想知道妈妈一共问了多少次?
- 怎么做?
#声明计数器
count = 0
#循环结构中使用
while ...
#TODO 逻辑代码
count = count + 1
1.4 嵌套循环使用
1.4.1 嵌套循环语法结构
-
嵌套顶级,核心语法
- 联想钟表:分针走一次, 秒针需要走一圈.
- 即: 外循环循环一次, 内循环循环一圈.
-
嵌套循环的语法结构
- 外层循环执行一次, 内层循环执行多次.
while 判断条件: #外循环 代码 1 while 判断条件: #内循环 代码2: 步长控制2 步长控制1
1.4.2 嵌套练习
-
要求输出一下格式,循环嵌套的目标结果.
- 操场跑圈,一共要跑5圈, 每跑一圈,需要做3个俯卧撑.
''' 第1圈 做了第1个俯卧撑 做了第2个俯卧撑 做了第3个俯卧撑 第2圈 做了第1个俯卧撑 做了第2个俯卧撑 做了第3个俯卧撑 第3圈 ... '''
-
根据上述需求,可以得知,一共跑5圈,每次3个俯卧撑
- 提示 : 可以先创建外层循环, 内层循环使用print()输出5次.然后再将内层循环带入.
- 注意: 格式上的缩进, 步长控制.
- 使用断点测试代码.
i = 1 while i <= 5: print(f"跑了第{i}圈") #准备做俯卧撑 #print("做俯卧撑") # 内层循环,直接带入. j = 1 while j <= 3: print(f"\t做第{j}个俯卧撑") #使用制表符 j += 1 #注意格式缩进 # 外层循环控制 i += 1
1.5 欧几里德算法–最大公约数
-
一个数可以整除几个数,那么这几个数称为公约数.
- 1是最小公约数
-
核心思想:% 表示求模运算(取余数)
- 将两个数, 用较大的数%较小的数,得到 余数。
- 将 较小的数和余数再进行同样的操作,直到 余数为 0。
- 此时,较小的数就是原来两个数的最大公约数。
''' 欧几里德算法 相除法 ''' a = int(input("请输入a的值: ")) b = int(input("请输入b的值: ")) # 1. 使用大数取模运算小数 # 1.1 下一步是大数%小数 取余数 if a < b: a, b = b, a # 2. 这时候小的数就应该是 b了,因为大数给a了 # 2.1 最小数b的值不能等于 0 因为要做除法 while b != 0: # 2.2 因为交换完成了,a值应该大于b r = a % b # 得出余数 a = b b = r # 什么时候为0 什么时候跳出循环. print(f"最大公约数就是的值是 {a}")
# 拓展二: 函数的方法 def gcd(a, b): """ 计算 a 和 b 的最大公约数 """ while b: a, b = b, a % b return a # 测试代码 print(gcd(10, 25)) # 5 print(gcd(14, 28)) # 14
- 将输入的两个数中的较大数赋值给 a,将较小数赋值给 b,如果 a < b,则交换 a 和 b 的值。
- 用 b 除以 a,得到商 q 和余数 r。
- 如果 r 为 0,说明当前的 a 就是输入的两个数的最大公约数,退出循环并返回 a。
- 否则,将 b 赋值为 a,将 a 赋值为 r,然后继续执行步骤 2
2. for 循环
2.1 语法结构
-
for循环也是循环,也是表示重复做某些事,只是语法格式同while循环不一样.
- 但是原理是一样的.
-
语法格式
- 注意: 是可以迭代序列、int类型就不可以。
for 输出变量名 in 可迭代序列: 循环体
-
入门案例 变量字符串.
- 遍历字符串 “hello,world”
#遍历该字符串 for i in "hello,world": print(i)
2.2 练习: 获取1~5的整数
-
获取1~5的整数
#1.直接输入整数是不行的.需要一个范围,且是字符串形式 # for i in 12345: # print(i) # TypeError: 'int' object is not iterable print("-"*20) #华丽的分隔符 #2.需要使用字符串的形式 for i in "12345": print(i)
2.2.1 range() 函数
-
range() 函数可创建一个整数列表, 一般用在 for 循环中使用.
range(start,stop,step)
- start:起始值,默认为0。
- stop:终止值,生成的整数序列不包含该值。
- step:步长值,默认为1。
-
range()
使用的三种情况.- 自己总结一下规律.
- 反向遍历,从大到小
# 1. range(8) [0,8) for i in range(8): print(i) #根据输出结果自己总结 # 2. range(1,8) [1,8) for i in range(1,8): print(i) # 3. range(0,8,2) [0,8,2) 计数间隔2 for i in range(0,8,2): print(i) # 4.扩展知识 range(8,0,-2) for i in range(8,0,-2): print(i) # 相当于从反方向输出,即反向遍历
-
使用 for循环计算 1~100之间的和.
- 思考如果求:1~100的偶数之和呢?
- 扩展 : 也可以使用 range()函数中,步长解决问题
#设置累计求和 sum sum = 0 # for循环语法 range(1,101) for i in range(1,101):#需要加到100,[1,101) sum = sum+i #累计求和 print(f"1~100的值是{sum}")
2.3 for 循环的嵌套使用
2.3.1 统计单词中字符出现的次数
- 统计一个字符串中的$符号出现的次数.
- 还记得累计求和么?
''' 统计$出现的次数 ''' #定义统计变量 count = 0 str = "hel$l$o,w$or$ld" for i in str: if i == "$": #判断出现的字符。 # 进行统计一次 count = count + 1 print(count)
2.3.2 打印直角三角型
-
打印直角三角型
- 使用for循环的嵌套,
- 外循环控制行, 内循环控制输出次数
-
图形如下
* * * * * * * * * * * * * * *
-
代码:
- 举一个例子: 最快速的方式 ? 直接print输出,推荐使用 三引号.
- 使用带入方法,去编写代码.
""" 第二种方式:采用for循环的方式 分析一波: for 外层控制输出行数 for 内循环控制输出次数 第一次循环: for 外层循环第1次循环 for(内层) 输出1次 * 第二次循环: for 外层循环第2次循环 for(内层) 输出2次 * * 第三次循环: for 外层循环第3次循环 for(内层) 输出3次 * * * 第四次循环: for 外层循环第4次循环 for(内层) 输出4次 * * * * 第五次循环 for 外层循环第5次循环 for(内层) 输出5次 * * * * * """ for i in range(1,6): # [1,6) 相当于 1,2,3,4,5 次. #内层循环控制输出次数 for j in range(i): # 默认输出是"\n",需要该为end=""小细节 print("*",end=" ") #相当于换行 print("")
-
要求输入一个n打印出来相应的行数.即输入几就打印几行.
- 要了解
range(start,end,step)
的函数.
#.怎么分析代码? #当n =1 时 n=1 for i in range(n): for j in range(i): print("*", end=" ") print("") #当n=2时... n=2 for i in range(n): for j in range(i): print("*", end=" ") print("") # 当n=3时 ... n=3 for i in range(n): for j in range(i): print("*", end=" ") print("") # 最终: 所以得出结论,输入n+1 就是要打印的行数. n =4 for i in range(1,n+1): for j in range(i): print("*", end=" ") print("")
- 要了解
2.3.3 打印九九乘法表
-
使用循环来打印九九乘法表
""" 如何分析: 根据样式发现 外循环第一次循环 内循环一次 外循环 第二次 内循环输出二次 外循环 循环9次 内循环输出9次 """ # 根据语法格式 先搭建外循环构架 for i in range(1, 10): for j in range(1, i + 1): # 需要使用i+1 输出第一个 print(f"{j}x{i}={i * j}", end=" ") print("") print("*"*20)
-
思考: 第二种需求,当输入n时 生成 相应的乘法表.
#2,第二种需求,当输入n时 生成 相应的乘法表. n = 11; for i in range(1, n+1): for j in range(1, i + 1): # 需要使用i+1 输出第一个 print(f"{j}x{i}={i * j}", end=" ") print("")
2.3.4 计算阶乘
-
阶乘是一个正整数连乘自己 及之前所有正整数的结果。通常用感叹号(!)表示。
- 例如,5的阶乘表示为5!
- 还记得 累计求和的写法?
5! = 5 × 4 × 3 × 2 × 1 = 120
-
输入一个数,计算阶乘是多少?
- 提示: 注意类型转换。
- 注意: range()格式写法,从什么开始?
num = int(input("请输入一个数: ")) # 计算这个数就相当于从1开始到这个数的乘法 # n!= 1x2x3x4x5...n # 所以说需要循环 res = 1 # range()范围格式是什么样的? #range(num) 可以这样写么?为什么 for i in range(1,num+1): res = res * i # 累计求乘法 print(i) print(res)
2.4 break 和 continue
2.4.1 break
-
break 语句用于结束整个循环.
- 演示break的循环过程
- 只能使用在循环之中.
#1.break使用结构,跳出本次循环,并结束程序. i=1 while i<=10: print(i) #1 ,2,3 if i==3: break print(f"我执行了么?{i}") #后面的语句就不执行了. 1 ,2 i+=1
1 我执行了么?1 2 我执行了么?2 3
-
使用Debug查看.
2.4.2 continue
-
continue的作用是结束本次循环.执行下一次循环
- 演示continue 的循环过程.
- 只能使用在循环之中.
# 结束本次循环,执行下一次循环 for i in range(1, 10): print(i) if i == 3: continue print(f"我执行了么{i}") #相当于跳过了3,执行了后面.
2.5 扩展知识 while - else 结构
-
知道有if -else 结构, else 还可以和while一起使用.
- else执行也是有条件的.
- pass 占位符语句,又叫空语句.
# 1. 这叫做等式恒成立结构. 所以 else会是黄色的. if 5 > 3: print("if") else: print("else") # 2. pass 占位语句 if 5 > 3: # 如果不写会报错. pass # 使用pass占位,不执行任何,空语句 else: print("else") # 3. while-else结构 # 如果循环正常结束,循环输出就会执行 else里面 i = 1 # i =11 时 也会执行else里的内容 while i <= 10: print(i) i = i + 1 else: #循环条件不成立时,会执行! print("else") #3.1 如果循环中有break就不会执行. i = 1 while i <= 10: print(i) if i==3: break i = i + 1 else: print("else")
- 思考一下 ,
while
可以和else
一起使用,那么 for可以和else一起使用么?- 当for循环结束时, 会执行else。
- 如果 中间有break关键字的话,非正常结束不会执行else中的内容。
- continue 没有问题。
for i in range(10):
#if i ==3:
print(i)
#break
#continue
else:
print("我什么时候执行的!")