3. Python控制结构

第三部分 Python控制结构

@

1. 布尔值

“布尔”数据类型只有两种值:True和False。

2. 比较运算符

“比较操作符”比较两个值,求值为一个布尔值。下表列出了比较操作符:
|操作符|含义|
|:----|:---|
|==|等于|
|!= |不等于|
|<| 小于|
|>| 大于|
|<=| 小于等于|
|>=| 大于等于|

3. 布尔操作符

Python中3个布尔操作符(and、or 和not)用于比较布尔值。像比较操作符一样,它们将这些表达式求值为一个布尔值。

二元布尔操作符
and和or操作符总是接受两个布尔值(或表达式),所以它们被认为是“二元”操作符。

  • and:如果两个布尔值都为True,and操作符就将表达式求值为True,否则求值为False。
  • or:只要有一个布尔值为真,or 操作符就将表达式求值为True。如果都是False,所求值为False。

not操作符
和and 和or 不同,not 操作符只作用于一个布尔值(或表达式)。not 操作符求值为相反的布尔值。

4. 控制流的元素

控制流语句的开始部分通常是“条件”,接下来是一个代码块,称为“子句”。

  • 条件
    条件总是求值为一个布尔值,True 或False。几乎所有的控制流语句都使用条件。
  • 代码块
    一些代码行可以作为一组,放在“代码块”中。可以根据代码行的缩进,知道代码块的开始和结束。代码块有3 条规则。

(1) 缩进增加时,代码块开始。

(2) 代码块可以包含其他代码块。

(3) 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了。

Python语言采用严格的“缩进”来表明程序的格式框架。缩进指每一行代码开始前的空白区域,用来表示代码之间的包含和层次关系。
1个缩进 = 4个空格
缩进是Python语言中表明程序框架的唯一手段。

5. 控制流语句

5.1 分支结构

分支结构是程序根据条件判断结果而选择不同向前执行路径的一种运行方式,包括单分支结构和二分支结构。由二分支结构会组合形成多分支结构。
if 语句
if 语句的子句(也就是紧跟if 语句的语句块),将在语句的条件为True 时执行。如果条件为False,子句将跳过。在Python中,if 语句包含以下部分:

  • if 关键字;
  • 条件(即求值为True 或False 的表达式);
  • 冒号;
  • 在下一行开始,缩进的代码块(称为if 子句)

else 语句
if 子句后面有时候也可以跟着else 语句。只有if 语句的条件为False 时,else子句才会执行。在英语中,else 语句读起来可能是:“如果条件为真,执行这段代码。否则,执行那段代码”。else 语句不包含条件.

idCard = "520125197907167561"
genderFlag = int(idCard[16])
if genderFlag%2==0:
    print("女")
else:
    print("男")
print("结束")
女
结束

elif 语句
虽然只有if 或else 子句会被执行,但有时候可能你希望,“许多”可能的子句中有一个被执行。elif 语句是“否则如果”,总是跟在if 或另一条elif 语句后面。它提供了另一个条件,仅在前面的条件为False 时才检查该条件。在代码中,elif 语句总是包含以下部分:

  • elif 关键字;
  • 条件(即求值为True 或False 的表达式);
  • 冒号;
  • 在下一行开始,缩进的代码块(称为elif 子句)
taxIncome = 120000.00
if taxIncome <= 36000:
    taxRate = 0.03
elif taxIncome <= 144000:
    taxRate = 0.1
elif taxIncome <= 300000:
    taxRate = 0.2
else:
    taxRate = 0.4
print(taxRate)

真值(True)
在这里插入图片描述
Python中的三元表达式可以将if-else语句放到一行里。语法如下:

value = true-expr if condition else false-expr

true-expr或false-expr可以是任何Python代码。它和下面的代码效果相同:

if condition:
    value = true-expr
else:
    value = false-expr
numInIDCard = 3
'男' if numInIDCard % 2 == 1 else '女'

分支结构实例:身体质量指数BMI
BMI的定义如下:

\(BMI = 体重(kg)\div 身高^{2}(m^{2})\)

例如,一个人身高1.75米、体重75公斤,他的BMI值为24.49
编写一个根据体重和身高计算BMI值的程序,并同时输出国际和国内的BMI指标建议值:
在这里插入图片描述

height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
bmi = weight / pow(height, 2)
print("BMI数值为:{:.2f}".format(bmi))
wto, dom = "", ""    #定义变量
if bmi < 18.5:   # WTO标准
    wto = "偏瘦"
elif bmi < 25:   # 18.5 <= bmi < 25
    wto = "正常"
elif bmi < 30:   # 25 <= bmi < 30
    wto = "偏胖"
else:
    wto = "肥胖"
