基础练习题

练习题

2.12.7.1 练习 1

1、随机给定一个 5 位数,然后我们打印出它的每位数所在的 个、十、百、千、万 的位数,依次从万位打印到个位的数字。

答案一:

x = 98765                   # 先随机给一个 98765 的 5 位数
w = 10000                   # 然后再给一个变量 w 并且为 10000 因为等于用它来做权重
for i in range(5):          # 通过 for 循环调用 range 函数让他循环 5 次
      print(x // w)         # 打印 x 除以 w 的值,也就是将 9 先打印出来
      x = x % w             # 然后再 w 对 x 进行取模,取出后面的 8765 位数
      w = w // 10           # w 现在为 10000 然后对 w 进行除以 10 取出 1000 的值依次循环
      print (x,w)           # 分别打印每次 x 和 w 的值,这里的 x 就是 取模后的值
      print ('~~~~~~~~')    # 每次循环完了之后使用 ~~~~ 隔开就表示当前一次循环完毕

## 执行结果
9
8765 1000
~~~~~~~~
8
765 100
~~~~~~~~
7
65 10
~~~~~~~~
6
5 1
~~~~~~~~
5
0 0
~~~~~~~~

答案二:

x = '00500'             # 假如输入的是一个 00500 特殊数字其实就是 500,并且赋值给 x
x = int(x)              # x 再次赋值使用 int 函数转化为整数类型

n = 6                   # 假如我输入的是一个超过 5 的位数,我这里给 n 赋值为 6
w = 10 ** (n-1)         # 我们再将 10 的 n-1 次方赋值给 w

flag = False            # 这里我们对 flag 做一个赋值为 false 也就是假

for i in range(n):      # 通过 for 循环使用 range 函数导入上面的 n
    y = x // w          # y 等于 x // W 也就是 00500 除以 10 的 n-1 次方 
    if flag or y:       # 由于前两次都为 0 所以不进入 if 判断,因为 y=0 而 if flag 等于 false 也就是 0 ,or 为加的意思,0+0=0 不能进入 if,但是循环到了第三次也就是 5 的时候,0+5=5 能够进入 if 循环
        print(y)
        flag = True     # 第三次进入 if 循环后且改变了 flag 的变量为 True,因为 True 默认为 1 ,最后得到的结果就是 1+0=1,所以就能将后面两个 0 打印
    x = x % w           # 对 x 进行取模,取出后面的 0500 位数
    w = w // 10         # w 现在为 10 **(n -1) 然后对 w 进行除以 10 取出 1000 的值依次循环
    
    
## 执行结果
5
0
0

3.12.7.2 练习 2

2、给定一个不超过5位的正整数,判断该数的位数,依次打印出个位、十位、百位、千位、万位的数字

答案一:

x = 12345                               # 对 x 进行赋值 12345 也就是我们要对它进行取位
w = 10                                  # 再对 w 进行赋值为 10 ,通过它来进行取位
x = 12345 % 10 = 1234 5 ; x % w = 5     # 第一次对 x 进行取模也就是用 w 进行取模,然后取去它的个位
x = 12345 % 100 = 123 45; x % w = 45    # 第二次对 x 有一次进行取模,这次去的是它的十位,所以我们就要解决 w * 10 = 100 的问题,依次类推

## 代码如下
x = 12345                       # x 赋值为 12345
w = 10                          # w 
for i in range(5):              # 通过 for 进行循环,因为 x 是万位所以要调用 range 函数循环 5 次
    print(x % w)                # 然后再将 x 对 w 进行取模
    w = w * 10                  # 然后 w 依次 10 结束第一次循环,依次循环 5 次

## 执行结果    
5
45
345
2345
12345

答案二使用折半算法:

这张图就是得到 1234 这前 4 位数

val = input('>>>')      # 将用户输入的 5 位数进行导入到程序中并且赋值给 val 变量
val = int(val)          # 将 val 变量做一个 int 数据类型转化为整数
print(val)              # 打印用户输入的 5 位数
if val >= 1000:         # 使用折半算法将用户输入的数字进行导入计算,这里将大于或等于 1000 的数进行导入
    if val >= 10000:    # 判断用户是否输入的位大于或者等于 10000 以上的数就给 num 进行变量赋值
      num = 5           # num 变量判断用户输入的是否为 5 位数
    else:               # 如果用户不是 1000 以上的数就给 num 进行变量赋值
      num = 4           # num 变量判断用户输入的是否为 4 位数
else:                   
    if val >= 100:      # 再判断用户输入的百位数
        num = 3         # 并且给 num 变量赋值为 3
    elif val >= 10:     # 再判断用户的两位数,并且这个数赋值给 num
        num = 2
    else:               # 将用户个位数进行导入给 num 变量
        num = 1
print(num)              # 这里打印的是 num 循环次数,也就是 5 
c = val                 # 然后再将用户输入到 val 变量中的值进行赋值给 C
for i in range(num):    # 通过 for 循环调用 range 函数,而 range 函数通过对 num 变量的 5 进行循环
    n = c // 10         # 在对 n 进行赋值,也就是用户输入的 val 进行除 10 得到前 4 位数
    print(c - n*10)     # 打印出用户输入的数减掉 n 此时的 n 就是用户输入的前 4 位数再乘以 10 自然得到用户输入的个位数
    c = n               # 此时的 c 等于 n 也就是用户输入的前 4 位数,依次循环直至 5 次循环完毕
    
## 输出结果
>>>12345
12345
5
5
4
3
2
1

2.14 循环 else 子句

如果循环正常的执行结束,就执行 else 子句;如果使用 break 终止,else 子句不会执行,但是 continue 能够执行 else 子句,因为 condition 终端的是当前循环并非全部循环。

有上例可知,一般情况下,循环正常执行,只要当前循环不是被break打断的,就可以执行else子句。哪怕是range(0)也可以执行else子句。

语法:

while condition:
    block
else:
    block
for element in iteratable:
    block
else:
    block

break 演示范例:

# 在没有使用 break 的情况下正常执行,在目前为止只要没有出现 break 这个循环就会正常结束
for i in range(0):
    print('!!!!')
else:
    print('else')

## 输出结果
else

# 使用了 break 参数的情况下直接退出所有循环,直接终止。
for i in range(1):
    break
    print('!!!!')
else:
    print('else')

## 没有输出结果

continue 演示范例:

for i in range(1):
    continue                # 使用了 continue 子句只是退出当前循环
    print('!!!!')
else:                       # 依旧能够执行 else 子句
    print('else')


## 输出结果
else

2.14.1 练习

2.14.1.1 练习一

1、打印一个边长为 n 的正方形

方法一内循环(缺陷循环次数太多):

n = int(input('>>>'))
for i in range(1,n+1):
    for j in range(1,n+1):
        if i==1 or j==1 or i==n or j==n:
            print('#',end=' ')
        else:
            print(' ',end=' ')
    print()
    
## 执行结果
>>>3
# # # 
#   # 
# # # 



###### 代码解释
n = int(input('>>>'))       # 假如给 n 赋值为 3
for i in range(1,n+1):      # range 函数就会这样出现三次 1,1+1  1,2+1  1.3+1 
    for j in range(1,n+1):  # range 函数就会这样出现三次 1,1+1  1,2+1  1.3+1 
        if i==1 or j==1 or i==n or j==n: 
            print('#',end=' ')
        else:
            print(' ',end=' ')
    print()                 # 换行打印下一次循环
    
    
# 第一次循环,也就是说 i 一直为 1 ,所以 i==1 一直成立就会一直打印 print('#',end=' ') 打印三次结束。

# 第二次循环最开始这时候 i==2 j==1 成立打印一次 print('#',end=' '),接着这时候 j 变为 2 不等于 1 也不等于 n 自然打印 print(' ',end=' ') ,接着第三次 j 现在是 3 ,而我们输入的数字 n==3 正好个 j 匹配也就 j==n 成立打印  print('#',end=' '),第二次循环结束得到 #   # ,并且退出子循环

# 第三次循环 i 这个时候是 2 但是 j 为 1 ,j==1 成立打印 print('#',end=' '),接着这时候 i=3 和 n 相等,因为第三次循环 n==3 所以 i==n 成立打印 print('#',end=' ') 而 j 在第二次中为 2 ,接着第三次由于我们输入的是 3 次循环,所以 i 一直循环到 3 也就是 i==n 成立 打印 print('#',end=' ') 而 j 在第三次中为 3

方法二通过 while 循环:

n = int(input('>>>'))
print("#"*n)
a = n-2
while a:
    print('#'+' '*(n-2)+'#')
    a -= 1
print("#"*n)

## 执行结果
>>>3
###
# #
###




##### 代码解释
n = int(input('>>>'))         # 输入3
print("#"*n)                  # #*3 = ###
a=n-2                         # a = 3-2 = 1
while a:                      # 对 a 做 while 循环
    print('#'+' '*(n-2)+'#')  # { # + [ 空格 *(n-2)= 1 个空格] 最后在 + # } = # #
    a -= 1                    # a 依次逐个减 1,这里 n==3 然后 a=n-2=1 ,在对 a -= 1 逐个减一等于 0 退出 while 循环,也就是需要打印 print('#'+' '*(n-2)+'#') 循环次数
print("#"*n)                  # #*3 = ###

方法三通过迭代方式(效率不高)

n = int(input('>>>'))
for j in range(n):
    if j == 0 or j == n-1:
        for i in range(n):
            print('#',end =' ')
    else:
        for i in range(n):
            if i >0 and i < n-1:
                print(' ',end =' ')
            else:
                print('#',end =' ')
    print()

## 执行结果
>>>3
# # # 
#   # 
# # # 




#### 代码解释
n = 3                   # 输入 3 循环 3 次,n=3
for j in range(n):      # range(3)循环 3 次,默认 range 从 0 开始循环,也就是 0、1、2
    if j == 0 or j == n-1:  # 当 j=0 和 j=n-1=2 就将第一行打印 print('#',end=' '),也就是首行和末行
        for i in range(n):      
            print('#', end=' ')
    else:
        for i in range(n):  # 这里 n=3
            if i >0 and i < n-1:  # 1,n-1=2 。实际范围就是 1 因为要大于 0 且 小于 2,就等于 1 。如果 i 大于 0 且小于 n-1=2 就打印 print(' ',end=' '),否者就打印 else 中的 print('#',end=' ')。
                print(' ', end=' ')
            else:
                print('#', end=' ')  # 0 和 3 打印 print('#',end=' ')
    print()                     # 最后一定要加 print() 因为需要换行

方法四对称理解

下面循环语句块中并没有使用到这个 range 中的 e,这只是为了提供一种解决复杂问题公式推导的思路,例如对称性问题。打印正方形的题目体现不出来而已

边为 3 ,则 -1 0 1 => range(-1,2) => -1 0 1 不取 2 所以就是 -1 0 1

边为 4 , 则 -2 -1 0 1 => range(-2,2) => -2 -1 0 1

边为 5 , 则 -2 -1 0 1 2 => range(-2,3) => -2 -1 0 1 2

n = 5
e = -n // 2
for i in range(e,n+e):
    if i == e or i == n+e-1:
        print('#' * n)
    else:
        print('#' + ' '*(n-2) + '#')

## 执行结果

#####
#   #
#   #
#   #
#####


#### 代码解释
n = 5
e = -n // 2                     # -5 除以 e=(-5 // 2)= -3
for i in range(e,n+e):          # range(e,n+e) = range(-3 , 2)
    if i == e or i == n+e-1:    # 
        print('#' * n)
    else:
        print('#' + ' '*(n-2) + '#')

2.14.1.2 练习二

求 100 内所有奇数的和(2500)

第一种方法:

n = 0
for i in range(1,100,2):
    n += i
print(n)

## 执行结果
2500



#### 代码解释
1、先给 n 进行赋值为 0 
2、通过 for 循环取出 range 函数 1-100 并且步进为 2 就将所有 100 以内的奇数取出
3、在通过 n += i 因为这里 i 是它们的奇数用的是递归往上加的方式
4、打印 n  变量即可

2.14.1.3 练习三

判断学生成绩,成绩等级 A~E 。其中,90 分以上为 A。80~89 分为 B,70~79 分为 C , 60~69 分为 D,60 分以下为 E

n = int(input('输入成绩'))

if n < 60:
    print('E')

else:
    if n <= 60 :
        print('D')
    elif n <= 79:
        print('C')
    elif n <= 89:
        print('B')
    else:
        print('A')
        
## 输出结果
输入成绩89
B



#### 代码解释
1、先将用户输入进来的数字进行折半算法的比较,小于 60 自然就 E
2、如果用户大于 60 就放入到下一个 else 判断中,一层一层判断

2.14.1.4 练习四

求 1 到 5 阶乘之和

个人做的答案(大大减少了迭代时间,只用了一层循环解决):

n = 1
m = 0

for j in range(1,6):
        n = j * n
        m += n
print(m)


## 执行结果
153



####  代码理解
1、先给 n 赋值为 1 ,m 赋值为 0
2、通过 for 循环 j 通过 range 函数,让 range 到着打印 1~5
3、并且在将 j 乘以 n 同时再将结果赋值给 n 使其依次累加往上乘
4、然后通过 m 依次累加它们的值,最终得到 1~5 的阶乘之和 153

两循环答案(这种代码对 CPU 计算加深了复杂性加多了迭代时间):

n = 0
for i in range(1,6):
    k = 1
    for j in range(1,i+1):
        k = k*j
    n = n+k
print(n)

## 执行结果
153



#### 代码解释
1、给 n 赋值为 0 

# 第一次循环
2、第一次外循环通过 for 循环 i 通过 range 函数,让 range 到着打印 1~5 
3、第一次内循环 for 循环 j 通过 range 函数,依次在上面 i 中取值,然后 k * j 也就是 1*1 ,然后在将 n+k=0+1=1 在依次做累加,但是 i 现在等于 1 所以内循环结束。

# 第二次循环
4、第二次外循环,这次 i 就等于 2 了。
5、第二次内循环,这次 j 等于 i+1=2+1=3,然后 range 函数打印 1、2 ,而 n + 2=2 因为上面 n 赋值为 0 第二次内循环结束

# 第三次寻循环
6、第三次外循环,这次 i 就为 3
7、第三次内循环,这次 j 等于 i+1=3+1=4,然后 range 函数打印 1、2、3,而 k*J 并且循环结果要循环 3  k得值依次就是、第一次 k=K*J=1*1=1 第二次 k=k*j=1*2=2 第三次 k=k*j=2*3=6 所以这次 k 值为 6循环结束。

# 第四次循环
8、第四次外循环,这次 i  4
9、第四次内循环,这次 j  i+i=4+1=5,然后 range 函数打印 1、2、3、4,而 k*J 并且循环结果要循环 4  k得值依次就是、第一次 k=K*J=1*1=1 第二次 k=k*j=1*2=2 第三次 k=k*j=2*3=6 第四次 k=k*J=6*4=24 所以这次 k 值为 24 第四次循环结束。

# 第五次循环
10、第四次外循环,这次 i  5
11、第四次内循环,这次 j  i+i=5+1=6然后 range 函数打印 1、2、3、4、5,而 k*J 并且循环结果要循环 5  k得值依次就是、第一次 k=K*J=1*1=1 第二次 k=k*j=1*2=2 第三次 k=k*j=2*3=6 第四次 k=k*J=6*4=24 第五次 k=k*j=24*5=120 所以这次 k 值为 120 第五次循环结束。

# 赋值
12、最后 n = n+k =0+1+2+6+24+120=153 
13、print 打印出 n 的值自然算出 1~5 阶乘之和

2.14.1.5 练习五

给一个数,判断它是否是素数(质数)

  • 质数:一个大于 1 的自然数只能被 1 和它本身整除

许老师代码:

x = int(input('>>>'))

for i in range(2,x):
    if x % i == 0 :
        print('不是质数')
        break
    else:
        print('质数')

## 执行结果,这里我输入的是 12 不是质数
>>>12
不是质数


####    代码理解
1、将用户输入的数赋值给 x
2、通过 for 循环,从 2 开始循环至 x 本身赋值给 i
3、通过 if 判断 x 能够被 i 取模为 0 说明能够被 for 循环中的其他数整除,也就不是质数直接 break 停止循环
4、如果不能够被循环内的数整除直接打印质数

许老师代码通过 flag 立标签方式判断

x = int(input('>>>'))
flag = False

for i in range(2,x):
    if x % i == 0 :
        flag = True
        break
if flag:
    print('不是质数')
else:
        print('质数')
        
##  执行结果
>>>47
质数



####  代码理解
1、将用户输入的数赋值给 x
2、给 flag 赋值为 False
3、通过 for 循环,从 2 开始循环至 x 本身赋值给 i
4、通过 if 判断 x 能够被 i 取模为 0 说明能够被 for 循环中的其他数整除 flag 此时就变为 true,也就不是质数直接 break 停止循环
5、这时候 flag  true 所以在外 if 判断就直接打印不是质数
6、如果 flag 还是为 false 就直接 else 打印质数

2.15 作业

2.15.1 打印九九乘法表

个人答案:

s = 0

for i in range(1,10):
    for j in range(1,i+1):
        s = i * j
        print(i,'*',j,'=',s,end='\t')
    print()
    
#### 代码理解
1  s 赋初始值为 0
2 通过 for 循环给 i 赋值为 1~10,但是在 range 函数中只能打印到 1~9
3 再次通过 for 循环给 j 并且这次是在 i 的基础上加 1 ,因为 i 第一次赋值为 1,但是在 range(1,1)结果为 0 ,所以要在 i 的基础上依次 +1 ,就能够在每次循环的时候别前一次循环多一位
4 在将 s 等于 i  j 两个数的相乘
5 在通过 print 函数打印的时候调用 end 参数并且结尾是 \t 等于一个 tab 
6 循环完一次之后再通过 print() 换行即可

2.15.2 打印下侧菱形图

单 for 循环实现:

for i in range(-4,5):
    if i < 0:
        j = -i
    else:
        j = i
    print(' '*j+'*'*(7-2*j))

##  执行结果
    
   *
  ***
 *****
*******
 *****
  ***
   *
 
#### 代码理解
for i in range(-4,5):           # 通过 range 函数打印 -4、-3、-2、-1、0、1、2、3、4 几个数
    if i < 0:                   # 给 i 做个大于 0 为真的判断
        j = -i                  # 如果当 i 小于 0 就将 j 赋值为 -i,此时 j 0
    else:                       # 如果 i 大于 0 就进入该 else 判断
        j = i                   # 并且 j = i 也就是 1、2、3、4
    print(' '*j+'*'*(7-2*j))    # 由 print 打印,此时 j 为1、2、3、4,所有一次打印空格,'*'强语句执行也就是 * 乘以 7-2*j 也就等于 7-[2*(j 的赋值 1、2、3、4)]所以就打印出了 * 的数量

双循环实现:

for i in range(4):
    print(' '* (3 - i),end='')
    print('*' * (2 * i +1))
for i in range(3):
    print(' '* (i + 1),end='')
    print('*' * (4 - 2*i +1))

## 执行结果
   *
  ***
 *****
*******  上半个三角
 *****   下半个三角
  ***
   *


####  代码解释
i 赋值  = 0、1、2、3
空格数量 = 3、2、1、0、1、2、3
* 数量  = 1、3、5、7、5、3、1
# 上半个三角
for i in range(4):              # 因为上半个三角为 4 行 所以 for 循环 4 次 i 赋值为 0、1、2、3
    print(' '* (3 - i),end='')  # 打印空格、通过规律上半个三角的空格数量由上到下是 3、2、1、0 所以减 i 的赋值 0、1、2、3 再乘以空格,就为空格数量。然后通过 print 函数中的 end 参数不换行
    print('*' * (2 * i +1))     # 打印 * 通过规律发现上半个三角中 * 为1、3、5、7 只要 i 的赋值依次乘以 2 在加 1 即可得到,如 i=0 2*i+1=1 。

# 下半个三角
for i in range(3):              # 因为下半个三角为 3 行 所以 for 循环 3 次 i 赋值为 0、1、2
    print(' '* (i + 1),end='')  # 打印空格,通过规律发现这次的空格数量是 1、2、3 所以在这基础上加 i 即可,因为 i 的值为 0、1、2 ,如第一个空格: i+1=0+1
    print('*' * (4 - 2*i +1))   # 通过规律发现下半个三角 * 为 5、3、1,而 i 赋值为 0、1、2 ,如第 5 个* : i=0 4-2*i+1= 5

2.15.3 打印 100 以内的斐波那契数列

斐波那契数列指的是这样一个数列“ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…”这个数列从第3项开始,每一项都等于前两项之和。

# 0 可以忽略不记所以可以直接从两个 1 开始取值计算
a = 1  #第一项值为 1
b = 1  #第二项值为 1

for i in range(3,101):  #因为要取出一百以内的斐波那契值所以就是第三项循环至100
    c = a+b  # 当前项等于前两项之和
    print('第',i,"项的值为:",c)
    a = b # 新的 a 这时候就等于 b
    b = c # 新的 b 此时也就等于 c
    # 最后在将重新赋值的 a、b 交给 c = a+b 重新计算

2.15.4 求斐波那契数列第 101 项的值

a = 1  #第一项值为 1
b = 1  #第二项值为 1

for i in range(3,102):  #因为要取出一百以内的斐波那契值所以就是第三项循环至101
    c = a+b  # 当前项等于前两项之和
    if i == 101: # if 判断当 i = 101 直接执行 print
        print('第',i,"项的值为:",c)
    a = b # 新的 a 这时候就等于 b
    b = c # 新的 b 此时也就等于 c
    # 最后在将重新赋值的 a、b 交给 c = a+b 重新计算

2.15.5 求 10 万内的所有素数

质数:一个大于 1 的自然数只能被 1 和它本身整除

for a in range(1,100000):
    for b in range(2,int(a*0.5)+1):
        if a%b == 0:
            break
    else:
        print(a)
点赞