Py程序与基础教程 18_第1页
Py程序与基础教程 18_第2页
Py程序与基础教程 18_第3页
Py程序与基础教程 18_第4页
Py程序与基础教程 18_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Ch04常用内置数据类型本章要点:4.1Python内置数据类型概述4.2int数据类型(任意精度整数)4.3float类型(有限精度浮点数)4.4bool数据类型4.5complex类型4.6条件表达式、关系运算符和逻辑运算符4.7算术运算符和位运算符4.8混合运算和数值类型转换4.9内置标准数学函数4.10math模块和数学函数4.11random模块和随机函数4.12综合应用举例资源下载提示2课件等资源:扫描封底的“课件下载”二维码,在公众号“书圈”中下载。素材(源码):扫描本书目录上方的二维码下载。讲解视频:扫描封底刮刮卡中的二维码,再扫描书中相应章节中(位于每章最前)的二维码,作为开源的补充阅读和学习资源。

案例研究:扫描封底刮刮卡中的二维码,再扫描书中相应章节中(位于每章最后)的二维码,可以在线学习。电子资源:扫描封底的“补充资源”二维码,在公众号“书圈”中下载,习题参考答案、教学大纲、教学案例、思政刚要和案例分析,以及Python计算生态等补充知识。

题库自测平台:扫描封底刮刮卡中的二维码,登录网站(),进入本书“题库”页面,选择相应章节练习Python内置数据类型概述Python语言中,一切皆为对象,而每个对象都属于某个数据类型Python的数据类型包括内置的数据类型、模块中定义的数据类型和用户自定义的类型数值数据类型:int、bool、float、complex序列数据类型:不可变(str、tuple、bytes)和可变(list、bytearray)集合数据类型:set、frozenset字典数据类型:dict。例如:{1:"one",2:"two"}NoneType、NotImplementedType和EllipsisTypePython内置数据类型概述Python语言中,一切皆为对象,而每个对象都属于某个数据类型Python的数据类型包括内置的数据类型、模块中定义的数据类型和用户自定义的类型数值数据类型:int、bool、float、complex序列数据类型:不可变(str、tuple、bytes)和可变(list、bytearray)集合数据类型:set、frozenset字典数据类型:dict。例如:{1:"one",2:"two"}NoneType、NotImplementedType和EllipsisType数值数据类型Python包括四种内置的数值类型。数值数据类型的对象都是不可变对象(1)整数类型(int)。用于表示整数。例如,123、1024、-982。(2)浮点类型(float)。用于表示实数。例如,3.14、-1.23、1.1E10、-3e-4。(3)布尔类型(bool)。用于表示布尔逻辑值。例如,True、False。(4)复数类型(complex)。用于表示复数。例如,3+4j、-2-4j、1.2+3.4j。数值可以使用运算符(四则运算+、-、*、/以及乘幂运算**等)、内置函数(abs()、round()等)、math/cmath模块中的数学函数、int/float/bool/complex类的方法序列数据类型Python序列数据类型分为不可变序列数据类型和可变序列数据类型。不可变序列数据类型包括以下3种。字符串(str):表示Unicode字符序列。例如,"hello"、"大数据与人工智能"。元组类型(tuple):表示任意类型数据的序列。例如,(1,2,3)、(1,"2")。字节序列(bytes):表示字节(8位)序列数据。例如,b'abc'。可变序列数据类型包括以下两种。列表类型(list)。表示可修改的任意类型数据的序列。例如,[1,"two"]。字节数组(bytearray)。表示可以修改的字节(8位)数组集合数据类型集合数据类型表示若干数据的集合,数据项目没有顺序,且不重复。Python集合数据类型包括以下两种。(1)集合(set):可变对象。例如,{1,2,3}。(2)不可变集合(frozenset):不可变对象。例如:>>>frozenset('abc')#输出:frozenset({'a','c','b'})字典数据类型字典数据类型用于表示键/值对的字典Python内置的字典数据类型为dict例如,{1:"one",2:"two"}。有关字典数据类型的详细内容,请参见第5章NoneType、NotImplementedType和EllipsisType1.NoneType数据类型包含唯一值None。主要用于表示空值,例如,没有返回值的函数的结果。例如:>>>None>>>type(None) #输出:<class'NoneType'>2.NotImplementedType数据类型包含唯一值NotImplemented。在数值运算和比较运算时,如果对象不支持,则可能返回该值。例如:>>>NotImplemented #输出:NotImplemented>>>type(NotImplemented) #输出:<class'NotImplementedType'>3.EllipsisType数据类型包含唯一值Ellipsis。表示省略字符串符号“…”。例如:>>>Ellipsis #输出:Ellipsis>>>type(Ellipsis) #输出:<class'ellipsis'>其他数据类型Python中的一切对象都有一个数据类型,模块、类、对象、函数都属于某种数据类型。Python解释器包含内置类型,例如,代码对象(Codeobjects)、框架对象(Frameobjects)、跟踪对象(Tracebackobjects)、切片对象(Sliceobjects)、静态方法对象(Staticmethodobjects)、类方法对象(Classmethodobjects)。这部分涉及Python语言本身的构造int类型(任意精度整数)(1)整型字面量:数字字符串(前面可以带负号-)【例4.1】整型字面量示例自Python3.7版本开始,支持下划线作为整数或者浮点数的千分位标记,以增强大数值的可阅读性。二进制、八进制、十六进制则使用下划线区分4位标记>>>a=123>>>type(a)

