纯享版页面:http://8.140.123.56:9999/html/Chapter4.html
In [1]:
# 猜数字
guess = eval(input("请输入你的数字"))
if guess == 99:
print("猜对了")
猜对了
In [2]:
guess = eval(input())
if guess == 99:
print("猜对了")
else:
print("猜错了")
猜错了
一种紧凑的逻辑,适用于简单表达式的二分支结构。
表达式1 if 条件 else 表达式2
类似于?:表达式。但是只能用于表达式,不能用于赋值等。
In [5]:
guess = eval(input())
print("猜{}了".format("对" if guess==99 else "错"))
猜对了
In [6]:
score = eval(input())
if score>=90:
grade = "A"
elif score>=80:
grade = "B"
elif score>=70:
grade = "C"
elif score>=60:
grade = "D"
else:
grade = "F"
print("成绩{}对应的等级是{}".format(score,grade))
成绩80对应的等级是B
4.1.4 条件判断及组合¶
- 条件判断操作符
- < <= > >= == !=
- 条件组合保留字
- and not or
In [9]:
guess = eval(input())
if guess>99 or guess<99:
print("猜错了")
else:
print("猜对了")
猜对了
In [12]:
num = eval(input("请输入一个数字"))
print(num**2)
--------------------------------------------------------------------------- NameError Traceback (most recent call last) /var/folders/nc/rrdwnt790c13mtwryb6prjfc0000gn/T/ipykernel_34484/2623550615.py in <module> ----> 1 num = eval(input("请输入一个数字")) 2 print(num**2) <string> in <module> NameError: name 'olg' is not defined
因为输入了olg,经过eval的处理,变成了变量olg。但是这个变量之前是不存在的,所以会报错。
使用try-except进行处理。
In [13]:
try:
num = eval(input("请输入一个数字"))
print(num**2)
except NameError:
print("出现错误,请检查输入的类型!")
出现错误,请检查输入的类型!
异常处理的高级用法:
try-except-else-finally
- finally的部分一定执行
- else在不发生异常时执行
In [16]:
try:
num = eval(input("请输入一个数字"))
print(num**2)
except NameError:
print("输入的类型不对呀")
else:
print("不错,输入的类型正确!")
finally:
print("本程序结束了!")
64 不错,输入的类型正确! 本程序结束了!
4.2 例子:BMI指数¶
Body Mass Index,体重➗身高的平方
给定体重和身高,输出国内和国际标准的BMI分类。
可以直接分开来写不同的分类,也可以混合到一起。
对于直接获取两个输入内容的方法,如下。
In [20]:
height,weight = eval(input("请输入身高(米)和体重(千克),用逗号隔开。"))
bmi = weight/ height**2
print("BMI 指数为 {:.2f}".format(bmi))
who , nat = "" , ""
#节点分别为18.5 24 25 28 30
if bmi<18.5:
who,nat="偏瘦","偏瘦"
elif 18.5<= bmi < 24:
who,nat="正常","正常"
elif 24<=bmi<25:
who,nat="正常","偏胖"
elif 25<=bmi<28:
who,nat="偏胖","偏胖"
elif 28<=bmi<30:
who,nat="偏胖","肥胖"
elif bmi>=30:
who,nat="肥胖","肥胖"
print("根据世界卫生组织标准,您的体型{}。".format(who))
print("根据中国国家标准,您的体型{}。".format(nat))
BMI 指数为 22.31 根据世界卫生组织标准,您的体型正常。 根据中国国家标准,您的体型正常。
In [23]:
for i in range(1,6):
print(i)
print("******")
for i in range(1,6,2):
print(i)
1 2 3 4 5 ****** 1 3 5
- 字符串遍历循环
- for c in s
- s是一个字符串,c是每个字符
In [24]:
for c in "114514*1919810":
print(c,end=";")
1;1;4;5;1;4;*;1;9;1;9;8;1;0;
- 列表遍历循环
- for item in ls
- ls是一个列表,item是其中的元素
In [25]:
for item in ["114514",1919810,"哼哼哼","ahahahah",1+1.4j]:
print(item,end=";")
114514;1919810;哼哼哼;ahahahah;(1+1.4j);
In [26]:
a = 3
while a>=0:
print(a)
a-=1
3 2 1 0
4.3.3 循环控制保留字¶
- break
- 跳出并结束当前循环
- 执行之后的语句
- continue
- 结束当前次的循环,继续执行下一轮
In [33]:
# break
for c in "1145141919810":
if c=='4':
break
print(c,end=";")
print("\n*******")
# continue
for c in "1145141919810":
if c=='4':
continue
print(c,end=";")
1;1; ******* 1;1;5;1;1;9;1;9;8;1;0;
In [34]:
# 多层循环
s = "PYTHON"
while s!="":
for c in s:
print(c,end=",")
print("")
s=s[:-1] #去掉最后一个字符
P,Y,T,H,O,N, P,Y,T,H,O, P,Y,T,H, P,Y,T, P,Y, P,
In [35]:
# 多层循环加break
s = "PYTHON"
while s!="":
for c in s:
if c =="T":
print("遇到了break")
break
print(c,end=",")
print("")
s=s[:-1] #去掉最后一个字符
P,Y,遇到了break P,Y,遇到了break P,Y,遇到了break P,Y,遇到了break P,Y, P,
In [38]:
# 多层循环加continue
s = "PYTHON"
while s!="":
for c in s:
if c =="T":
print("遇到了continue,",end="")
continue
print(c,end=",")
print("")
s=s[:-1] #去掉最后一个字符
P,Y,遇到了continue,H,O,N, P,Y,遇到了continue,H,O, P,Y,遇到了continue,H, P,Y,遇到了continue, P,Y, P,
由上面的例子可以发现,break只结束当前的这一层循环。
continue也是只能结束当前这一层的一次循环。
4.3.4 循环的高级用法¶
for <循环变量> in <遍历结构>:
<语句块1>
else:
<语句块2>
while <条件>:
<语句块1>
else:
<语句块2>
当循环没有被break退出时,执行else语句块。可以理解为"正常"退出循环的一种奖励。
注意,continue不管用。
在异常处理、循环的时候,else都可以视作没有"异常退出"的一种奖励。
In [40]:
s = "PYTHON"
for c in s:
if(c=="B"):
break
print(c,end=",")
else:
print("正常退出")
P,Y,T,H,O,N,正常退出
4.4 random库的使用¶
4.4.1 random库基本介绍¶
random库是随机数的Python标准库。
计算机不会产生真正的随机数,但是可以产生在一定条件下(很复杂的条件)的确定数,这个数字可以被看作伪随机数。
伪随机数:采用梅森旋转算法生成的伪随机序列中的元素。
import random即可。
4.4.2 基本随机数函数¶
- 随机数种子
- 给定一个种子,然后就能根据种子唯一确定随机序列
- 种子一样,随机序列就会一模一样
- random.seed(10)
- 如果不用seed,会默认用当前系统时间作为种子
- random()
- 生成一个[0.0,1.0)之间的随机小数
- 为什么要用种子?可以复现结果。
- 调用seed后会重新开始伪随机序列
In [44]:
import random
random.seed(10)
print(random.random())
print(random.random())
print(random.random())
print(random.random())
print(random.random())
0.5714025946899135 0.4288890546751146 0.5780913011344704 0.20609823213950174 0.81332125135732
In [47]:
# 使用系统时间作为种子
print(random.random())
print(random.random())
print(random.random())
print(random.random())
print(random.random())
0.603190610968185 0.3816059859191179 0.28361821790671515 0.674964847134956 0.45683115105830563
4.4.3 扩展随机数函数¶
- randint(a,b)
- 生成一个[a,b]之间的整数
- randrange(m,n[,k])
- 生成一个[m,n)之间的以k为步长的随机整数
- 比如randrange(10,100,10)
- 10到100之间,10+10n的数,比如20、30、...、90
- getrandbits(k)
- 生成一个k比特长的随机整数
- getrandbits(16),生成一个16比特长的随机数,比如40194
- uniform(a,b)
- 生成一个[a,b]之间的随机小数
- 小数点后16位精度
- choice(seq)
- 从序列seq中选择一个随机元素
- 比如列表,让它随便选一个元素
- shuffle(seq)
- 将序列seq中元素随机排列,返回打乱后的序列
- 几行代码放在一行,可以用分号隔开
In [64]:
print(random.randint(10,100))
print(random.randrange(10,100,10))
print(random.getrandbits(16))
print(random.uniform(10,100))
print(random.choice([1,2,3,4,5,6,7,8,9,0]))
print(random.choice("this;is;a;good;thing"))
s = ["this","ios",14,51,14,1919,810,5+6j] #这个不支持字符串
random.shuffle(s)
print(s)
32 20 17499 51.01613728129344 3 i ['ios', 14, 'this', 810, 1919, (5+6j), 51, 14]
In [71]:
# 先使用无穷级数的方法进行计算
pi = 0
N = 10000
for k in range(N):
# 用\让代码进行换行
pi += 1/pow(16,k)*( \
4/(8*k+1) - 2/(8*k+4) - \
1/(8*k+5) - 1/(8*k+6))
print("计算得到圆周率为:{}".format(pi))
# 蒙特卡罗方法
import time
points = 10000*10000 # 1亿个点
hits = 0 #命中的点
start = time.perf_counter()
for i in range(points):
x,y = random.random(),random.random()
# 判断到圆心的距离
dist = (x**2+y**2)**0.5
if dist<=1.0:
hits+=1
pi_test = 4*(hits/points)
end = time.perf_counter()
print("模拟得到圆周率为{},耗时{}秒。".format(pi_test,end-start))
计算得到圆周率为:3.141592653589793 模拟得到圆周率为3.1415658,耗时26.403482958005043秒。