循环结构
- for…in 遍历循环: 计数、字符串、列表、文件…
- while无限循环
- continue和break保留字: 退出当前循环层次
- 循环else的高级用法: 与break有关
遍历循环
- 遍历某个结构形成的循环运行方式
- 从遍历结构中逐一提取元素,放在循环变量中
for <循环变量> in <遍历结构> :
<语句块>
- 由保留字for和in组成,完整遍历所有元素后结束
- 每次循环,所获得元素放入循环变量,并执行一次语句块
遍历循环的应用:计数循环(N次)
- 遍历由range()函数产生的数字序列,产生循环
for i in range(N) :
<语句块>
>>> for i in range(5):
print(i)
0
1
2
3
4
遍历循环的应用:计数循环(特定次)
for i in range(M,N,K) :
<语句块>
>>> for i in range(1,6,2):
print("Hello:",i)
Hello: 1
Hello: 3
Hello: 5
遍历循环的应用:字符串遍历循环
- s是字符串,遍历字符串每个字符,产生循环
for c in s :
<语句块>
>>> for c in "Python123":
print(c, end=",")
P,y,t,h,o,n,1,2,3,
遍历循环的应用:列表遍历循环
- ls是一个列表,遍历其每个元素,产生循环
>>> for item in [123,"PY", 456] :
print(item, end=",")
123,PY,456,
遍历循环的应用:文件遍历循环
- fi是一个文件标识符,遍历其每行,产生循环
优美胜于丑陋
明了胜于隐晦
简洁胜于复杂
>>> for line in fi :
print(line)
优美胜于丑陋
明了胜于隐晦
简洁胜于复杂
无限循环
由条件控制的循环运行方式
反复执行语句块,直到条件不满足时结束
>>> a = 3
>>> while a > 0 :
a = a - 1
print(a)
2
1
0
>>> a = 3
>>> while a > 0 :
a = a + 1
print(a)
4
5
… (CTRL + C 退出执行)
循环控制保留字:break 和 continue
- break跳出并结束当前整个循环,执行循环后的语句
- continue结束当次循环,继续执行后续次数循环
- break和continue可以与for和while循环搭配使用
>>> for c in "PYTHON" :
if c == "T" :
continue
print(c, end="")
>>> PYHON
- break仅跳出当前最内层循环
>>> s = "PYTHON"
>>> while s != "" :
for c in s :
if c == "T" :
break
print(c, end="")
s = s[:-1]
>>> PYPYPYPYPYP
循环的高级用法:循环与else
- 当循环没有被break语句退出时,执行else语句块
- else语句块作为**"正常"完成循环的奖励**
- 这里else的用法与异常处理中else用法相似
- for ……else……
>>> for c in "PYTHON" :
if c == "T" :
continue
print(c, end="")
else:
print("正常退出")
>>> PYHON正常退出
>>> for c in "PYTHON" :
if c == "T" :
break
print(c, end="")
else:
print("正常退出")
>>> PY
random库
random库是使用随机数的Python标准库
- 伪随机数: 采用梅森旋转算法生成的(伪)随机序列中元素
- random库主要用于生成随机数
- 使用random库: import random
1、 基本随机数函数: seed(), random()
>>> import random
>>> random.seed(10)
>>> random.random()
0.5714025946899135
>>> random.random()
0.4288890546751146
>>> random.seed(10)
>>> random.random()
0.5714025946899135
>>> random.seed(10)
>>> random.random()
0.5714025946899135
2、 扩展随机数函数: randint(), getrandbits(), uniform(),
randrange(), choice(), shuffle()
需要掌握的能力
- 能够利用随机数种子产生"确定"伪随机数
- 能够产生随机整数
- 能够对序列类型进行随机操作
圆周率案例
数学思维
使用圆周率的近似计算公式
#CalPiV1.py
pi = 0
N = 100
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("pi = {0},k = {1}".format(pi,k))
print("圆周率值是:{}".format(pi))
圆周率值是: 3.141592653589793
计算思维
蒙特卡洛算法
#CalPiV2.py
from random import random
from time import perf_counter
DARTS = 1000*1000*10
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
x,y = random(),random()
dist = pow(x ** 2 + y ** 2,0.5)
if dist <= 1.0:
hits = hits + 1
pi = 4 * (hits/DARTS)
print("y圆周率值是:{}".format(pi))
print("运行时间是:{:.5f}s".format(perf_counter()-start))
举一反三
理解方法思维
- 数学思维:找到公式,利用公式求解
- 计算思维:抽象一种过程,用计算机自动化求解
- 谁更准确? (不好说…)
程序运行时间分析
- 使用time库的计时方法获得程序运行时间
- 改变撒点数量,理解程序运行时间的分布
- 初步掌握简单的程序性能分析方法
计算问题的扩展
- 不求解圆周率,而是某个特定图形的面积
- 在工程计算中寻找蒙特卡罗方法的应用场景
蒙特卡洛算法非常厉害的算法
记得曾经好像学过蒙特卡洛算法的推导,当时觉得又复杂又难懂,没想到现在看来还挺有意思的,有空再去推一遍~