#输出:<class'int'><class'int'>>>>1_000_000_000_000_000#输出:10000000000000001000000000000000>>>0x_FF_FF_FF_FF

#输出:42949672954294967295int类型(任意精度整数)(2)创建int对象【例4.2】int对象示例int对象的方法【例4.3】int对象方法示例>>>int

#输出:<class'int'>>>>int(),int(123),int('456'),int(1.23)#输出:(0,123,456,1)>>>int('FF',16),int('100',2)

#输出:(255,4)>>>int('abc')#报错。ValueError:invalidliteralforint()withbase10:'abc'>>>int(100,2)#报错。TypeError:int()can'tconvertnon-stringwith

explicitbase>>>i=-10>>>bin(i)

#数值转换为二进制字符串。输出:'-0b1010‘'-0b1010'>>>i.bit_length(),int.bit_length(i)#返回i的二进制位数。输出:(4,4)(4,4)int类型(任意精度整数)(3)整数的运算算术运算、位运算、内置函数、math模块中的数学运算函数【例4.4】整数运算示例(int_ops.py)importsysa=int(sys.argv[1])b=int(sys.argv[2])sum=a+bprint(a,'+',b,'=',sum)float类型(有限精度浮点数)(1)浮点类型常量【例4.5】浮点类型字面量示例创建float对象【例4.6】float对象示例>>>3.14

#输出:3.143.14>>>type(3.14)#输出:<class'float'><class'float'>>>>float

#输出:<class'float'>>>>

float(123),float('3.14')

#输出:(123.0,3.14)>>>

float('Infinity'),float('-Infinity'),float('NaN')#输出:(inf,-inf,nan)>>>

float('123abc')#报错。ValueError:couldnotconvertstringtofloat:'123abc'float类型(有限精度浮点数)(2)浮点数的表示和相等性比较在计算机系统,有些浮点数无法表示为有限个小数位,例如1/3的值为0.33333333333…,即浮点数的表示存在误差,因此,不能使用“==”运算符来检查浮点数的相等性。可以使用数学模块的isclose()函数来代替相等运算符,以检查两个浮点值是否接近>>>importmath #导入math模块>>>a=0.3 #浮点数a>>>b=0.2+0.1 #浮点数b>>>a==b #输出:False>>>math.isclose(a,b) #输出:Truefloat类型(有限精度浮点数)(3)float对象的方法浮点数的运算算术运算,math模块中浮点数运算的函数【例4.7】浮点数运算示例方法说明示例as_integer_ratio()转换为分数1.25.as_integer_ratio()#结果:(5,4)float.as_integer_ratio(1.25)#结果:(5,4)hex()转换为十六进制字符串12.3.hex()#结果:'0x1.899999999999ap+3'float.hex(12.3)#结果:'0x1.899999999999ap+3'fromhex(string)十六进制字符串转换为浮点数float.fromhex('0xFF')#结果:255.0is_integer()判断是否为int类型3.14.is_integer()#结果:Falsefloat.is_integer(2.0)#结果:Trueimportsysa=float(sys.argv[1])b=float(sys.argv[2])c=a*bprint(a,'*',b,'=',c)bool数据类型和相关运算符bool数据类型包含两个值True(真)或False(假)【例4.8】布尔值字面量示例【例4.9】bool对象示例>>>True,False

