1.函数的返回值
1) 过程(procedure)是简单、特殊并且无返回值的;
2) 函数(Function)是有返回值的。
python严格来说,只有函数,没有过程。当没有写返回值时,python函数默认返回None。举例说明:
def hello():
print('Hello World')
temp = hello() #由于这里调用了hello()函数,故输出:Hello World
#此时,看似hello的运行结果'Hello World'已经被赋给了temp,实际上
#temp是空的。
print(temp) #输出;None
print(type(temp)) #输出;<class 'NoneType'>
#因为hello()函数没有返回值,所以函数执行完并没有返回任何东西。
3) python是可以同时返回多个类型的值的。
def back():
return [1, 3.14, 'python']
print(back()) #输出:[1, 3.14, 'python']
注意:一般返回值用逗号隔开时,默认是以元组的形式返回的。加上了中括号就以列表的形式返回。
2.局部变量和全局变量
关于全局变量和局部变量的概念很好理解,不再赘述。这里只以一个程序为例来说明:
def discounts(price, rate):
final_price = price * rate
old_price = 88 #这里试图修改全局变量
print('在函数内部修改后,old_price的值是:', old_price)
return final_price
old_price = float(input('请输入原价:'))
rate = float(input('请输入折扣率:'))
new_price = discounts(old_price, rate)
print('在函数外部打印的old_price的值是:', old_price)
print('打折后价格是:', new_price)
运行结果:
值得注意的是,将局部变量名定义得和全局变量一样是一种很不可取的行为
3.思考与练习
下面来讲解几个例子,以及一些思考:
1.编写一个符合下列要求的函数:
a)计算机打印所有参数的和乘以基数(base=3)的结果
b)如果参数中最后一个参数为(base=5),则设定基数为5,基数不参与求和计算
print('*' * 25)
def counts(*params, base = 3):
result = 0
for x in params:
result = result + x
num = result * base
print(num)
counts(1,2,3,4,5, base = 5)
运行结果:
2.寻找自幂数
如果一个3位数等于其各位数字的立方和,则这个数被称为水仙花数。例如153=1^3+5^3+3^3,因此153是一个水仙花数。同理,如果一个4位数等于其各位数字的4次方和,则这个数被称为四叶玫瑰数。例如1634=1^4+6^4+3^4+4^4,因此1634是一个四叶玫瑰数。符合上面这种规律的都叫做自幂数。
def Find(x1, x2):
list2 = []
for a in range(x1, x2):
CopyNum = a #CopyNum是用来和result(即每位数的立方和)做比较的。相同即是水仙花数。由于a在循环中会发生变化,所以在循环外先复制了a,以便在循环结束后能与result比较。
list1 = []
while a>=10: #当a>=10时,说明该数还没有除到个位上,应继续循环。【注意!】如果这里没有加等号(a>10),则程序会把‘1001’拆成[10、0、1],从而导致计算错误
b = a % 10
a = a // 10
list1.append(b)
list1.append(a) #别忘了除到最后a<10时,a为原来的最高位,也要放到list1中,不然拆开的数会缺最高位
list1.reverse() #列表中的数是由最低位排到最高位的,这里翻转,由最高位排到最低位,符合正常的阅读习惯
result = 0
length1 = len(list1)
for x in list1:
result = result + x**length1 #计算幂次方和
if result == CopyNum: #如果幂次方和result等于最开始输入的a(CopyNum是a的副本),则为自幂数。
list2.append(result)
print('该范围内共有%d个自幂数,分别为:' %len(list2))
print(list2)
max_num = int(input('请输入寻找自幂数的范围:'))
Find(0, max_num)
运行结果:
3.编写一个函数findstr()
该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为:"You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.",子字符串为:"im",函数执行后打印"子字符串在目标字符串中共出现3次"。
def Findstr(str1, str2): #str1为目标字符串,str2为要寻找的字符串
counts = 0
length = len(str1)
for x in range(length-1): #遍历目标字符串每一个字符
if (str1[x] == str2[0])and(str1[x+1] == str2[1]): #如果目标字符串中出现与子字符串匹配的字符串
counts = counts + 1 #counts增加1
print('该子字符串在目标字符串中共出现%d次!'%counts)
str1 = input('请输入目标字符串;')
str2 = input('请输入您要查找的字符串:')
Findstr(str1, str2)
运行结果:
4.想一想:下面的程序会输出什么?
var = ' Hi ' #初始化var
def fun1():
global var #global关键字可以在局部作用域中修改全局变量
var = ' Baby ' #此处var = 'Baby'
return fun2(var) #fun1()的返回值为fun2(baby)(即Baby I love you)
def fun2(var):
var += 'I love you' #此处var = Baby I love you
fun3(var) #fun3()无返回值,此处无作用,var不变
return var #返回Baby I love you
def fun3(var):
var = '小甲鱼'
print(fun1())
运行结果:
【警示】:不到万不得已,不要使用全局变量,原因如下:
1.代码可读性变差
2.代码安全性降低
5.编写一个函数
判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可以倒读。例如:上海自来水来自海上)
【方法一】
def palindrome(string):
length = len(string)
last = length - 1
length = length // 2
flag = 1
for each in range(length):
if string[each] != string[last]:
flag = 0
last = last -1
if flag == 1:
return 1
else:
return 0
string = input('请输入一句话:')
if palindrome(string) == 1:
print('是回文联!')
else:
print('不是回文联!')
【方法二】这个方法比方法一简单很多!
def palindrome(string):
list1 = list(string)
list2 = reversed(list1) #reversed()的用法见class17序列的130行
if list1 == list(list2):
print('是回文联!')
else:
print('不是回文联!')
string = input('请输入一句话1:')
palindrome(string)
运行结果:
6.编写一个函数
分别统计出传入字符串参数(可能不止一个参数)的英文字母、空格、数字和其他字符的个数。
def count(*param):
length = len(param) #统计有几个参数,注意,此处的param是个列表
for i in range(length):
letters = 0
space = 0
digit = 0
others = 0
for each in param[i]:
if each.isalpha():
letters += 1
elif each.isdigit():
digit += 1
elif each == ' ':
space += 1
else:
others += 1
print('第%d个字符串有:英文字母%d个,数字%d个,空格%d个,其他字符%d个。'%(i+1,letters, digit, space, others))
count('adsfasfasdf','水电 费剪短发卡机了33','3433241')
运行结果: