Python学习2020/10/4(选择结构、循环结构)

一、选择结构程序设计

分支结构

1.if语句

1.1单分支结构

形式:

'''
if 表达式:
    语句
'''
例1 输出两个数中较大的数
a,b=eval(input("请输入两个数(a,b):"))
max=a
if b>max:
    max=b
print("max=%d"%max)

运行结果:

请输入两个数(a,b):2,3
max=3
例2 输入三个整数x、y、z,把这三个数由小到大输出
x,y,z=eval(input("Please input the x,y,z:"))
if x>y:
    x,y=y,x
if x>z:
    x,z=z,x
if y>z:
    y,z=z,y
print("Small to big:%d %d %d"%(x,y,z))

运行结果:

Please input the x,y,z:4,3,2
Small to big:2 3 4

1.2双分支结构

形式:

'''
if 表达式:
    语句1
else:
    语句2
'''
例1 输出两个数中较大的数
a,b=eval(input("请输入两个数(a,b):"))
if a>b:
    max=a
else:
    max=b
print("max=%d"%max)
例2 判断给定的某一年是否是闰年

Line 1输入时必须得先定一个类型:input()默认返回字符串类型

year = int(input("请输入年份:"))
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
    print("%d年是闰年" % year)
else:
    print("%d年是平年" % year)

运行结果:

请输入年份:2000
2000年是闰年
例3 猜数字游戏

题目:程序运行时自动产生1~5之间的随机数,接着等待键盘输入猜的数字,若猜对,则显示“猜对了”;否则,显示“猜错了”
(1)生成随机数:random库,使用之前需要导入库import random
(2)a,b之间(包括a,b)的随机数randint(a,b)

import random
number=random.randint(1,5)
guess=int(input("请输入数字(1至5):"))
if guess==number:
    print("猜对了!")
else:
    print("猜错了!,正确数字为%d"%number)

运行结果:

请输入数字(15):4
猜错了!,正确数字为5

1.3多分支结构

形式:

if 表达式1:
    语句块1
elif 表达式2:
    语句块2
    ……
elif 表达式m:
    语句块m
else:
    语句块n
例1 输出分段函数值

函数为y=x(x<1);2x+1(1≤x<10);5x-17(x≥10)

x=float(input("请输入x的值:"))
if x<1:
    print(x)
elif 1<=x<10:
    print(2*x+1)
else:
    print(5*x-17)
例2 判断键盘输入字符的类型(根据ASCII码)

在这里插入图片描述

c=ord(input("Please input a character:"))
if c<32:
    print("a control character\n")#控制字符
elif c>=48 and c<=57:
    print("a digit\n")#数字
elif c>=65 and c<=90:
    print("a capital letter\n")#大写字母
elif c>=97 and c<=122:
    print("a lower letter\n")#小写字母
else:
    print("other character\n")

2.if语句的嵌套

例 出租车收费问题

起步价7元,最多行驶3公里;3~8公里,超出部分按1.7元/公里计算;8公里以后超出部分按2.0元/公里计算,其中不足1公里,按1公里计算。要求:输入所行驶里程数,计算并输出车费
(int)为向下取整,下列程序有个数学问题,当里程数为整数时不符合

d=float(input("请输入公里数:"))
if d<0:
    print("Error!")
else:
    if d<=3:
        fee=7
    elif d<=8:
        fee=7+(int)(d-2)*1.7
    else:
        fee=7+5*1.7+(int)(d-7)*2.0
print("出租车费用为:%6.2f元"%fee)

根据对齐关系来确定if之间的逻辑关系

二、循环结构程序设计

某段程序连续被有规律地重复执行时使用循环控制语句

(一)循环语句

1.while语句

1.1纯while语句
1.1.1一般形式
while 表达式:
    语句
1.1.2执行过程

当表达式的值为真(非0)时,重复执行语句,直到表达式值为假,跳出循环

1.1.3特点

先判断表达式,后执行语句

例 求1+2+……+100
sum=0
i=1
while i<=100:
    sum+=i
    i+=1
print("sum=%d"%sum)
1.2while语句中使用else子句
1.2.1一般形式
while 表达式:
    循环体
else:
    语句

无论是否执行循环体,均执行else语句,例如:

count=int(input())
while count<5:
    print(count,"is less than 5")
    count+=1
else:
    print(count,"is not less than 5")

若循环体中因为执行了break语句而退出,则不会执行else语句,前提是找到了满足要求的元素(循环体执行过一次)
在这里插入图片描述

运行结果:

3#输入3
3 is less than 5
4 is less than 5
5 is not less than 5

7#输入7
7 is not less than 5

2.for语句

2.1一般形式
for 目标变量 in 序列对象:
    循环体
2.2执行过程

f通过遍历任意序列的元素来建立循环,针对序列的每一个元素执行一次循环体(列表、字符串、元组都是序列)

2.3使用else语句
for 目标变量 in 序列对象:
    语句块
else:
    语句