#输出:(True,False)(True,False)>>>type(True),type(False)#输出:(<class'bool'>,<class'bool'>)(<class'bool'>,<class'bool'>)>>>bool(0)

#输出:FalseFalse>>>bool(1)

#输出:TrueTrue>>>bool("abc")

#输出:TrueTruebool数据类型和相关运算符(1)Python的任意表达式都可以评价为布尔逻辑值,故均可以参与逻辑运算。例如:(2)C=AorB。如果A不为0或者不为空或者为True,则返回A;否则返回B。仅在必要时才计算第二个操作数,即如果A不为0或者不为空或者为True,则不用计算B。“短路”计算。例如:(3)C=AandB。如果A为0或者为空或者为False,则返回A;否则返回B。仅在必要时才计算第二个操作数,即如果A为0或者为空或者为False,则不用计算B。即“短路”计算。例如:>>>1and2

#输出:2>>>0and2

#输出:0>>>Falseand2

#输出:False>>>Trueand2#输出:2>>>1or2

#输出:1>>>0or2

#输出:2>>>FalseorTrue#输出:True>>>TrueorFalse#输出:True>>>not0

#输出:True>>>not'a'

#输出:Falsecomplex类型(复数)(1)创建complex对象【例4.10】复数字面量示例【例4.11】complex对象示例complex对象属性和方法>>>1+2j

#输出:(1+2j)>>>type(1+2j)

#输出:<class'complex'>>>>complex

#输出:<class'complex'>>>>c=complex(4,5)>>>c

#输出:(4+5j)属性/方法说明示例real复数的实部>>>(1+2j).real#结果:1.0imag复数的虚部>>>(1+2j).imag#结果:2.0conjugate()共轭复数>>>(1+2j).conjugate()#结果:(1-2j)complex类型(复数)(2)复数的运算【例4.12】复数运算示例表达式结果说明1+2j(1+2j)复数字面量(1+2j)+(3+4j)(4+6j)加法(1+2j)-(3+4j)(-2-2j)减法(1+2j)*(3+4j)(-5+10j)乘法(1+2j)/(3+4j)(0.44+0.08j)除法(1+2j)**2.0(-3+4j)乘幂(1+2j)/0.0运行时错误除法。除数不能为0cmath.sqrt(1+2j)(1.272019649514069+0.7861513777574233j)平方根(调用数学模块函数)cmath.sqrt(-2.0)1.4142135623730951j复数的平方根>>>a=1+2j>>>b=complex(4,5)#复数4+5j>>>a+b

#复数相加。输出:(5+7j)(5+7j)>>>importcmath>>>cmath.sqrt(b)

#复数的平方根(2.280693341665298+1.096157889501519j)比较关系运算和条件表达式条件表达式通常用于选择语句中,用于判断是否满足某种条件如果表达式的结果为数值类型(0)、空字符串("")、空元组(())、空列表([])、空字典({}),则其bool值为False(假);否则其bool值为True(真)。例如:123、"abc"、(1,2)均为True【例4.13】条件表达式示例>>>bool(123),bool("abc"),bool((1,2)),bool([0]),bool([]),bool(0)(True,True,True,True,False,False)>>>bool(1>2),bool(1>2or3>2),bool(1<=2and3>2)(False,True,True)关系和测试运算符(1)关系运算符用于将两个操作数的大小进行比较。若关系成立,则比较的结果为True,否则为False两个相同类型的对象之间的比较数值类型(包括布尔型,True自动转换为1,False自动转换为0)之间可以进行比较>>>1>2

#输出:False>>>"ab123">"ab12"#输出:True>>>1>1.23

#输出:False>>>2>True

