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'>
分析:
- 整数与浮点运算结果为浮点,在他们计算时候,python解释器会将数字强制转成浮点数,然后在进行运算;
- 结果与预想不太一致,是一个不太准确的浮点,这是由于浮点运算导致,暂时没有办法规避,只能强制设置取小数点后位数。
python中数字转换的优先级:
- float > int > bool;
- float与int,bool计算,结果为float类型;
- 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数字,并计算他们之间乘积;
知识点:
- while循环或者range函数,乘法运算;
- 定义函数: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,和记为a1, 和为1,记为b1
- 2的阶乘:2*a1记为a2, 和为a2+b1,记为b2
- 3的阶乘:3*\a2记为a3 和记为a3+b2,记为b3
- 依次类推,使用这种方式,我们只需要遍历计算一次即可。
来看下代码实现:
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, 查看两个程序运行效果。
对比两个程序:
- 可以看到第二个比第一个少了很多计算,
- 第二个程序的运行效率高。
一个现象:
编程是什么?很多人认为就是基本语法;
如何解决问题?网上找资料都能解决,
造成后果:忽略了基本思考,学习的并不扎实,
最终结果:做一些面试题,成功率不高,不能打动用人单位;
解决方式:编程能力的提升必须多写,多练,多思考。
3.3 练习:数字翻转
需求:102转成201, 100转成1;
这个题目读者朋友可以自己尝试实现,注意函数定义及返回值。
猫猫实现思路:
- while循环,依次获取个位:a,十位:b, 百位:c, ....最高位:n;
- 注意while节制条件
- 生成新的数字:((((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
大家可以这种解题思路,流程理解并熟悉下。
总结:
- 数字类型,转换关系
- 对于给定需求,如何分析,如何将学习知识点灵活运用;
- 做完一个题目后,如果有时间,可以尝试优化程序;
- 主要目的:锻炼编程思维,强化练习,掌握前面所学习知识点;