if bmi < 18.5:    # 我国卫生部标准
    dom = "偏瘦"
elif bmi < 24:    # 18.5 <= bmi < 24
    dom = "正常"
elif bmi < 28:    # 24 <= bmi < 28
    dom = "偏胖"
else:
    dom = "肥胖"
print("BMI指标为:国际'{0}', 国内'{1}'".format(wto, dom))
请输入身高(米)和体重(公斤)[逗号隔开]: 1.75,75
BMI数值为:24.49
BMI指标为:国际'正常', 国内'偏胖'

5.2 while 循环语句

利用while 语句,可以让一个代码块一遍又一遍的执行。只要while 语句的条件为True,while 子句中的代码就会执行。在代码中,while 语句总是包含下面几部分:

  • 关键字;
  • 条件(求值为True 或False 的表达式);
  • 冒号;
  • 从新行开始,缩进的代码块(称为while 子句)。

Python当中,while实现循环的方法如下:

while <条件>:
  <语句块>

while 语句与if 语句的区别:if 子句结束时,程序继续执行if 语句之后的语句。但在while 子句结束时,程序执行跳回到while 语句开始处。while 子句常被称为“while 循环”,或就是“循环”。例如下面的代码:

userCounter = 0
if userCounter < 3:
    userCounter = userCounter + 1
    print("第{}个用户".format(userCounter))
第1个用户
userCounter = 0
while userCounter < 3:
    userCounter += 1
    print("第{}个用户".format(userCounter))
print("结束")
第1个用户
第2个用户
第3个用户
结束

扩展
while语句也有一种使用保留字else的扩展模式,如果while 循环正常结束(没有使用break 跳出),程序将进入到可选的else段:

while  <条件>:
    <语句块1>
else:
    <语句块2>

例如
while语句

s, idx = "SWUFE", 0
while idx < len(s):
    print("循环中:" + s[idx])
    idx += 1
else:
    print("循环正常结束")  # 那什么时候不会执行这句话呢?break了解一下。

等同于

s, idx = "SWUFE", 0
for idx in range(len(s)):
    print("循环中:" + s[idx])
else:
    print("循环正常结束")  # 那什么时候不会执行这句话呢?break了解一下。
循环中:S
循环中:W
循环中:U
循环中:F
循环中:E
循环正常结束

5.2 for 循环语句

在条件为True 时,while 循环就会继续循环(这是它的名称的由来)。但如果你想让一个代码块执行固定次数,该怎么办?可以通过for循环语句和range()函数来实现。

在代码中,for 语句看起来像for i in range():这样,总是包含以下部分:

  • for 关键字;
  • 一个变量名;
  • in 关键字;
  • 调用range()方法,最多传入3 个参数;
  • 冒号;
  • 从下一行开始,缩退的代码块(称为for子句)。

从0加到100的例子:

total = 0
for num in range(101):
    total = total + num
print(total)

也可以等价于while循环:

total, num = 0, 0
while num < 101:
    total = total + num
    num += 1
print(total)

range()函数的三个参数(起始值,步长,终止值)。(区间为 [起始值,终止值))

for i in range(5, -1, -1):
    print(i)
5
4
3
2
1
0

** 案例: ** 判断列表中是否存在奇数。
传统的写法是:

numbers = [1, 2, 3, 4, 5]
is_odd_exist = False
for n in numbers:
    if n % 2 == 1:
        is_odd_exist = True 
        break       
if is_odd_exist:
    print("奇数存在")
else: 
    print("奇数不存在")

利用Python的for...else语句,可以更加简洁:

numbers = [1, 2, 3, 4, 5]
for n in numbers:
    if n % 2 == 1:
        print("奇数存在")
        break
else:
    print("奇数不存在")

5.3 break 语句

break用来跳出最内层for或while循环,脱离该循环后程序从循环后代码继续续执行。(结束该层循环)

nameStr = "aucd"
for c in nameStr:
    if c == 'u':
        print("在{}中找到u了。".format(nameStr))
        break
else:
    print("{}中没有u字母。".format(nameStr))
在aucd中找到u了。
nameStr = "aucd"
for c in nameStr:
    if c == 'u':
        print("在{}中找到u了。".format(nameStr))
        break
    else:
        print("{}中没有u字母。".format(nameStr))
aucd中没有u字母。
在aucd中找到u了。

每个break语句只有能力跳出当前层次循环。

for c in "abcde":
    for i in range(3):
        print(c, end="")
        if c=='d':
            break
aaabbbcccdeee

5.4 continue 语句

像break 语句一样,continue 语句用于循环内部。如果程序执行遇到continue语句,就会马上跳回到循环开始处,重新对循环条件求值(这也是执行到达循环末尾时发生的事情)。(结束该次循环)
举例:用户验证