#输出:True>>>123>"abc"#报错。TypeError:unorderabletypes:int()>str()关系和测试运算符(2)运算符表达式含义实例结果==x==yx等于y"ABCDEF"=="ABCD"False!=x!=yx不等于y"ABCD"!="abcd"True>

x>yx大于y"ABC">"ABD"False>=x>=yx大于等于y123>=23True<

x<yx小于y"ABC"<"上海"True<=x<=yx小于等于y"123"<="23"Trueisxisyx和y是同一个对象x=y=1;xisyx=1;y=2;xisyTrueFalseisnotxisnotyx和y不是同一个对象x=1;y=2;xisnotyTrueinxinyx是y的成员(y是容器,如元组)1in(1,2,3)"A"in"ABCDEF"TrueTruenotinxnotinyx不是y的成员(y是容器,如元组)1notin(1,2,3)False逻辑运算符算术运算符运算符含义说明优先级实例结果**乘幂操作数的乘幂1n**3512+一元+操作数的值2+n8-一元-操作数的反数2-n-8*乘法操作数的积3n*n*2128/除法第二个操作数除第一个操作数310/n1.25//整数除法两个整数相除,结果为整数310//n1%模数第二个操作数除第一个操作数后的余数310%n2+加法两个操作数之和410+n18-减法从第一个操作数中减去第二个操作数4n-10-2运算符用法含义优先级实例结果~~op按位求补1~0x1-2(-0x2)<<

op1<<op2将op1左移op2位20xf0<<43840(0xf00)>>

op1>>op2将op1右移op2位20xf0>>415(0xf)&op1&op2按位逻辑与30xff00&0xf0f061440(0xf000)^op1^op2按位逻辑异或40xff00^0xf0f04080(0xff0)|op1|op2按位逻辑或50xff00|0xf0f065520(0xfff0)位运算符【例4.14】位运算符示例(op_bit.py)print("~0x1结果为:",hex(~0x1))print("0b11110000<<4结果为:",bin(0b111110000<<4))print("0b11110000>>4结果为:",bin(0b111110000>>4))print("0b1111111100000000&0b1111000011110000结果为:",bin(0b1111111100000000&0b1111000011110000))print("0b1111111100000000|0b1111000011110000结果为:",bin(0b1111111100000000|0b1111000011110000))print("0b1111111100000000^0b1111000011110000结果为:",bin(0b1111111100000000^0b1111000011110000))混合运算和数值类型转换混合运算和隐式转换int、float和complex对象可以混合运算如果表达式中包含complex对象,则其他对象自动转换(隐式转换)为complex对象,结果为complex对象如果表达式中包含float对象,则其他对象自动转换(隐式转换)为float对象,结果为float对象显式转换(强制转换)使用target-type(value)将表达式强制转换为所需的数据类型类型转换示例【例4.15】隐式类型转换示例【例4.16】显式类型转换示例>>>f=123+1.23>>>f#输出:124.23>>>type(f)#输出:<class'float'>>>>123+True#True转换为1。输出:124>>>123+False#False转换为0。输出:123>>>

int(1.23)

#输出:1>>>

float(10)

#输出:10.0>>>

bool("abc")

#输出:True>>>

