【Python】2019年二级书编程练习(第五章 函数和代码复用 简例+习题)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/YWP_2016/article/details/102752877
'''
第5章:函数和代码复用
###函数定义
def <函数名> (可传多个参数逗号分隔,可选参数=默认值):
    函数体
    return 返回值列表

###函数调用
函数名(实际赋值参数列表)

1、return语句:若有,注意缩进,这也是函数的一部分;若无return语句,函数体结束后会将控制权返回给调用者(个人:尽量写return语句)
2、函数被调用(声明)才能发挥作用(调用≠输出可视化)
3、函数式编程:函数封装,代码复用→→→→→→模块化编程:将程序分割为短代码段,每一段实现一个功能(使用函数将程序划分为功能模块,并基于模块设计程序)。通过函数封装将程序划分为主程序、子程序和子程序间关系。
完成特定功能并经常被复用的一组语句应采用函数来封装,并尽量减少函数间参数和返回值的数量。

'''
#5.1.1定义一个对整数阶乘factorial的函数
#注意:函数被调用才能发挥作用(调用≠输出可视化)
def fact(n):
    s=1
    for i in range(1,n+1):
        s*=i
    print(s)
    return s
fact(5)
#建议直接print(fact(5))

#5.1.2 Python最小函数
#pass占位符不起任何作用,仅占位(因为函数内部总要编写一行代码)
def f():
    pass

#5.2.1 可选参数传递(例:两数相乘)
#参数在定义时可以指定默认值,当函数被调用时,若未传入对应的参数,则使用默认值替代
def multiply(x,y=10):
    x*y#相乘
    #x**y 乘方
    return x*y
print(multiply(5))#50
print(multiply(5,5))#25
print(multiply(y=2,x=5))#10

#5.2.1 return语句:用以结束函数并将程序返回到函数被调用的位置继续执行
#可以出现在函数的任何部分,同时将0/1/多个函数运算结果返回到函数被调用处的变量
#当return多个值时,这些值形成了元组
def multiply(x,y=10):
    return x*y,x**y
s=multiply(2)
print(s)#(20, 1024)

a,b=multiply(2,5)
print(a)#10
print(b)#32

#5.2.1 多个return + try-except
def manyreturn(x):
    try:
        if x>0:
            return x+1
        else:
            return x-1
    except:
        return 0
    
print(manyreturn(5))#6
print(manyreturn('fd'))#0

#5.3.1局部变量(例:两数相乘)
def multiply(x,y=10):
    z=x*y#函数内部的局部变量
    return z
s=multiply(2)
print(s)#20
#print(z) 报错NameError: name 'z' is not defined


#5.3.2全局变量(例:三数相乘)
n=2 #全局变量
def multiply(x,y):
    global n#全局变量若在函数内部使用,需要声明
    return n*x*y
s=multiply(1,3)
print(s)#6
#若未声明,即使名称相同也并非全局变量
#5.5——软文诗词风,输出结果如下图
txt='''宜言饮酒,与子偕老。
琴瑟在御,莫不静好。
'''
linewidth=30#预定的输出宽度

#分行
def lineSplit(line):
    plist=[',','。']
    for p in plist:#遍历text找标点符号,用换行符替代,并
        line=line.replace(p,'\n')
    return line.split('\n')
#split()方法:分隔符 分割字符串 返回列表;默认分隔符为所有空字符,包括空格、换行(\n)、制表符(\t)等

#输出
def linePrint(line):
    global linewidth #仍使用全局变量linewidth=30
    print(line.center(linewidth,chr(12288)))#居中显示
    #chr(12288)用空格解决中英文占位符不同的问题,参考https://blog.csdn.net/james_616/article/details/79004482

newlines=lineSplit(txt)#调用lineSplit函数
for newline in  newlines:#逐行调用linePrint函数
    linePrint(newline)

#第五章编程题

#1.实现isNum()函数,参数为一个字符串,如果这个字符串属于整数、浮点数或者复数的表示,则返回True,否则返回False
#注意:多重判断,多个return;eval(inputeval(input())在接收输入数字作为变量时非常好用
def isNum(str):
    str=type(str)
    if str==type(1):
        return True
    elif str==type(1.0):
        return True
    elif str==type(1+1j):
        return True
    else:
        return False
    return 0
str=eval(input("请输入你要检测的字符串:"))
n=isNum(str)
if(n):
    print("True")
else:
    print("False")

#2.实现isPrime()函数,参数为整数,要有异常处理。如果整数是质数(素数),返回True,否则返回False
#注意:异常处理;if(isPrime(n)): #即if(isPrime(n)==True)
def isPrime(n):
    if n<2:
        return False
    for i in range(2,int(n**0.5+1)):
        if n%i==0:
            return False
    return True

try:
    n=eval(input("请输入你要检测的数字:"))
    if(isPrime(n)):#即if(isPrime(n)==True)
        print("你所检测的数字是素数")
    else:
        print("你所检测的数字不是素数")
except:
    print("输入错误,请重新输入!")

#注意:好题!!!学分析过程,学着编
def times_func(str):
    a=b=c=d=0
    for i in range(len(str)):
        if (str[i]>='0') and (str[i]<='9'):
            a=a+1
        elif (str[i]>='a') and (str[i]<='z'):
            b=b+1
        elif (str[i]>='A') and (str[i]<='Z'):
            b=b+1
        elif str[i]==' ':
            c=c+1
        else:
            d=d+1
    print("字符串检测结果如下:")
    print("字符串中数字的个数为:",a)
    print("字符串中字母的个数为",b)
    print("字符串中空格的个数为",c)
    print("字符串中其他字符的个数为",d)

str=input("请输入字符串:")
times_func(str)

#4.编写一个函数,打印200以内的所有素数(质数),以空格分割。
#质数(素数):质数只能被1 或自己整除,并且一定要是大于1 的整数
#编了两个小函数,isPrime(n)函数用于判断是否为一个数是否为素数;times_fuc()函数用于输出0~200范围内的素数
def isPrime(n):
    if n<2:
        return False
    for i in range(2,int(n**0.5+1)):#质数(素数)的判断
        if n%i==0:
            return False
    return True

def times_fuc():
    for i in range(0,201):#0~200,含左不含右
        if(isPrime(i)):
            print(i,end='、')#以、分隔

times_fuc()

#5.编写一个函数,参数为一个整数n。利用递归获取斐波那契数列中的第n个数并且返回。
#斐波那契数列:从第3项开始,每一项都等于前两项之和 1, 1, 2, 3, 5, 8, 13, 21……表达式:F[n]=F[n-1]+F[n-2] (n>=3,F[1]=1,F[2]=1)
#由数学表达式编程,不难
def fib(n):
    if (n==1):
        return 1
    elif (n==2):
        return 1
    elif(n>2):
        return fib(n-1)+fib(n-2)
n=int(input("请输入数字:"))
print(fib(n))

#请输入数字:8 >>>21,即第8个数字为21

猜你喜欢

转载自blog.csdn.net/YWP_2016/article/details/102752877