人生苦短,我学python day04 循环关键字和位运算

一、循环关键字
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 -> 00000100

      print(3 << 1)
      print(4 << 1)
      print(-6 << 1)
      
    • 数字 >> 1(除法)

      print(4 >> 1)     # 2
      print(-9 >> 2)    # -3
      print(11 >> 2)    # 2
      
作业题
  1. 判断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. 求整数1~100的累加值,但要求跳过所有个位为3的数。
sum = 0
for x in range(1, 101):
    if x % 10 == 3:
        continue
    sum += x
print(sum)
  1. 有⼀分数序列: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)
  1. 写程序计算 n 的阶乘 n! 的结果
while True:
    n = int(input('请输入一个正整数:'))
    sum = 1
    for i in range(1, n+1):
        sum *= i
    print(n, '!=', sum)
  1. 求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)
  1. 写程序求表达式 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

  1. 控制台输出三角形

    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

  1. 小明单位发了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)
  1. 一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
height = 8848.13 * 1000
a = 0.08
count = 0
while height >= a * 2 ** count:
    count += 1
print('需要对折的次数:', count)
  1. 古典问题:有一对兔子,从出生后第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))
  1. 将一个正整数分解质因数。例如:输入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()
  1. 某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上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)
  1. 输入一个整数,计算它各位上数字的和。(注意:输入的整数可以是任意位)
while True:
    num = int(input('请输入一个整数:'))
    sum = num % 10
    while True:
        num //= 10
        sum += num % 10
        if num == 0:
            break
    print(sum)
  1. 求两个数的最大公约数和最小公倍数。(提示:公约数一定小于等于两数中的小的那个数,且能同时被两个数整除;公倍数一定大于等于两数中的大数,且是大数的倍数又能被两数中的小数整除)
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值