float("123xyz")#报错。ValueError:couldnotconvertstringtofloat:'123xyz'【例4.17】数值数据类型示例(profit.py):计算复利nb=float(input("请输入本金:"))#输入本金并转换为浮点数nr=float(input("请输入年利率:"))#输入年利率并转换为浮点数ny=int(input("请输入年份:"))#输入年份并转换为整数amount=nb*(1+nr/100)**ny#计算复利print("本金利率和为:%0.2f"%amount)#输出复利,保留两位小数内置标准数学函数函数含义实例结果abs(x)数值x的绝对值。如果x为复数,则返回x的模abs(-1.2)abs(1-2j)1.22.23606797749979divmod(a,b)返回a除以b的商和余数divmod(5,3)(1,2)pow(x,y[,z])返回x的y次幂(x**y)。如果指定z,则为:pow(x,y)%zpow(2,10)pow(2,10,10)10244round(number[,ndigits])四舍五入取整。如果指定ndigits,则保留ndigits小数round(3.14159)round(3.14159,4)33.1416sum(iterable[,start])求和sum((1,2,3))sum((1,2,3),44)650数制转换函数函数说明示例bin(number)数值转换为二进制字符串bin(100)#结果:'0b1100100'hex(number)数值转换为十六进制字符串hex(100)#结果:'0x64'oct(number)数值转换为八进制字符串oct(100)#结果:'0o144'math模块和数学函数Python标准模块math中,提供了许多常用的数学函数,包括三角函数、对数函数和其他通用数学函数math模块中的函数不支持复数,复数函数位于cmath模块math模块包含的常量和函数,其API如表4-14(1)~(6)所示math模块包含的常量和函数(1)表4-14(1)math的常量和函数(一):常量名称说明示例结果e数学常量ee2.718281828459045pi数学常量pipi3.141592653589793math模块包含的常量和函数(2)表4-14(2)math的常量和函数(二):数值运算和表示名称说明示例结果ceil(x)返回>=x的最小整数ceil(1.2),ceil(-1.6)2,-1copysign(x,y)返回符号为y的x的值copysign(1.0,-0.0)-1.0fabs(x)返回x的绝对值fabs(-1.2)1.2factorial(x)返回正整数x的阶乘factorial(10)3628800floor(x)返回<=x的最大整数floor(1.8),floor(-2.1)1,-3fmod(x,y)返回x%yfmod(5,3)2.0frexp(x)返回(m,e),使得:x==m*2**efrexp(1024)(0.5,11)fsum(iterable)返回序列之和,浮点数的计算结果比sum更精确fsum([.1,.1,.1,.1,.1,.1,.1,.1,.1,.1])sum([.1,.1,.1,.1,.1,.1,.1,.1,.1,.1])1.0

