Day03_流程控制及函数

流程控制是程序员运行的基础,流程控制决定了程序按照什么样的方式去执行

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
2
1=2 22=4
3
1=3 32=6 33=9
41=4 42=8 43=12 44=16
51=5 52=10 53=15 54=20 55=25
6
1=6 62=12 63=18 64=24 65=30 66=36
7
1=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给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容