Python学习2020104(选择结构、循环结构)

    科技2022-07-14  116

    文章目录

    一、选择结构程序设计1.if语句1.1单分支结构例1 输出两个数中较大的数例2 输入三个整数x、y、z,把这三个数由小到大输出 1.2双分支结构例1 输出两个数中较大的数例2 判断给定的某一年是否是闰年例3 猜数字游戏 1.3多分支结构例1 输出分段函数值例2 判断键盘输入字符的类型(根据ASCII码) 2.if语句的嵌套例 出租车收费问题 二、循环结构程序设计(一)循环语句1.while语句1.1纯while语句1.1.1一般形式1.1.2执行过程1.1.3特点例 求1+2+……+100 1.2while语句中使用else子句1.2.1一般形式 2.for语句2.1一般形式2.2执行过程2.3使用else语句2.4range()内置函数2.4.1一般形式求1+2+……+100 (二)循环语句的嵌套例1 金字塔*图形打印例2 九九乘法表打印例3 换硬币问题方法1:三重循环`132651次`方法2:两重循环`2601次`方法3:改进的两重循环`1071次`方法4:单重循环`13次` (三)累加累乘问题100个1相加100个x相加100个x相乘n个x相乘前n项正整数相加前n项正整数相乘,即n!1+3+5+...+n奇数相加1+1/3+1/5+1/7+...`π/4`≈1-1/3+1/5-1/7+...`e`≈1+1/1!+1/2!+1/3!+1/4!+...`泰勒级数sinx`≈x-x^3/3! +x^5/5-...

    一、选择结构程序设计

    分支结构

    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=- "%(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
    Processed: 0.011, SQL: 8