一、循环语句for
for是python中的另一个循环语句,提供了更为强大的循环结构,它可以遍历任何序列;
例如:字符串、列表、元组、字典、集合等。
# for循环语法格式:
for 临时变量 in 被遍历对象:
代码块
# 注意:
# 被遍历的对象可以是任意序列,也可以是一个区间范围。
# 只要被遍历对象没有遍历完,就可以一直循环遍历,直到遍历结束。
二:for循环的常用2个函数
2.1: range()函数
# 功能:返回一个整数序列
# 语法:range(起始值start, 终止值end, 步长值step)
# 注意:range返回的区间范围是 [start , end),也就是说不包含终值end
# 参数1,start默认是0,可以省略不写
# 参数2,end没有默认值,不可以省略
# 参数3,step默认值为1,可以省略不写
for i in range(10):
print(i, end=' ') # 0 1 2 3 4 5 6 7 8 9
for i in range(0):
print(i, end=' ') # 空
for i in range(-10):
print(i, end=' ') # 空
for i in range(1, 11):
print(i, end=' ') # 1 2 3 4 5 6 7 8 9 10
for i in range(0, 30, 5):
print(i, end=' ') # 0 5 10 15 20 25
for i in range(0, -10, -2):
print(i, end=' ') # 0 -2 -4 -6 -8
for i in range(-10, 0, 2):
print(i, end=' ') # -10 -8 -6 -4 -2
练习题:
# 打印一个n行的等腰三角形
# 方法1: 循环嵌套
n = int(input("请输入三角形的行数:"))
for i in range(1, n+1):
for j in range(1, n-i+1):
print(' ', end='')
for k in range(1, 2*i):
print('*', end='')
print()
# 方法2: 拼接
n = int(input("请输入三角形的行数:"))
for i in range(1, n+1):
s = '*'*(2*i-1)
print(' '*(n-i)+s)
# 方法3: 格式化直接居中对齐输出
n = int(input("请输入三角形的行数:"))
for i in range(1, n+1):
s = '*'*(2*i-1)
print(f"{s:^{2*n-1}}")
2.2:len()函数
# 功能:返回一个序列[字符串、列表、元组等]的长度或者元素个数。
# 参数:序列[字符串、列表、元组等]
# 通常和range配合使用,用于序列中元素的计算。
s = "hello"
print(f"长度是{len(s)}", end=' ') # 长度是5
# 按元素遍历
for i in s:
print(i, end=' ') # h e l l o
# 按下标、索引遍历
for i in range(len(s)):
print(s[i], end=' ') # h e l l o
练习题:
# 1、输出一百以内的所有质数
for i in range(2, 101):
flag = True
for j in range(2, i):
if i%j==0:
flag = False
if flag:
print(i)
# 2、编程求 2000 以内的所有“完数”;
# 完数,是指一个数恰好等于它的因子值之和;
# 例如:6是完数,因为 6=1+2+3。
for i in range(1, 2001):
sum = 0
# 求因子
for j in range(1, i):
if i % j == 0:
sum += j
if i == sum:
print(f"{i}是完数")
# 3、已知一串5位数的密码,满足a开头,取值范围是1-9,其他4位由bcde代替
# 取值范围是0-9。密码要满足下面两个条件:
# ① abcde * a == eeeeee
# ② a b c d e互不相等
# 穷举算法:列举出所有的可能性进行逐一验证;
# 解题思路:
# ① 找对象[变量]
# ② 找范围
# ③ 找条件
# 我有一把密码锁,一位密码,问一个一个试密码,几种? 答:0到9
# 我有一把密码锁,两位密码,问一个一个试密码,几种? 答:10*10=100
for a in range(1, 10):
for b in range(10):
for c in range(10):
for d in range(10):
for e in range(10):
if (10000*a+1000*b+100*c+10*d+e) * a == 100000*e+10000*e+1000*e+100*e+10*e+e:
if a!=b!=c!=d!=e:
print(a, b, c, d, e)
三、循环控制关键字
break:结束本层循环;
continue:结束本次循环,继续下一次循环;
# break:结束本层循环
for i in range(1,6):
if i==3:
break
print(f"跑第{i}圈", end=' ') # 跑第1圈 跑第2圈
# continue:结束本次循环,继续下一次循环;
for i in range(1,6):
if i==3:
continue
print(f"跑第{i}圈", end=' ') # 跑第1圈 跑第2圈 跑第4圈 跑第5圈
练习题:
# 用户由键盘输入用户名和密码,分别保存在user和psd中;
# 同时验证用户名和密码是否正确,用户名默认为admin,密码默认为666888
# 如果正确提示登录成功,否则提示用户名或密码错误,请重新登录
# 以上功能最多尝试5次,若次数用完未能成功,则提示登录失败
for i in range(5):
user = input("请输入用户名:")
psd = input("请输入密码:")
if user == "admin" and psd == '666888':
print("登录成功!")
break
else:
print("用户名或密码错误!请重新输入!")
else:
print("5次机会已用完,登录失败!")
注意:
# 在python中,else是可以和循环结合使用的;
# 当循环是正常结束的时候,则执行else;
# 当循环非正常结束的时候,则不执行else;
四、算法的优化分析
import time
start = time.time()
# 100以内所有的质数
for i in range(2, 100001):
# 假设 i 是质数,那么只有 1 和 i 两个因子
flag = True
# 进行验证,在 2 到 i-1 区间有无因子
for j in range(2, int(i**0.5)+1):
if i % j == 0:
flag = False # 有因子,假设不成立
break
if flag:
pass
end = time.time()
print(end-start, "秒") # 0.17497920989990234 秒
五:循环总结
5.1:while循环的使用场景:
while循环适用于需要根据条件来判断是否继续循环的情况。
例如,当需要不断接收用户输入直到用户输入特定的值时,可以使用while循环;
或者程序的运行结果满足某条件时需要结束循环,也可以使用while循环。
5.2:for循环的使用场景:
for循环适用于遍历序列(如列表、元组、字符串等)中的元素。
当需要对一个序列中的每个元素执行相同的操作时,
可以通过 range() 函数与 len() 函数来配合for循环来完成。
六、课后练习题
# 猜数字游戏
# 用户输入任意一个100以内数字,与随机生成的数字比较,两个数字若一样就赢了。
# 要求:
# 1. 使用random模块; 【import random】
# 2. 有8次猜错机会,猜对则打印数字; 【生成随机整数random】
# 3. 用while循环实现功能
import random
rand_num = random.randint(1, 100)
i = 1
while i <= 8:
num = int(input("请输入你猜的数:"))
if num == rand_num:
print("恭喜你猜对了!")
break
elif num < rand_num:
print("猜小了")
else:
print("猜大了")
i += 1
else:
print("八次猜数已结束!")
# /// 运行结果如下:
# > 请输入你猜的数:50
# > 猜小了
# > 请输入你猜的数:75
# > 猜大了
# > 请输入你猜的数:63
# > 猜大了
# > 请输入你猜的数:56
# > 猜小了
# > 请输入你猜的数:59
# > 猜小了
# > 请输入你猜的数:61
# > 恭喜你猜对了!
# 1、使用循环语句,计算以下表达式的值:
# 1 + 1/2 + 1/3 + 1/4 + .... + 1/n
n = int(input("输入一个数n:"))
sum = 0
for i in range(1, 2):
for j in range(1, n+1):
sum += i / j
print(f"1+1/2+1/3+1/4+...+1/n 的和是: {sum}")
# 2、使用循环语句,计算以下表达式的值:
# 1/2 + 2/3 + 3/4 + ...... + n/(n+1)
n = int(input("输入一个数n:"))
numerator = 1 # 分子
denominator = 2 # 分母
sum = 0
while True:
sum += numerator / denominator
if numerator == n:
break
numerator += 1
denominator += 1
print(f"1/2+2/3+3/4+...+n/(n+1) 的和是: {sum}")