day3_for循环
回顾
1. 数学运算符
+、-、*、/、//、%、**
2. 比较运算符
<=、>=、<、>可以连用
3. 逻辑运算符
and 、or、not
零值、空值是False
4. 赋值运算符
=、+=、-=、*=、/=、//=、**=
5. 优先级
数学>比较>逻辑>赋值,有括号先括号
6.分支结构
if
if —elif–else
if—else
7.奇怪的知识出现了-负数取模
负数运算中:
C++ 和 Java 通常会尽量让商更大一些
Python 和 Google 计算器中,尽量让商更小
在正整数运算中:
所有语言和计算器都遵循了尽量让商小的原则
被除数÷除数 = 商…余数
余数 = 被除数-除数×商(被除数//除数)
print(9%2) #1 9-2*(9//2)
print(-9%2) #1 -9 - 2*(-9//2)
print(9%-2) #-1 9-(-2)*(9//-2)
新知识-循环
让代码写一次却可以执行多次
循环分为for循环和while循环
1. for
a) 语法
for 变量 in 序列:
循环体
b)说明
for、in - 关键字,固定语法
变量 - 变量名可以是没有定义过的变量名,也可以是已经定义过了的
序列 - 容器型数据类型的数据
-
常见序列:字符串、字典、元组、列表、迭代器、生成器、range等
-
- 固定写法
循环体 - 和for保持一个缩进的一条或多条语句。循环体就是需要重复执行的代码
c)执行过程
Ⅰ. 序列
让变量去序列中取值,一个一个的取,取到取完为止,每取一个值iu执行一次循环体。
(序列中的元素个数决定for循环循环次数)
【 J S中没有range函数】
Ⅱ. range函数
产生指定范围的数字序列
①. range(N)
产生0~N-1的数字序列
例:range(3):产生一个数字序列,里面的元素是0、1、2
for x in range(10):
print(x)
②. range(M,N)
产生M~N-1的数字序列
例:range(10,15):产生一个数字序列,里面的元素是10、11、12、13、14
for i in range(10,15):
print(i)
③. range(M,N,step)
产生[M,N)的数字序列,步长是step(每次增加step)
for i in range(10,16,2):
print(i)
步长可以是负,但是M必须大于N
for i in range(16, 10, -2):
print(i)
④. 练习
练习1:打印100以内所有的偶数
for i in range(0, 100, 2):
print(i, end=' ')
练习2:统计100以内奇数的个数
num = 0
for i in range(1, 100, 2):
num += 1
print(num)
练习3:统计100以内能被3整除的偶数的个数
num = 1
for i in range(6, 97, 6):
num += 1
print(num)
练习4:计算1+2+3+…+100的和
s = 0
for i in range(1,101):
s += i
print(s)
s2 = (1+100)*100/2
print(s2)
练习5:计算100~200间能被3整除,但不能被5整除的数的和
sum = 0
for i in range(102, 200, 3):
if i % 5 == 0:
continue
sum += i
print(sum)
2. while语句
a) 语法
while 条件语句:
循环体
b)说明
while - 关键字,固定写法
-
条件语句 - 任何有结果的表达式(除了赋值语句)
-
- 固定写法
循环体 - 和while保持一个缩进的一条或多条语句(需要重复执行的代码)
c) 执行过程
先判断条件语句是否为True,如果是,则执行循环体;执行完循环体再判断条件语句是否为True…如果是False,则循环结束
3. for和while的选择
循环次数确定的时候用for,不确定的时候用while
练习1:提示用户输入密码,直到密码正确为止
法一:
psw = input('请输入密码:')
while psw != '123456':
print('密码错误,请重新输入!')
psw = input('请输入密码:')
print('输入正确!')
法二:
while True:
psw = input('请输入密码:')
if psw == '12345':
break
print('输入正确!')
简化:
while input('请输入密码:') != '123456':
pass
print('输入正确!')
练习2:产生一个随机数,猜。
请输入(0~100):50
小了,再大点儿!
请输入(0~100):80
大了,再小点儿!
…
请输入(0~100):67
恭喜你!猜对了!
import random
number = random.randint(0, 100)
count = 0
print('请猜一个0~100之间的数字:')
s_num = int(input())
while s_num != number:
print('猜错了,', end='')
count += 1
if s_num > number:
print('你猜的数字大了,请重新输入')
else:
print('你猜的数字小了,请重新输入')
s_num = int(input())
print('恭喜你猜对了,你一共猜错了', count, '次', sep='')
随机数
import random
number = random.randint(0, 100)
功能:随机生成一个 [a,b] 的整数
3. 循环关键字
continue 和break只能在循环内使用
a) continue
功能:结束一次循环
执行循环体的时候如果遇到continue,直接结束当次循环,直接进入下一次循环
for x in range(10,20)
if x % 3 == 0:
continue
print('x',x)
b) break
功能:结束整个循环
执行循环体时如果遇到break,直接结束整个循环
for x in range(10,20)
if x % 3 == 0:
continue
print('x',x)
while True:
每次循环要做的事情
if 循环结束的条件:
break
c) else
循环自然死亡的时候执行else的代码段(正常结束for/while)
意外结束循环时不执行
for 变量 in 序列:
循环体
else
while 条件语句:
循环体
else:
代码段
for x in range(3):
print('hello')
else:
print('自然死亡')
for x in range(3):
print('hello')
if x==1:
break
else:
print('自然死亡')
作业
基础题
-
使用for和while循环输出 0~100内所有3的倍数。
for i in range(3, 100, 3): print(i, end=' ')
i = 3 while i < 100: print(i, end=' ') i += 3
-
使用for和while循环输出100~200内个位数或者十位数能被3整除的数。
for i in range(100, 201):
if (i % 100) // 10 % 3 == 0:
print(i, end=' ')
elif i % 10 % 3 == 0:
print(i, end=' ')
i = 100
while i < 201:
if (i % 100) // 10 % 3 == 0:
print(i, end=' ')
elif i % 10 % 3 == 0:
print(i, end=' ')
i += 1
进阶题
-
使用循环计算
1*2*3*4*...*10
的结果。s = 1 for i in range(2, 11): s *= i print(s)
-
统计100以内个位数是2并且能够被3整除的数的个数。
for i in range(12, 100, 30): if i % 3 == 0: print(i, end=' ')
-
输入任意一个正整数,求他是几位数?
i = 0 n = int(input()) while n > 0: i += 1 n //= 10 print(i)
注意: 这儿不能使用字符串,只能用循环
-
打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是
⼀个⽔仙花数,因为
1³ + 5³ + 3³
等于 153。for i in range(100, 999, 1): if (i//100)**3+(i%100//10)**3+(i%10)**3 == i: print(i, end=' ')
挑战题
-
判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)
n = int(input()) count = int(n ** 0.5) if n > 1: for i in range(2, count + 1): if n % i == 0: print(n, '不是素数', sep='') break else: print(n, '是素数', sep='') else: print(n, '不是素数', sep='')
-
求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)
n = int(input()) s = 1 tol = 1 for i in range(3, n+1): tmp=tol tol = s + tol s = tmp print(tol)
-
输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
for i in range(1,10): for j in range(1,i+1): print(j, '*', i, '=', i*j,end=' ') print()
-
这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
for big in range(0, 33):
for mid in range(0, 50):
if big * 3 + mid * 2 + (100 - big - mid) / 2 == 100:
print('大马有', big, '匹,中马有', mid, '匹,小马有', (100 - big - mid), '匹')
3. 输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。
```python
for i in range(1,10):
for j in range(1,i+1):
print(j, '*', i, '=', i*j,end=' ')
print()
- 这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)
for big in range(0, 33):
for mid in range(0, 50):
if big * 3 + mid * 2 + (100 - big - mid) / 2 == 100:
print('大马有', big, '匹,中马有', mid, '匹,小马有', (100 - big - mid), '匹')