本章主题
数的简介
整型
布尔型
标准的整型 长整型
浮点型实数 复数
操作符
内建函数
其它数字类型 相关模块
Python 支持多种数字类型:整型、长整型、布尔型、双精度浮点型、十进制浮点型和复数。
Python 如何更新对象:实际上是生成了一个新的数 值对象,并得到它的引用。
Python如何删除对象:实际上是删除它的引用之后, 你就不能再使用这个引用(变量名), 除非你给它赋一个新值。
【python整型:】
- 标准整型(在大多数 32 位机器上-2,147,483,648 到 2,147,483,647,Python 标准整数类型等价于 C 的(有符号)长整型。整数一般以十进制表示,但是 Python 也支持八进制或十六进制来表示整数。如果八进制整数以数字“0”开始, 十六进制整数则以 “0x” 或“0X” 开始。举例:0101 84 -237 0x80 017 -680 -0X92
- 长整型 请不要将它和 C 或其它编译型语言的长整数 类型混淆。那些语言的长整数典型的取值范围是 32 位或 64 位。Python 的长整数类型能表达的 数值仅仅与你的机器支持的(虚拟)内存大小有关, 换句话说, Python 能轻松表达很大很大很 大的整数。在一个整数值后面加个 L(大写或小写都可以),表示这个整数是 长整数。这个整数可以是十进制,八进制, 或十六进制。只有在对长整数调用 repr()函数时才有机会看到“L”,如果对长整数对象调用 str()函数就看不到 L
>>> aLong = 999999999l >>> aLong
999999999L
>>> print aLong 999999999 -
【浮点数】。浮点数值通常都有一个小数点和一个可选的后缀 e(大写或小写,表示科学计数法)。在 e 和指数之间可以用正(+)或负(-)表示指数的正负(正数的话可以省略符号)
-
【复数】 为解决x2 = -1,X=?的问题
-
Python 语言中有关复数的几个概念:
虚数不能单独存在,它们总是和一个值为0.0的实数部分一起来构成一个复数。复数由实数部分和虚数部分构成
表示虚数的语法: real+imagj
实数部分和虚数部分都是浮点数 -
虚数部分必须有后缀j或J。
aComplex=-8.333-1.47j
aComplex
(-8.333-1.47j)
aComplex.real
-8.333
aComplex.imag
-1.47
aComplex.conjugate()
(-8.333+1.47j)
Python 提供了 coerce() 内建函数来帮助你实现对某种数据类型进行特殊类型转换。
【运算符】
标准运算符:都可以用于数值类型。
算数运算符:Python 支持单目运算符正号(+)和负号(-), 双目运算符, +,-,*,/,%,还有 ** , 分别表示加法,减法, 乘法, 除法, 取余, 和幂运算。从 Python2.2 起,还增加了一种新 的整除运算符 // 。
>>>4/3
1.3333333333333333
>>>4//3
1
Python 整数支持标准位运算:取反(~),按位 与(&), 或(|) 及 异或(^) 及左移(<<)和右 移(>>)。
【标准类型函数】cmp(), str() 和 type() 内建函数
【工厂函数】函数 int(), long(), float() 和 complex() 用来将其它数值类型转换为相应的数值类型,从 Python2.2 起, 有了第五个内建函数 bool()
【功能函数】abs(), coerce(), divmod(), pow()和 round()
函数 coerce()为程序员提供了不依赖 Python 解释器, 而是自定义两个数值类型转换的方法
divmod()内建函数把除法和取余运算结合起来, 返回一个包含商和余数的元组
内建函数 round()用于对浮点数进行四舍五入运算
>>round(3.23434343434)
3
>>round(3.454545454,2)
3.45
【易混点】
int(), round(), math.floor() 这几个函数好像做的是同一件 事, 很容易将它们弄混,是不是?下面列出它们之间的不同之处:
5-17 随机数。熟读随机数模块然后解下面的题:
生成一个有 N 个元素的由随机数 n 组成的列表, 其中 N 和 n 的取值范围分别为: (1 <
N <= 100), (0 <= n <= 231 -1)。然后再随机从这个列表中取 N (1 <= N <= 100)个随机数 出来, 对它们排序,然后显示这个子集。
-
函数int()直接截去小数部分。(返回值为整数)
-
函数floor()得到最接近原数但小于原数的整数。(返回值为浮点数)
-
函数round()得到最接近原数的整数。(返回值为浮点数)
-
的例子用四个正数和四个负数作为这三个函数的参数,将返回结果列在一起做个比较。
(为了便于比较,我们将 int()函数的返回值也转换成了浮点数)。
-
【进制转换函数】
-
oct() 和 hex()。它们都接受一个整数(任意进制的)对象,并返回一个对应值的字符串对象。
-
【ASCII 转换函数】(ASCII(美国标准信息交换码))
-
函数 chr()接受一个单字节整数值,返回一个字符串,其值为对应的字符。函数 ord()则相反,它接受一个字符,返回其对应的整数值。unichr(num) 接受Unicode码值,返回 其对应的Unicode字符。
-
chr(99)
'c'
ord('a')
97 -
【布尔数】
-
有两个永不改变的值 True 或 False。
-
布尔型是整型的子类,但是不能再被继承而生成它的子类。
-
没有__nonzero__()方法的对象的默认值是True。
-
对于值为零的任何数字或空集(空列表、空元组和空字典等)在Python中的布尔值都是 False。
-
在数学运算中,Boolean 值的 True 和 False 分别对应于 1 和 0。
-
以前返回整数的大部分标准库函数和内建布尔型函数现在返回布尔型。
-
True和False现在都不是关键字,但是在Python将来的版本中会是。
-
print('%s' % bar)
True
print('%d' % bar)
1 -
【十进制浮点数】??
-
-
【数字类型相关模块】
-
decimal、array、math/cmath、operator、random
-
random 随机数模块
-
randrange() 它接受和 range()函数一样的参数, 随机返回 range([start,]stop[,step])结果的一项
uniform() 几乎和 randint()一样,不过它返回的是二者之间的一个浮点数(不包括范围 上限)。
random()类似 uniform() 只不过下限恒等于 0.0,上限恒等于 1.0 choice()随机返回给定序列
-
=======【练习】=======
-
5-1 整形 讲讲 Python 普通整型和长整型的区别
-
Python 标准整数类型等价于 C 的(有符号)长整型,普通整型 32位;Python 的长整数类型能表达的 数值仅仅与你的机器支持的(虚拟)内存大小有关。
-
5-2 运算符
-
(a) 写一个函数,计算并返回两个数的乘积
-
def product(a,b): return a*b (b) 写一段代码调用这个函数,并显示它的结果 print(product(3,4)) 5-3 标准类型运算符. 写一段脚本,输入一个测验成绩,根据下面的标准,输出他的评分 成绩(A-F)。 A: 90–100 B: 80–89 C: 70–79 D: 60–69 F: <60
-
#Score def level(score): if (score>=90 and score<=100): return 'A' elif (score>=80 and score<90): return 'B' elif (score>=70 and score<80): return 'C' elif (score>=60 and score<70): return 'D' else: return 'F' score=float(input()) #可以处理小数 print(level(score))
-
5-4 取余。判断给定年份是否是闰年。使用下面的公式:
普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);世纪闰年:能被400整除的为世纪闰年。(如2000年是闰年,1900年不是闰年)下一个是世 纪闰年是 2400 年。
-
#判断闰年 def leapyear(year): if (year%400==0): return '世纪闰年' elif (year%4==0): return '普通闰年' else: return '非闰年' year=int(input()) print(leapyear(year))
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 coinExchange(money): a=int(money/25) b=int((money-25*a)/10) c=int((money-25*a-10*b)/5) d=int((money-25*a-10*b-5*c)/1) return a,b,c,d money=input() print(int(float(money)*100)) print(coinExchange(int(float(money)*100)))
5-6算术。写一个计算器程序 你的代码可以接受这样的表达式,两个操作数加一个运算符:
N1 运算符 N2. 其中 N1 和 N2 为整数或浮点数,运算符可以是+, -, *, /, %, ** 分别表示 加法,减法, 乘法, 整数除,取余和幂运算。计算这个表达式的结果,然后显示出来。提示: 可以使用字符串方法 split(),但不可以使用内建函数 eval().(eval() 函数用来执行一个字符串表达式,并返回表达式的值;split() 方法用于把一个字符串分割成字符串数组)
-
#写一个计算器程序 你的代码可以接受这样的表达式,两个操作数加一个运算符:N1 运算符 N2. 其中 N1 和 N2 为整数或浮点数,运算符可以是+, -, *, /, %, ** 分别表示 __author__='Amanda' def compute(expr): ls = expr.split(' ') #split函数通过空格把字符串分割为单个字符 if(len(ls)!=3):#关键字raise,后跟要引发的异常的名称.raise后语句则不执行 raise ValueError try: m = int(ls[0]) n = int(ls[2]) except ValueError: raise ValueError else: op = ls[1] if op=='+': return m+n if op=='-': return m-n if op=='*': return m*n if op=='/': return m/n if op=='**': return m**n if op=='%':return m%n else: raise ValueError if __name__=='__main__': str=input('expr:') try: print(compute(str)) except ValueError: print('wrong expression')
-
5-7 营业税。随意取一个商品金额,然后根据当地营业税额度计算应该交纳的营业税。
def taxs(amount,tax):
return amount*tax
if __name__=='__main__':
amount = float(input("商品金额:"))
tax = float(input("营业税:"))
print(taxs(amount,tax))
5-8 几何 计算面积和体积:
(a) 正方形 和 立方体
(b) 圆 和 球
import math
num = float(input("please input a real number:"))
print("the area of square is %f:" % (num * num))
print("the area of circle is %f:" % (math.pi*num**2))
print("the cubage of cube is %f:" % (num ** 3))
print("the cubage of sphere is %f" % (math.pi*(num**3)*3/4.0))
5–9. 数值形式 回答下面关于数值格式的问题:
(a) 为什么下面的例子里 17+32 等于 49, 而 017+32 等于 47, 017+032 等于 41?
>>> 17 + 32
49
>>> 017+ 32
47
>>> 017 + 032
41
0开头是8进制数,017=15,032=3*8+2=26,26+15=41
(b)为什么下面这个表达式我们得到的结果是 134L 而不是 1342 ?
>>> 56l + 78l
134L
python3.0已经不需要加L,系统默认识别普通整形和长整形
5-10 转换。写一对函数来进行华氏度到摄氏度的转换。转换公式为 C = (F - 32) * (5 / 9) 应该在这个练习中使用真正的除法, 否则你会得到不正确的结果。
def F2C(tem):
Fas=float(tem)
Cal=(Fas-32)*(5/9.0)
return "%fF equals to %fC" % (Fas,Cal)
print (F2C(90))
5-11 取余。
(a) 使用循环和算术运算,求出 0-20 之间的所有偶数;(b) 同上,不过这次输出所有的奇数
for num in range(0,21):
if (num%2==0):
print ("%d is even" % num)
else :
print ("%d is odd" % num)
(c) 综合 (a) 和 (b), 请问辨别奇数和偶数的最简单的方法是什么? 能否被2整除
(d) 使用(c)的成果,写一个函数,检测一个整数能否被另一个整数整除。 先要求用户输 入两个数,然后你的函数判断两者是否有整除关系,根据判断结果分别返回 True 和 False;
def div(a,b):
if (a==0 and b==0):
return "wrong input number"
elif b==0:
a,b=b,a
if a<b and a!=0:
if b%a==0:
return True
else:
return False
else:
if a%b==0:
return True
else:
return False
a1=int(input("输入整数a1:"))
b1=int(input("输入整数b1:"))
print (div(a1,b1))
5-12 系统限制。写一段脚本确认一下你的 Python 所能处理的整数,长整数,浮点数和复 数的范围。
import sys
print (sys.maxsize)
print (-sys.maxsize-1)
print (sys.float_info)
5-13 转换。写一个函数把由小时和分钟表示的时间转换为只用分钟表示的时间。
def minutes(time):
times=time.split(':')
minute=int(times[0])*60+int(times[1])
return "%s:%s = %d 分钟" % (times[0],times[1],minute)
if __name__ == '__main__':
shijian=input("输入时间:")
print(minutes(shijian))
5-14 银行利息。写一个函数,以定期存款利率为参数, 假定该账户每日计算复利,请计 算并返回年回报率。
def earnYear(rate):
earn=int(((1+rate)**365)-1)
return "年回报率为:%d" % earn
if __name__=='__main__':
dayRate=float(input("请输入定期存款利率:"))
cost=int(input("请输入本金:"))
print(earnYear(dayRate))
5–15. 最大公约数和最小公倍数。请计算两个整数的最大公约数和最小公倍数。
def cd(x,y):
(x,y)=(y,x) if x<y else (x,y)
while True:
reminder=x%y
if(reminder!=0):
(x,y)=(y,reminder)
else:
maxcd=y
break
return maxcd
def cm(x,y):
maxcd=cd(x,y)
mincm=x*y//maxcd
return mincm
if __name__=='__main__':
x=int(input("输入一个整数x:"))
y=int(input("输入另一个整数y:"))
print ("(%d,%d)最大公约数= %d" % (x, y, cd(x,y)))
print ("[%d,%d]最小公倍数= %d" % (x,y,cm(x,y)))
5-16 家庭财务。给定一个初始金额和月开销数, 使用循环,确定剩下的金额和当月的支 出数, 包括最后的支出数。 Payment() 函数会用到初始金额和月额度, 输出结果应该类似下 面的格式(例子中的数字仅用于演示):
#%r是一个万能的格式符,它会将后面给的参数原样打印出来
def payment(total,consume):
print("次数 剩余 消费")
print("0 %r 0" % total)
remains=total-consume
i=1
while (remains>=0):
print("%d %r %r" % (i,remains,consume))
i+=1
remains=remains-consume
print("%d %r %r" % (i,remains,consume))
if __name__=='__main__':
t=int(input("请输入本月初始金额:"))
c=int(input("请输入本月开销数:"))
payment(t,c)
5-17 随机数
(Step1) 生成一个有N个元素的由随机数n组成的列表,其中N和n的取值范围为(1< N <= 100)和(0 <= n <= 2的31次方减一)。
(Step2) 然后再随机从这个列表中取N(1<= N <= 100)个随机数出来并排序,然后显示。
#整数随机数的生成函数为random.randrange(start, stop[, step])生成n和N都要用到这个随机函数。
#range函数语法:range(stop) 或者 range(start, stop ,step)//默认start为0,step为1
import random
N=random.randrange(1,101) #python元组左闭右开,所以101
print("随机生成%d个元素" % N)
L1=[] #定义一个列表,用来存放Step1列表元素
for x in range(N+1):
n=random.randrange(0,2**31)
print("生成随机数:%d" % n)
L1.append(n)
print("本轮生成随机数共%d个" % x)
print("Step1最终生成的列表L1 %r " % L1)
L2=[] #定义一个列表,用来存放Step2列表元素
m=random.randrange(1,len(L1)) #随机取出L1列表中的元素
print("取出%d个数到L2[]" % m)
for y in range(m): #把随机取出的数放入新的列表L2
L2.append(L1[y])
L2.sort()
print("取出的%d个数 排序后为:" % m,L2)