流程控制是程序员运行的基础,流程控制决定了程序按照什么样的方式去执行
1、if 语句
if 语句表示遇到什么样的条件,执行对应预设代码。
if 条件表达式1:
代码块1
elif 条件表达式2:
代码块2
else:
代码块3
①条件判断语句的关键字为:if – elif – else;
②可能会有零到多个 elif 部分,else 是可选的;
③ else 后只能直接加冒号,不能加条件,相当保底触条件;
④嵌套 if 语句中,可以把 if - elif - else 结构放在另外一个 if - elif - else 结构中,但是要注意同一个代码块的语句必须包含相同的缩进空格数。
# 车辆驾驶员的血液酒精含量小于 20mg/100ml 不构成酒驾;酒精含量大于或等于 20mg/100ml 为酒驾;酒精含量大于或等于 80mg/100ml 为醉驾,请编写 Python 程序判断是否为酒后驾车。
content = int(input("请输入驾驶员每100ml血液酒精的含量:"))
if 0 <= content < 20:
print("驾驶员不构成酒驾")
elif 20 <= content < 100:
if 20 <= content < 80:
print("驾驶员构成酒驾但不构成醉驾")
elif 80 <= content < 100:
print("驾驶员构成醉驾")
2、for循环
for 循环可以遍历任何序列的项目,序列可以是字符串、列表、元组、字典和集合。
for 迭代变量 in 序列:
代码块(循环体)
示例
# 计算 1-100 的和
b = range(0, 101)
sum_j = 0
for j in b:
sum_j += j
j += 1
print(end="\n")
print(sum_j)
# 遍历字符串
a = "whu"
for i in a:
print(i, end="\t")
# 遍历列表
print(end="\n")
a = ["w", "h", "u"]
for i in a:
print(i, end="\t")
# 遍历元组
print(end="\n")
a = ("w", "h", "u")
for i in a:
print(i, end="\t")
# 遍历字典
print(end="\n")
a = {1: "w", 2: "h", 3: "u"}
for i in a:
print(a[i], end="\t")
# 遍历集合
print(end="\n")
a = {"w", "h", "u"}
for i in a:
print(i, end="\t")
3、range()内置函数
range 函数是 Python 中的内置函数,用于生成一系列连续的整数,一般用于 for 循环体中,range 函数的一般语法格式为:range(start, stop, step)
参数名称 | 说明 | 备注 |
---|---|---|
start | 计数起始位置 | 整数参数,可省略;省略时默认从0开始计数;计数迭代的序列中包含 start |
stop | 计数终点位置 | 不可省略的整数参数;计数迭代的序列中不包含 stop |
step | 步长 | 可省略的整数参数,省略时默认时步长为1,不可以为 0 |
注意:① 它表示的是左闭右开区间(顾头不顾尾);② 它接收的参数必须是整数,可以是负数,但不能是浮点数等其它类型;
for x in range(3): # 省略了start 和 step
print(x,end="\t") #结果:0 1 2
for x in range(1, 3):
print(x,end="\t") #结果:1 2
for x in range(-3, -1):
print(x,end="\t") #结果:-3 -2
for x in range(-1, -5, -2):
print(x,end="\t") #结果:-1 -3
for x in range(1, 8, 2):
print(x,end="\t") #结果:1 3 5 7
4、while 循环
while 循环和 if 条件分支语句类似,即在条件表达式为真的情况下,会执行相应的代码块。不同之处在于,只要条件为真,while 就会一直重复执行那段代码块(循环体)
while 条件表达式:
代码块(循环体)
示例:
# 打印数字 0-10
a = 0
while 0 <= a <= 10:
print(a)
a += 1
#结果:012345678910
# 计算 1-100 的和
sum_i = 0
i = 0
while 0 <= i <= 100:
sum_i += i
i += 1
print(end="\n")
print(sum_i) #结果:5050
不建议使用for/else和while/else,所以这里不做讲解。
5、enumerate()函数
当迭代列表的时候,如果还想知道当前元素在列表中的索引,尽量用enumerate()取代range()。
fruit_list = ['apple','banana','peach']
for i in range(len(fruit_list)):
fruit = fruit_list[i]
print('%d: %s' % (i+1,fruit))
结果:
1:apple
2:banana
3:peach
上述代码有些生硬,因为既使用了列表的迭代,又使用了range,不易理解。为此,Python提供了内置的enumerate函数。enumerate可以把各种迭代器包装为生成器,以便稍后产生输出值。生成器每次产生一对输出值,其中,前者表示循环下标,后者表示从迭代器中获取到的下一个序列元素。
fruit_list = ['apple','banana','peach']
for i,fruit in enumerate(fruit_list):
print('%d: %s' % (i+1,fruit))
6、break 用法
break 语句可以立即终止当前循环的执行,跳出当前所在的循环结构。无论是 while 循环还是 for 循环,只要执行 break 语句,就会直接结束当前正在执行的循环体。
a = range(0, 11)
for i in a:
if i == 5:
break
print(i, end="\t")
结果为:0 1 2 3 4
对于嵌套的循环结构来说,break 语句只会终止所在循环体的执行,而不会作用于所有的循环体
7、continue 语句
continue 语句会终止执行本次循环中剩下的代码,直接从下一次循环继续执行,continue 语句的用法和 break 语句一样,只要 while 或 for 循环中的相应位置加入即可。
for letter in 'Python': # 第一个实例
if letter == 'h':
continue
print '当前字母 :', letter
var = 10 # 第二个实例
while var > 0:
var = var -1
if var == 5:
continue
print '当前变量值 :', var
print "Good bye!"
结果为:
当前字母 : P
当前字母 : y
当前字母 : t
当前字母 : o
当前字母 : n
当前变量值 : 9
当前变量值 : 8
当前变量值 : 7
当前变量值 : 6
当前变量值 : 4
当前变量值 : 3
当前变量值 : 2
当前变量值 : 1
当前变量值 : 0
Good bye!
8、while 循环和 for 循环的对比
(1)while 循环
① while 循环称之为“条件循环”,循环次数取决于条件何时变为假;
② while 循环适合循环次数是未知的操作。
(2)for 循环
① for 循环称之为"取值循环",循环次数取决 in 后包含的值的个数;
② for 循环适合循环次数是已知的操作。
9、99乘法表
使用 for 循环和 while 循环,打印九九乘法表
for a in range(1, 10):
b = 1
while a >= b:
print("%d*%d=%d" % (a, b, a * b), end="\t")
b += 1
print(end="\n")
结果:
11=1
21=2 22=4
31=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
81=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
91=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 9*9=81
10、函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
函数的分类
1)内置函数:Python 提供的直接可以拿来使用的函数,例如 list,len,str 等;
2)标准库函数:Python 提供的可在源程序中调用的函数,需要用 import 语句进行导入,例如 time,os 等;
3)第三方库:需要另外下载到本地的库,需要用 import 导入,例如 opencv 库等;
自定义函数:自己在模块里定义的函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
1)函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2)任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3)函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4)函数内容以冒号起始,并且缩进。
5)return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
def functionname( parameters ):
"说明:函数功能"
function_suite
return [expression]
示例:
# 定义函数:返回 a 和 b 中的最大值
def max_ab(a, b):
if type(a) == int and type(b) == int:
return a if a >= b else b
else:
return '类型错误'
# 调用 max_ab 函数
c = max_ab(1, 2)
print(c)
d = max_ab(5, "n")
print(d)
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数特性:
1)必须有一个明确的结束条件;
2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3)相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
4)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
示例:求阶乘。
#计算阶乘:根据用户输入的整数n,计算并输出n的阶乘值。
def fact(n):#计算阶乘
if n == 0:
return 1
else:
return n * fact(n-1)
num = eval(input("请输入一个正整数: "))
print(fact(num))
递归的思想
把规模大的问题转化为规模小的、具有与原来问题相同解法的问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。
递归的使用方法
1)找到递归关系,即把一个复杂的问题转化为与它形式相似、但规模较小的问题
2)找到递归出口,即问题转化时,当规模足够小,可以直接求解
# 斐波那契数列 递归
def fibonacci_inner(n, cache):
if n == 1 or n == 2:
return 1
r = 0
# 实现缓存
if cache.get(n) is not None:
return cache[n]
else:
cache[n] = fibonacci_inner(n-1, cache) + fibonacci_inner(n-2, cache)
return cache[n]
def fibonacci(n):
return fibonacci_inner(n, {})
if __name__ == '__main__':
n = eval(input())
print(fibonacci(n))
# 角谷定理
def jiaogu(step, n):
if n == 1:
return step
else:
if n % 2 == 0:
step += 1
print("{:.0f}".format(n/2), end=" ")
return jiaogu(step, n/2)
else:
step += 1
print("{:.0f}".format(n*3+1), end=" ")
return jiaogu(step, n*3+1)
n = eval(input())
m = jiaogu(0, n)
print("\n需要经过{}次运算".format(m))
作业:
父亲将2520个桔子分给六个儿子。分完 后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?