'''
第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)
![](https://i-blog.csdnimg.cn/blog_migrate/8c48c425081baecde232b137e15e3660.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bd8f0e80d6ba5ddeee70d4dbca99b661.png)
![](https://i-blog.csdnimg.cn/blog_migrate/944ade5ebb5ef9e714abeb882a604a37.png)
#第五章编程题
#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