0.9999999999999999isfinite(x)判断x是否为有限值isfinite(float('Infinity'))isfinite(float('-Infinity'))isfinite(float('NaN'))isfinite(float('12.3'))FalseFalseFalseTrueisinf(x)判断x是否为无穷大isinf(float('Infinity'))isinf(12.3)TrueFalseisnan(x)判断x是否为非数值isnan(float('NaN'))isnan(12.3)TrueFalseldexp(x,i)返回x*(2**i)是frexp(x)的反函数ldexp(2,10)2048.0modf(x)返回x的小数和整数部分,结果为元组modf(-12.3)(-0.3000000000000007,-12.0)trunc(x)将x截为最接近0的整数trunc(1.2)trunc(-2.8)1-2math模块包含的常量和函数(3)表4-14(3)math的常量和函数(三):幂和对数运算名称说明示例结果exp(x)返回e**xexp(5)148.4131591025766expm1(x)返回e**x–1比exp(x)–1精确expm1(1e-5)exp(1e-5)-11.0000050000166667e-051.0000050000069649e-05log(x)log(x,base])返回logex返回logbasexlog(e)log(e,2)1.01.4426950408889634log1p(x)返回log(1+x)log1p(1)log(2)0.69314718055994530.6931471805599453log2(x)返回log2xlog2(e)1.4426950408889634log10(x)返回log10xlog10(100)2.0pow(x,y)返回xy,即x**ypow(2,8)256.0math模块包含的常量和函数(4)表4-14(4)math的常量和函数(四):三角函数名称说明示例结果acos(x)返回x的反余弦acos(1)0.0asin(x)返回x的反正弦asin(1)1.5707963267948966atan(x)返回x的反正切atan(1)0.7853981633974483atan2(y,x)返回x的atan(y/x)atan2(1,2)0.4636476090008061cos(x)返回x的余弦cos(2*pi)1.0hypot(x,y)返回sqrt(x*x+y*y),即欧几里德距离hypot(3,4)5.0sin(x)返回x的正弦sin(pi/2)1.0tan(x)返回x的正切tan(pi/4)0.9999999999999999math模块包含的常量和函数(5)表4-14(5)math的常量和函数(五):双曲线函数名称说明示例结果acosh(x)返回x的双曲线反余弦acosh(1)0.0asinh(x)返回x的双曲线反正弦asinh(1)0.8813735870195429atanh(x)返回x的双曲线反正切atanh(0.1)0.1003353477310756cosh(x)返回x的双曲线余弦cosh(1)1.5430806348152437sinh(x)返回x的双曲线正弦sinh(0.1)0.10016675001984403tanh(x)返回x的双曲线正切tanh(0.1)0.09966799462495582表4-14(6)math的常量和函数(六):角度弧度转换函数名称说明示例结果degrees(x)将x从弧度转换为角度degrees(pi)180.0radians(x)将x从角度转换为弧度radians(90)1.5707963267948966math模块应用举例(1)【例4.18】数学函数的使用示例(math_test.py):输入三条边长,如果可以构成三角形则,求三角形的面积、周长、某边长所对应的高、最长边长、最短边长;否则,报错:“不能构成三角形”importmath#三角形三边a、b、c,必须满足:三条边长均大于零,并且任意两边之和大于第三边a=int(input("请输入边长a:"))b=int(input("请输入边长b:"))c=int(input("请输入边长c:"))if(a>0andb>0andc>0anda+b>canda+c>bandb+c>a):h=(a+b+c)/2#周长的一半area=math.sqrt(h*(h-a)*(h-b)*(h-c))#面积perimeter=a+b+c#周长height_a=2*area/a#边长a所对应的高max_side=max(a,b,c)#最长边长min_side=min(a,b,c)#最短边长print("三角形的三条边为:{0}、{1}和{2}".format(a,b,c))print("三角形的面积为:{0:.2f}".format(area))print("三角形的周长为:{0:.2f}".format(perimeter))print("边长A对应的高为:{0:.2f}".format(height_a))print("三角形的最长的边为:{0:.2f}".format(max_side))print("三角形的最短的边为:{0:.2f}".format(min_side))else:print("三条边:{0}、{1}和{2},不能构成三角形".format(a,b,c))math模块应用举例(2)【例4.19】数学函数的使用示例(quadratic.py):求一元二次方程的实数解。其中,系数b和c由命令行参数所确定importmathimportsysb=float(sys.argv[1])c=float(sys.argv[2])discriminant=b*b-4.0*cifdiscriminant>=0:d=math.sqrt(discriminant)print("x1=",(-b+d)/2.0)print("x2=",(-b-d)/2.0)else:print("此方程无实数解")random模块和随机函数random模块包含各种伪随机数生成函数,以及各种根据概率分布生成随机数的函数使用random模块函数seed()可以设置伪随机数生成器的种子随机整数>>>importrandom>>>random.seed(1)#设置种子为1>>>foriinrange(5):print(random.randint(1,5),end=',')#输出:2,5,1,3,1,>>>foriinrange(5):print(random.randint(1,5),end=',')#输出:4,4,4,4,2,>>>random.seed(1)#重新设置种子为1,结果重复>>>foriinrange(5):print(random.randint(1,5),end=',')#输出:2,5,1,3,1,>>>random.seed(10)#重新设置种子为10>>>foriinrange(5):print(random.randint(1,5),end=',')#输出:5,1,4,4,5,名称说明示例结果(随机)randrange(stop)返回随机整数N,N属于序列[0,stop)foriinrange(10):print(randrange(10),end=',')8,6,7,4,0,9,1,5,4,9,randrange(start,stop[,step])返回随机整数N,N属于序列[start,stop,step)foriinrange(10):print(randrange(1,5),end=',')3,4,1,2,3,4,4,4,1,1,randint(a,b)返回随机整数N,使得a<=N<=b,即randrange(a,b+1)foriinrange(10):print(randint(1,5),end=',')1,2,5,5,1,1,1,2,3,4,getrandbits(k)返回随机整数N,使得N的位(bit)长为kforiinrange(10):print(getrandbits(2),end=',')0,0,1,2,1,3,1,1,1,1,【例4.20】猜数游戏(guess.py)首先随机产生一个1~100以内的整数,请用户猜测具体是哪个数,即:不断从标准输入读取用户的猜测值,并根据猜测值给出提示信息:“太大”、“太小”或“正确!”importrandomsecret=random.randrange(1,101)guess=0whileguess!=secret:guess=int(input("请猜测一个100之内的数:"))if(guess<secret):print('太小')elif(guess>secret):print('太大')else:print('正确!')随机系列【例4.21】混排示例(random_shuffle.py):随机生成扑克牌的四手牌(4个人的牌局,每手牌13张)……tobecontinued假设表中示例基于如下前提条件:名称说明示例结果(随机)choice(seq)从非空的序列seq中随机返回一个元素foriinrange(5):print(choice(seq),end=',')e,e,e,a,e,sample(population,k)从非空的序列population随机抽取k个元素,返回其列表sample(seq,3)['i','u','a']shuffle(x[,random])混排列表。可选的random为随机函数,默认为random()shuffle(seq1);seq1[2,1,5,3,4]>>>fromrandomimport*>>>seq=('a','e','i','o','u');seq1=[1,2,3,4,5]【例4.21】混排示例(random_shuffle.py)importrandom#一副牌:Club(梅花)、Diamond(方块)、Heart(红桃)、Spade(黑桃)、2-10,J,Q,K,Acards=['2C','3C','4C','5C','6C','7C','8C','9C','10C','JC','QC','KC','AC','2D','3D','4D','5D','6D','7D','8D','9D','10D','JD','QD','KD','AD','2H','3H','4H','5H','6H','7H','8H','9H','10H','JH','QH','KH','AH','2S','3S','4S','5S','6S','7S','8S','9S','10S','JS','QS','KS','AS']random.shuffle(cards)#混排,洗牌deck1=[];deck2=[];deck3=[];deck4=[]#初始化四手牌foriinrange(13):#发牌deck1.append(cards.pop())deck2.append(cards.pop())deck3.append(cards.pop())deck4.append(cards.pop())print(deck1);print(deck2);print(deck3);print(deck4)综合应用举例蒙特卡洛模拟:赌徒破产命运赌徒的最终命运是破产:假设一个赌徒从给定赌资筹码开始,连续下注一系列的1个筹码的赌注,最终结果赌徒注定会输光。可以通过随机模拟来证明该假设,假设初始赌资为stake个筹码,每次下注通过随机数0和1来判断输赢:0的时候筹码加1、1的时候筹码减1,筹码小于0时终止。仿真trials取平均下注次数【例4.22】赌徒破产命运(gambler1.py)运行程序每次结果不一样,但最终都会完成并输出破产需要的次数。注意,如果stake数比较大,则程序运行的时间可能比较长…tobecontinued【例4.23】赌徒赢的概率(gambler2.py)…tobecontinued【例4.22】赌徒破产命运(gambler1.py)importrandomdefgamble(stake,trials):"""返回输掉stake所需要的次数,模拟仿真trials次取平均值"""total_bets=0#总下注次数max_cash=stake#最大赌资fortinrange(trials):#模拟trials次取平均cash=stake#筹码whilecash>0:#持续下注直到破产#模拟一次下注total_bets+=1ifrandom.randrange(0,2)==0:cash+=1max_cash=max(max_cash,cash)else:cash-=1#print(cash)#print("赌博过程中最大赌资={}".format(max_cash))returnint(total_bets/trials)if__name__=="__main__":print("输掉{}个筹码的平均次数:{}".format(1,gamble(1,100)))print("输掉{}个筹码的平均次数:{}".format(5,gamble(5,100)))print("输掉{}个筹码的平均次数:{}".format(10,gamble(10,100)))print("输掉{}个筹码的平均次数:{}".format(20,gamble(20,100)))【例4.23】赌徒赢的概率(gambler2.py)importrandomdefgamble(stake,goal,trials):"""返回输掉stake所需要的次数,模拟仿真trials次取平均值"""bets=0#总下注次数wins=0#赢的次数fortinrange(trials):#模拟trials次取平均cash=stake#筹码#持续下注直到破产,或达到目标退场whilecash>0andcash<goal:#模拟一次下注bets+=1ifrandom.randrange(0,2)==0:cash+=1else:cash-=1ifcash>=goal:wins+=1#赢的次数

returnwins/trials,int(bets/trials)if__name__=="__main__":p,n=gamble(10,20,100)print("{}赢{}的概率{}%,平均下注次数{}".format(10,20,p*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论