介绍Python支持的多种数字类型,包括:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。介绍和数字相关的运算符和函数。
从Python2.3开始支持bool,取值范围:True、False
在32位机器上,标准整数类型的取值范围:-2的31次方 ~ 2的31次方-1
- Python标准整数类型等价于C语言的(有符号)长整型。
- 八进制整数以数字 “0” 开头,十六进制整数以 “0x” 或 “0X” 开头
9.384e-23
6.23+1.5j
复数属性:
- num.real:复数的实部
- num.imag:复数的虚部
- num.conjugate():返回该复数的共轭复数
不同数据类型之间在运算之前,Python内部会将两个操作数转换为同一数据类型(强制转换)。
不同数据类型转换基本原则:整数转换为浮点数,非复数转换为复数。
使用内建函数coerce()
,对某种数据类型进行特殊类型转换。
from __future__ import division
指令可实现真正的除法)x - (math.floor(x/y) * y)
-3 ** 2
# 优先级高于左侧的 -4.0 ** -1.0
# 优先级低于右侧的 -int(4.25555)
# 4long(42)
# 42Lfloat(4)
# 4.0complex(2.3e-10, 45.3e4)
# (2.3e-10+453000j)abs(-1)
# 1coerce(1.23-41j, 134L)
# ((1.23-41j), (134+0j))divmod(10,3)
# (3, 1)pow(2,3)
。如果提供 mod参数,则再对mod进行取余运算__nonzero__()
方法的对象的默认值是 True。from decimal import Decimal
dec = Decimal('.1')
result = dec + Decimal('10.1')
random.randrange(100, 110, 3)
# 103,随机返回range([start,]stop[,step])结果的一项random.uniform(1.1, 1.34)
# 1.300319482480275,返回的是二者之间的一个浮点数(不包括范围上限)random.randint(12,23)
# 21,返回的是二者之间的一个整数(包括范围上限)random.random()
# 0.926576527700594,和uniform()类似,只不过下限恒等于 0.0,上限恒等于 1.0random.choice([1,2,4])
# 4,随机返回给定序列的一个元素5-1 整形。讲讲Python普通整型和长整型的区别。
普通整型:最大可表示2的63方-1(64位机器)
长整形:可表示的最大数只与机器的内存有关,普通整型“溢出”时Python可将其自动转为长整形
5-2 运算符。
(a) 写一个函数,计算并返回两个数的乘积
(b) 写一段代码调用这个函数,并显示它的结果
def multiply(num1, num2):
return num1 * num2
print multiply(7, 11)
5-3 标准类型运算符. 写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分成绩(A-F)。 A: 90–100 B: 80–89 C: 70–79 D: 60–69 F: < 60
def get_letter_grade(score):
if score >= 90 :
return 'A'
elif score >=80 :
return 'B'
elif score >=70 :
return 'C'
elif score >= 60 :
return 'D'
else :
return 'F'
5-4 取余。判断给定年份是否是闰年。使用下面的公式: 一个闰年就是指它可以被 4 整除但不能被 100 整除, 或者它可以被 400 整 除。比如 1992,1996 和 2000 年是闰年,但 1967 和 1900 则不是闰年。下一个是闰年的整世 纪是 2400 年。
def is_leep_year(year):
if year % 4 == 0:
if year % 100 != 0 :
return True
elif year % 400 == 0:
return True
else:
return False
else:
return False
print is_leep_year(1992)
print is_leep_year(2000)
print is_leep_year(1900)
print is_leep_year(1999)
5-5 取余。取一个任意小于 1 美元的金额,然后计算可以换成最少多少枚硬币。硬币有 1 美分,5 美分,10 美分,25 美分四种。1 美元等于 100 美分。举例来说,0.76 美元换算结果 应该是 3 枚 25 美分, 1 枚 1 美分。类似 76 枚 1 美分,2 枚 25 美分+2 枚 10 美分+1 枚 5 美分+1 枚 1 美分这样的结果都是不符合要求的。
思路:先取大面值的,再依次取小面值的,得到的就是最少枚硬币的组合
def get_cent_count(num):
cent_count_arr = []
cents = [25, 10, 5, 1]
left = num
i = 0
while left != 0:
cent_count_arr.append(left // cents[i])
left = left % cents[i]
i += 1
return cent_count_arr
print get_cent_count(76)
print get_cent_count(123)
print get_cent_count(88)
5-6 算术。写一个计算器程序 你的代码可以接受这样的表达式,两个操作数加一个运算符: N1 运算符 N2. 其中 N1 和 N2 为整数或浮点数,运算符可以是+, -, *, /, %, ** 分别表示 加法,减法, 乘法, 整数除,取余和幂运算。计算这个表达式的结果,然后显示出来。提示: 可以使用字符串方法 split(),但不可以使用内建函数 eval().
思路:如果使用eval()的话,直接可以计算表达式的结果:eval('3 * 4')
。此处需将数字字符串转换成数字,由于不知道数字的类型,使用Decimal进行转换比较方便。当然,一个个数字类型去判断也是可以的。
import decimal
def num1_op_num2(op_str):
arr = op_str.split()
op = arr[1]
num1 = decimal.Decimal(arr[0])
num2 = decimal.Decimal(arr[2])
if op == '+':
return num1 + num2
elif op == '-':
return num1 - num2
elif op == '*':
return num1 * num2
elif op == '/':
return num1 / num2
elif op == '%':
return num1 % num2
elif op == '**':
return num1 ** num2
else:
raise ValueError("op don't exist")
print num1_op_num2("3 * 4")
print num1_op_num2("11 % 7")
print num1_op_num2("5 ** 2")
5-7 营业税。随意取一个商品金额,然后根据当地营业税额度计算应该交纳的营业税。
略。
**5-8 几何。计算面积和体积:
(a) 正方形 和 立方体
(b) 圆 和 球。**
略。
5–9. 数值形式 回答下面关于数值格式的问题:
(a) 为什么下面的例子里 17+32 等于 49, 而 017+32 等于 47, 017+032 等于 41?
Because:数字以0开头表示8进制
(b)为什么下面这个表达式我们得到的结果是 134L 而不是 1342 ?
Because:数字以l(L,不是1)结尾表示长整形
5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为 C = (F - 32) * (5 / 9) 应该在这个练习中使用真正的除法, 否则你会得到不正确的结果。
from __future__ import division
def tran_F_to_C(F):
C = (F - 32) * (5 / 9)
return round(C, 2) # 取小数点后两位
print tran_F_to_C(42)
5-11 取余。
(a) 使用循环和算术运算,求出 0-20 之间的所有偶数
(b) 同上,不过这次输出所有的奇数
(c) 综合 (a) 和 (b), 请问辨别奇数和偶数的最简单的方法是什么?
(d) 使用(c)的成果,写一个函数,检测一个整数能否被另一个整数整除。 先要求用户输 入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回 True 和 False;
略。
5-12 系统限制。写一段脚本确认一下你的 Python 所能处理的整数,长整数,浮点数和复数的范围。
import sys
print sys.maxint
print -sys.maxint-1
print sys.float_info
print sys.long_info
result:
2147483647
-2147483648 sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
sys.long_info(bits_per_digit=30, sizeof_digit=4)
5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。
略。
5-14 银行利息。写一个函数,以定期存款利率为参数, 假定该账户每日计算复利,请计算并返回年回报率。
def compound_interest(rate):
return (1+rate) ** 364
print compound_interest(0.0005)
5–15 最大公约数和最小公倍数。请计算两个整数的最大公约数和最小公倍数。
def gcd(num1, num2):
while num2 > 0:
tmp = num1 % num2
num1 = num2
num2 = tmp
return num1
def lcm(num1, num2):
return num1 * num2 / gcd(num1, num2)
print gcd(24, 18)
print lcm(24,18)
5-16 家庭财务。给定一个初始金额和月开销数, 使用循环,确定剩下的金额和当月的支出数, 包括最后的支出数。 Payment() 函数会用到初始金额和月额度, 输出结果应该类似下 面的格式(例子中的数字仅用于演示):
def pay():
balance = float(raw_input('Enter opening balance: '))
balance = round(balance, 2)
payment = float(raw_input('Enter monthly payment: '))
payment = round(payment, 2)
print ' \tAmount\tRemaining'
print 'Pymt#\tPaid\tBalance'
print '------\t------\t------'
print '0\t$0.00\t$%s' % balance
i = 1
while balance > payment:
balance -= payment
balance = round(balance, 2)
print '%d\t$%s\t$%s' % (i, payment, balance)
print '%d\t$%s\t$0.00' % (i, balance)
pay()
5-17 随机数。熟读随机数模块然后解下面的题: 生成一个有 N 个元素的由随机数 n 组成的列表, 其中 N 和 n 的取值范围分别为: (1 < N <= 100), (0 <= n <= 2^31 -1)。然后再随机从这个列表中取 N (1 <= N <= 100)个随机数 出来, 对它们排序,然后显示这个子集。
import random
def rand_sort_num():
res = []
N = random.randint(1, 100)
while N > 0:
n = random.randint(0, 2**31-1)
res.append(n)
N -= 1
res.sort()
return res
print rand_sort_num()