①序列的所有元素都被访问后,执行else语句
②若因为执行了break语句而退出,则不会执行else语句(循环体执行过一次)
③若最后一个元素不符合要求,也相当于所有元素被访问,依然会执行else语句
②:
在这里插入图片描述

①、③:
在这里插入图片描述

2.4range()内置函数
2.4.1一般形式

range([start,]end[,step])([]表示可省)
start默认值为0;step默认值为1;不包含end

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

>>> for i in range(2,4):
	print(i)
2
3

>>> for i in range(2,20,3):
	print(i)
2
5
8
11
14
17
求1+2+……+100
sum=0
for i in range(1,101):
    sum+=i
print("sum=%d"%sum)

(二)循环语句的嵌套

例1 金字塔*图形打印

不换行处理:print("*",end="")
换行操作:print()

n=int(input())
for j in range(1,n+1):
    for i in range(1,2*j):
        print("*",end="")
    print()

运行结果:

9
*
***
*****
*******
*********
***********
*************
***************
*****************

n=int(input())
for j in range(1,n+1):
    for i in range(1,n-j+1):
        print(" ",end="")
    for i in range(1,2*j):
        print("*",end="")
    print()

运行结果:

9
        *
       ***
      *****
     *******
    *********
   ***********
  *************
 ***************
*****************

例2 九九乘法表打印

for j in range(1,10,1):
    for i in range(1,1+j,1):
        print("%d*%d=%2d "%(i,j,i*j),end="")
    print()

运行结果:

1*1= 1 
1*2= 2 2*2= 4 
1*3= 3 2*3= 6 3*3= 9 
1*4= 4 2*4= 8 3*4=12 4*4=16 
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25 
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 

例3 换硬币问题

题目:用一元钱换成一分、两分、五分的硬币共50枚的换币方案

设1分、2分、5分各i,j,k枚

i+j+k=50
i+2j+5k=100

方法1:三重循环132651次
for i in range(0,51):
    for j in range(0, 51):
        for k in range(0, 51):
            if i+j+k==50 and i+2*j+5*k==100:
                print(i,j,k)

运行结果:

0 50 0
3 46 1
6 42 2
9 38 3
12 34 4
15 30 5
18 26 6
21 22 7
24 18 8
27 14 9
30 10 10
33 6 11
36 2 12
方法2:两重循环2601次
for i in range(0,51):
    for j in range(0, 51):
        k=50-i-j
        if i+2*j+5*k==100:
            print(i,j,k)
方法3:改进的两重循环1071次

限定k的范围

for k in range(0,21):
    for j in range(0, 51):
        i=50-k-j
        if i+2*j+5*k==100:
            print(i,j,k)
方法4:单重循环13次

i+j+k=50
i+2j+5k=100
等价于j+4k=50

for k in range(0,13):
    j=50-4*k
    i=50-j-k
    print(i,j,k)

算法的设计很重要!!!

(三)累加累乘问题

100个1相加

s=0
count=1
while count<=100:
    s+=1
    count+=1
print(s)

100个x相加

s=0
count=1
x=int(input())#输入一个整数,若为float,结果存在误差
while count<=100:
    s+=x
    count+=1
print(s)

100个x相乘

s=1
count=1
x=int(input())
while count<=100:
    s*=x
    count+=1
print(s)

n个x相乘

eval()的使用见链接二、1.1.2

s=1
count=1
x,n=eval(input())
while count<=n:
    s*=x
    count+=1
print(s)

前n项正整数相加

前100项相加见上2.4.1

s=0
x=1
n=int(input())
while x<=n:
    s+=x
    x+=1
print(s)

前n项正整数相乘,即n!

s=1
x=1
n=int(input())
while x<=n:
    s*=x
    x+=1
print(s)

1+3+5+…+n奇数相加

s=0
x=1
n=int(input())
while x<=n:
    s+=x
    x+=2
print(s)

1+1/3+1/5+1/7+…

s=0
x=1
while 1/x>=10**-6:
    s+=1/x  #Python3.6.8除法计算结果默认为浮点数
    x+=2
print(s)

π/4≈1-1/3+1/5-1/7+…

s=0
x=1
flag=1  #用于切换符号,一直为±1
while abs(flag/x)>=10**-6:#abs()为绝对值函数与math.fabs()效果相同
    s+=flag/x
    x+=2
    flag=-flag
print(s)

e≈1+1/1!+1/2!+1/3!+1/4!+…

①for语句,限定计算前n项,n越大结果越准确

s=1
k=1
n=int(input())
for i in range(1,n+1):
    s+=1/k
    k*=1+i
print(s)

②while语句,限定结束项小于10^(-m),m越大结果越准确

s=1
k=1
n=1
while abs(1/k)>=10**-18:
    s+=1/k
    k*=(n+1)
    n+=1
print(s)

泰勒级数sinx≈x-x^3/3! +x^5/5-…

s,k,n,flag=0,1,1,1
x=float(input())
while abs(flag*x**n/k)>=10**-18:
    s+=flag*x**n/k
    n+=2
    k*=n*(n-1)
    flag=-flag
print(s)

运行结果:

0.5235987755	#π/6
0.49999999991487076
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值