9.数字与编程思维强化练习

前面章节中我们介绍了python语法与逻辑语句,这节开始我们来介绍Python中的数据结构,首先来看数字。

主要内容:

  • 小目标:数字
  • 主要内容:数字类型,数字优先级,数字相关函数

1.数字

1.1 数字类型

最常用的一种数据结构,主要类型:

类型 说明 样例
int 整数 1,2,3,100...
float 浮点 3.14, 2.1....
complex 复数 complex(1, 2)
bool 布尔值 只有:True与False

问题: c,c++等编程语言对数字的大小都有限定;那么Python中数字最大是多少?
Python中数字范围可以到无限大,它的范围受限于计算机内存的大小。

我们可以做一个实验:

#100000次幂
a = 1231231**100000

结果:a是一个很大的整数。

1.2 数字计算默认转换规则

一个问题:数字与浮点运算,结果是什么类型?
通过代码验证,计算圆的周长:

r = 5
pi = 3.14
area = 2*pi*r
print(area, type(area))

结果:

31.400000000000002 <class 'float'>

分析:

  1. 整数与浮点运算结果为浮点,在他们计算时候,python解释器会将数字强制转成浮点数,然后在进行运算;
  2. 结果与预想不太一致,是一个不太准确的浮点,这是由于浮点运算导致,暂时没有办法规避,只能强制设置取小数点后位数。

python中数字转换的优先级:

  1. float > int > bool;
  2. float与int,bool计算,结果为float类型;
  3. int与bool计算,结果为整数;

例如:

a = 1.1
b = 2
print(a+b, a+True)
print(b+True)

结果:

3.1 2.1
3

1.3 数据类型强制转换

一个需求:结果只保留整数部分,如何处理?
可以对数字类型进行强制转换,相关方法:

方法 说明 示例
int([x]) 将x转成整数 int(3.14)->3
int(x, base=10) 将数字字符串转整数 int('3')->3
float(x=0) 将数字或者字符串转整数 float('3')->3.0
bool(x)l 将任意对象转成bool

几个例子:

pi = 3.14
a = 10
s = '10'
#======int======
#默认10进制,十位数代表10
#注意:字符串必须全是有效数字,否则报错
print("int('%s')=%d" %(s, int(s)))
#16进制,十位数代表16
print("int('%s', base=16)=%d" %(s, int(s, base=16)))
#.2f只显示2位小数
print("int(%.2f)=%d" %(pi, int(pi)))
#======float======
print("float('%s')=%f" %(s, float(s)))
#======bool======
#s是真
print("bool('%s')" %s, bool(s))
#0是假
print("bool(0)",bool(0))
#0.0是假
print("bool(0.0)",bool(0.0))
#range是一个函数,为真
print("bool(range)",bool(range))

结果:

int('10')=10
int('10', base=16)=16
int(3.14)=3
float('10')=10.000000
bool('10') True
bool(0) False
bool(0.0) False
bool(range) True

2.数字相关函数

函数 说明
round(number, ndigits=None) 指定小数个数
pow(x, y, z=None, /) x**y或者x**y%z
abs(x, /) x的绝对值

相关操作如下:

print(round(3, 2))
#小数点后取两位,注意roud进位可能不准确
print(round(3.1451, 2))
#保留小数后3位,并没有进位
print(round(3.1115, 3))
print(pow(2, 3))
print(abs(-1))

结果:

3
3.15
3.111
8
1

3 数字练习:

3.1 计算n的阶乘

需求:给定数字n,n! = 1*2*3* ... *(n-1)*n;
分析:产生1~n数字,并计算他们之间乘积;

知识点:

  1. while循环或者range函数,乘法运算;
  2. 定义函数:factorial,参数为n, 返回值为计算结果;

代码实现:

n = 5
def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result
factorial(n)

结果:120
这个题目比较简单,下面我们扩展下:

3.2 计算阶乘的和

需求,给定数字n,计算:S=1!+2!+3!+…+n!
这个题目看似比较简单,直接基于上一题目扩展即可:

#定义函数注意参数,返回值
def factorial(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

def sum_fact(n):
    n_sum = 0
    for i in range(1, n+1):
        n_sum += factorial(i)
    return n_sum
n = 10
print(sum_fact(n))

结果:

4037913

这个题目是不是有点so easy!
我们将N设置为5000,或者更大的值,看下运行时间?
是不是等一会才能出来结果。

如何进行优化?读者朋友可以自己尝试。
猫猫的思路:将阶乘相加的公式展开:

S = 1 + 1*2 + 1*2*3 + 1*2*3*4 + ... + 1*2*3...*n

查看规律:

  1. 从1开始计算,1的阶乘值为1,和记为a1, 和为1,记为b1
  2. 2的阶乘:2*a1记为a2, 和为a2+b1,记为b2
  3. 3的阶乘:3*\a2记为a3 和记为a3+b2,记为b3
  4. 依次类推,使用这种方式,我们只需要遍历计算一次即可。

来看下代码实现:

def sum_fact_new(n):
    tmp = 1
    #结果
    result = 0
    for i in range(1,n+1):
        # a1:1, 2*1 3*2*1 4*3*2*1
        tmp *= i 
        # b1:1 1+2*1+3*2*1+4*3*2*1....+40*39....*1
        result +=tmp 
    return result
n = 10
print(sum_fact_new(n))

结果:4037913;
将n设置为10000, 查看两个程序运行效果。

对比两个程序:

  1. 可以看到第二个比第一个少了很多计算,
  2. 第二个程序的运行效率高。

一个现象:

编程是什么?很多人认为就是基本语法;
如何解决问题?网上找资料都能解决,
造成后果:忽略了基本思考,学习的并不扎实,
最终结果:做一些面试题,成功率不高,不能打动用人单位;
解决方式:编程能力的提升必须多写,多练,多思考。

3.3 练习:数字翻转

需求:102转成201, 100转成1;
这个题目读者朋友可以自己尝试实现,注意函数定义及返回值。
猫猫实现思路:

  1. while循环,依次获取个位:a,十位:b, 百位:c, ....最高位:n;
  2. 注意while节制条件
  3. 生成新的数字:((((a*10)+(b*10))+c*10)...+(x*10))+n

代码实现:

def num_flip(n):
    val = 0
    #控制条件:n必须大于0
    while n>0:
        #每次去最低位
        tmp = n%10
        #这里一定要使用地板除,只保留整数
        n //= 10
        #每次将val乘以10,加上最低位
        val = val*10 + tmp
    return val
num_flip(1234)

结果:4321

大家可以这种解题思路,流程理解并熟悉下。

总结:

  • 数字类型,转换关系
  • 对于给定需求,如何分析,如何将学习知识点灵活运用;
  • 做完一个题目后,如果有时间,可以尝试优化程序;
  • 主要目的:锻炼编程思维,强化练习,掌握前面所学习知识点;

版权声明:
作者:WaterBear
链接:https://l-t.top/2869.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录