一、循环关键字
1、continue
-
只能使用于循环体
-
当执行循环体时,遇到continue,当次循环直接结束,马上进入下一次循环的判断。
-
练习:计算1到100中所有不能被3整除的数的和
sum = 0 for i in range(1, 101): if i % 3 == 0: continue sum += i print(sum)
2、break
-
break是关键字且只能在循环体中使用
-
当执行循环体的时候,遇到break,整个循环直接结束。
-
while循环和break一起使用, while True:
需要重复的操作
if 循环结束的条件:
break -
用while计算1+2+3+…+100
num = 1000 while True: if num % 3 == 0: break num += 1 print(num)
3、else
-
python中完整的for循环:
for 变量 in 序列:
循环体
else:
代码段 -
python中完整的while循环:
while 条件语句:
循环体
else:
代码段 -
在for循环或者while循环后面加else结构不会影响原循环的执行。
再循环的过程中,如果循环是正常结束的,循环结束后执行else后面的代码段,如果循环是因为遇到break结束的,else后面的代码段就不会执行。(可以根据else后面的代码段是否执行来判断循环在执行过程中有没有遇到break) -
练习:判断一个数是不是素数
num = 5 if num > 1: for i in range(2, num): # 【range(2,int(num**0.5+1))也可以,减少了循环次数】 if num % i == 0: print(num, '不是素数') break else: print(num, '是素数') else: print(num, '不是素数')
二、数据存储
1、计算机存储数据只能存储二进制数据(计算机只有存储数字的能力,并且存的是数字的二进制补码,因为在计算中,用原码对负数进行计算的话,会导致结果不准确,但是补码是准确的)
2、进制
- 十进制 基数:0-9
进位:10
位权:10的N次方(N从0开始)(123 -> 1100 + 210 + 3*1)
程序中的表示方式:直接写 - 二进制 基数:0,1
进位:2
位权:2的N次方(N从0开始) 101011 -> 12^0 + 12^1+
程序中的表示方式:加前缀0b/0B - 八进制 基数:0-7
进位:8
位权:8的N次方(N从0开始)
程序中的表示方式:前缀 0o/0O - 十六进制 基数:0-9,A,B,C,D,E,F(大小写都可以)
进位:16
位权:16的N次方(N从0开始)
程序中的表示方式:Ox
3、进制转换
-
其他进制转十进制:基数乘以位权的和 0b1011 -> 2^0 + 2^1 + 2^3 = 11 0o56 -> 6x8^0 + 5x8^1 = 6+40 = 46 0x12f -> 15x16^0 + 2x16^2 + 1x16^2 = 15 + 32 + 256 = 303
print(0b1011) print(0o56) print(0x12f)
-
十进制转换为其他进制(辗转取余)
print(bin(100)) # 100转换为二进制 print(oct(100)) # 100转换为八进制 print(hex(100)) # 100转换为十六进制
-
二进制转其他 二进制转8进制:三位一取,不够则补0. 001 100 100 -> 1 4 4 二进制转十六进制:四位一取,不够则补0. 0110 0100 -> 6 4 注意:反过来也可以拆分八进制或者十六进制来转换为二进制
4、原码、反码和补码(正数的原码、反码和补码是一样的)
- 原码:符号位 + 真值 真值指的是数字绝对值的二进制
符号位来表示正负的:0表示正值,1表示负值
10的真值:1010,-10的真值还是:1010
10的原码:01010,-10的原码:11010
例如:计算机中,10的原码:00001010,-10的原码:10001010 - 反码 -> 符号位不变,其他位取反 例如:计算机中,1字节,10的反码:00001010,-10的反码:11110101
- 补码 -> 反码加1 例如:计算机中,1字节,10的补码:00001010,-10的补码:11110110
- 计算:2-3 2的原码是:00000010 , 2的补码是:00000010
-3的原码是:10000011 , -3的补码:11111101
原码计算:00000010 + 10000011 = 10000101(原码) -> -5
补码计算:00000010 + 11111101 = 11111111(补码) -> 11111110(反码) -> 10000001(原码) -> -1
所以才用补码来计算负数的数值运算。 - 内存的最小单位是位(bit)
1字节 = 8位(内存开辟的最小单位是字节)
1kb = 1024字节
1Mb = 1024kb
1G = 1024Mb
1T = 1024G
5、位运算(针对整数)
-
&(按位与运算),|(按位或运算),^(按位异或),~(按位取反),<<(左移),>>(右移)
-
位运算的特点:运算效率高,内存消耗少;但是完成复杂运算的时候难度高
-
应用:
-
快速判断数字的奇偶性:数字 & 1 ,取出数字的二进制数的最后一位,若是1,则为奇数,若是0,为偶数
print(10 & 1) # 0 print(11 & 1) # 1
-
快速的乘2与整除2(或者2的次方)的操作: 数字 << 1 (乘法),左移两位就是乘以2^2,
例如:00000001 -> 00000010 -> 00000100print(3 << 1) print(4 << 1) print(-6 << 1)
-
数字 >> 1(除法)
print(4 >> 1) # 2 print(-9 >> 2) # -3 print(11 >> 2) # 2
-
作业题
- 判断101-200之间有多少个素数,并输出所有素数。
count = 0
for x in range(101, 201):
for y in range(2, x):
if x % y == 0:
break
else:
count += 1
print(x)
x += 1
print(count)
- 求整数1~100的累加值,但要求跳过所有个位为3的数。
sum = 0
for x in range(1, 101):
if x % 10 == 3:
continue
sum += x
print(sum)
- 有⼀分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的第20个分数
i = 2
j = 1
for n in range(1, 20):
i, j = i+j, i
print('第20个数是', i, '/', j)
- 写程序计算 n 的阶乘 n! 的结果
while True:
n = int(input('请输入一个正整数:'))
sum = 1
for i in range(1, n+1):
sum *= i
print(n, '!=', sum)
- 求1+2!+3!+…+20!的和
sum = 0
for i in range(1, 21):
n = 1
for j in range(2, i+1):
n *= j
sum += n
print('1+2!+3!=', sum)
- 写程序求表达式 a + aa + aaa + aaaa+ … 的结果,其中a是1~9的数字,求和的项数用n来控制。(a和n可以用变量来表示)
while True:
a = int(input('请输入一个1~9的正整数a:'))
n = int(input('请输入求和的项数n:'))
sum = 0
temp = 0
for i in range(n):
temp = temp * 10 + a
sum += temp
print(sum)
print('a为', a, ', n为', n, '的时候:', sum)
例如:a为3, n为5的时候: 3 + 33 + 333 + 3333 + 33333
-
控制台输出三角形
a.根据n的值的不同,输出相应的形状 n = 5时 n = 4 ***** **** **** *** *** ** ** * *
n = int(input('请输入一个正整数n:'))
for i in range(n):
for j in range(n-i):
print('*', end='')
print()
b.根据n的值的不同,输出相应的形状(n为奇数)
n = 5 n = 7
* *
*** ***
*******
while True:
n = int(input('n的值为:'))
k = 0
for i in range(1, n+1, 2):
k += 1
print(' '*(n-k), '*'*i)
c. 根据n的值的不同,输出相应的形状
n = 4
1
121
12321
1234321
n = 5
1
121
12321
1234321
123454321
- 小明单位发了100元的购物卡,小明到超市买三类洗化用品,洗发水(15元),香皂(2元),牙刷(5元)。要把100元正好花掉,可有哪些购买结合?
for shampoo in range(100//15):
for toilet_soap in range(100 // 2):
for toothbrush in range(100 // 5):
if shampoo * 15 + toilet_soap * 2 + toothbrush * 5 == 100:
print('洗发水:', shampoo, '香皂:', toilet_soap, '牙刷:', toothbrush)
- 一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
height = 8848.13 * 1000
a = 0.08
count = 0
while height >= a * 2 ** count:
count += 1
print('需要对折的次数:', count)
- 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
while True:
n = int(input('请输入要计算的月数:'))
if n == 1 or n == 2:
print('第', n, '月兔子的总数是2')
else:
p1 = p2 = 1
for x in range(n - 3):
p1, p2 = p2, p1 + p2
print('第', n, '月兔子的总数是', 2*(p1 + p2))
- 将一个正整数分解质因数。例如:输入90,打印出90=2x3x3x5。
while True:
num = int(input('请输入一个正整数:'))
print(num, '=', end='')
for i in range(2, (num // 2) + 1):
if num % i == 0:
print(i, 'x', end='')
num //= i
if num % i == 0:
print(i, 'x', end='')
num //= i
print()
- 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换。求输入的四位整数加密后的值
while True:
tel = int(input('请输入一个四位整数:'))
first = (tel % 10 + 5) % 10
second = (tel % 100 // 10 + 5) % 10
third = (tel // 100 % 10 + 5) % 10
fourth = (tel // 1000 + 5) % 10
first, fourth = fourth, first
second, third = third, second
print(fourth*1000+third*100+second*10+first)
- 输入一个整数,计算它各位上数字的和。(注意:输入的整数可以是任意位)
while True:
num = int(input('请输入一个整数:'))
sum = num % 10
while True:
num //= 10
sum += num % 10
if num == 0:
break
print(sum)
- 求两个数的最大公约数和最小公倍数。(提示:公约数一定小于等于两数中的小的那个数,且能同时被两个数整除;公倍数一定大于等于两数中的大数,且是大数的倍数又能被两数中的小数整除)
while True:
a = int(input('请输入第一个数a:'))
b = int(input('请输入第二个数b:'))
min = a if a <= b else b
temp = 1
max = a if a >= b else b
for i in range(2, min+1):
if a % i == 0 and b % i == 0:
temp = i
if temp == 1:
print(a, b, '最大公约数不存在!')
else:
print(a, b, '最大公约数是:', temp)
for i in range(max, a*b+1):
if i % a == 0 and i % b ==0:
print(a, b, '最小公倍数是:', i)
break