while True:
    print('请输入用户名:')
    name = input()
    if name != 'zhangsan':
        print("用户不存在,请重新输入用户名")
        continue
    print('Hello, zhangsan. 密码是什么?')
    password = input()
    if password == '123456':
        break
print('用户验证成功.')
请输入用户名:
lisi
用户不存在,请重新输入用户名
请输入用户名:
zhangsan
Hello, zhangsan. 密码是什么?
125678
请输入用户名:
zhangsan
Hello, zhangsan. 密码是什么?
123456
用户验证成功.

6. 导入模块

  • Python 程序可以调用一组基本的函数,这称为“内建函数”,包括你见到过的print()、input()和len()函数。
  • Python 也包括一组模块,称为“标准库”。每个模块都是一个Python 程序,包含一组相关的函数,可以嵌入你的程序之中。例如,math模块有数学运算相关的函数,random 模块有随机数相关的函数,等等。

在开始使用一个模块中的函数之前,必须用import 语句导入模块。在导入一个模块后,就可以使用该模块中所有的函数。
import 模块名称

  • import 关键字;
  • 模块的名称;
  • 可选的更多模块名称,之间用逗号隔开。import random, sys, os, math

from import 语句

import 语句的另一种形式:from(关键字) 模块名称 import *(关键字),例如from random import *
使用这种形式的import 语句,调用random 模块中的函数时不需要random.前缀。但是,使用完整的名称会让代码更可读,所以最好是使用普通形式的import 语句。

例子:random 模块,让我们能使用random.randint()函数。因为randint()属于random 模块,必须在函数名称之前先加上random.,告诉python 在random 模块中寻找这个函数。

import random
for i in range(5):
    print(random.randint(1, 10))
2
6
6
2
2
from random import *
for i in range(5):
    print(randint(1, 10))
8
5
6
10
3

7. random库的使用

随机数在计算机应用中十分常见,Python内置的random库主要用于产生各种分布的伪随机数序列。random库采用梅森旋转算法(Mersenne twister)生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用。

使用random库主要目的是生成随机数,因此,只需要查阅该库的随机数生成函数,找到符合使用场景的函数使用即可。这个库提供了不同类型的随机数函数,所有函数都是基于最基本的random.random()函数扩展而来。

函数 描述 实例
seed(a=None) 初始化随机数种子,默认为当前系统时间
random() 生成一个[0.0,1.0)之间的随即小数
randint(a,b) 生成一个[a,b]之间的整数
randrange(stat,stop[,step]) 生成[start,stop)之间以step为步数的随机整数 randrange(0,100,4)
#从0开始到100以4递增的元素中随机返回
getrandbits(k) 生成一个k比特长度的随即整数
uniform(a,b) 生成[a,b]之间的随机小数
chioce(seq) 从序列类型(例如:列表)中随机返回一个元素 choice(range(100))
shuffle(seq) 将序列类型中元素随机排列,返回打乱后的序列
sample(pop,k) 从pop类型中随机选取k个元素,以列表类型返回

说明:
生成随机数之前可以通过seed()函数指定随机数种子,随机种子一般是一个整数,只要种子相同,每次生成的随机数序列也相同。这种情况便于测试和同步数据。

seed(42) # 随机种子赋值42
print("{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10)))
2.1.5
seed(42) # 随机种子赋值42
print("{}.{}.{}".format(randint(1,10),randint(1,10),randint(1,10)))
2.1.5

实例:

ls = list(range(10))
print(ls)
shuffle(ls)
print(ls)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[6, 2, 9, 8, 4, 7, 1, 5, 0, 3]

8.应用实例 \(\pi\)的计算

随着计算机的出现,数学家找到了另类求解π的另类方法:蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。

应用蒙特卡罗方法求解\(\pi\)的基本步骤如下:

  • 随机向单位正方形和圆结构,抛洒大量“飞镖”点
  • 计算每个点到圆心的距离从而判断该点在圆内或者圆外
  • 用圆内的点数除以总点数就是\(\pi\)/4值。

随机点数量越大,越充分覆盖整个图形,计算得到的\(\pi\)值越精确。实际上,这个方法的思想是利用离散点值表示图形的面积,通过面积比例来求解\(\pi\)值。

from random import random  #也可用*代替具体的函数
from math import sqrt
DARTS = 1000000
hits = 0.0
clock()
for i in range(1, DARTS+1):
    x, y = random(), random()
    dist = sqrt(x ** 2 + y ** 2)
    if dist <= 1.0:
        hits = hits + 1
pi = 4 * (hits/DARTS)
print("Pi值是{}".format(pi))
Pi值是3.140216

猜你喜欢

转载自www.cnblogs.com/pde-study/p/12357747.html