1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > python学习027-----python之函数(三):函数返回值 局部变量与全局变量

python学习027-----python之函数(三):函数返回值 局部变量与全局变量

时间:2020-11-12 04:46:26

相关推荐

python学习027-----python之函数(三):函数返回值 局部变量与全局变量

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) #输出;Noneprint(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 * rateold_price = 88 #这里试图修改全局变量print('在函数内部修改后,old_price的值是:', old_price)return final_priceold_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 = 0for x in params:result = result + xnum = result * baseprint(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 % 10a = a // 10list1.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增加1print('该子字符串在目标字符串中共出现%d次!'%counts)str1 = input('请输入目标字符串;')str2 = input('请输入您要查找的字符串:')Findstr(str1, str2)

运行结果:

4.想一想:下面的程序会输出什么?

var = ' Hi '#初始化vardef 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 youfun3(var) #fun3()无返回值,此处无作用,var不变return var #返回Baby I love youdef fun3(var):var = '小甲鱼'print(fun1())

运行结果:

【警示】:不到万不得已,不要使用全局变量,原因如下:

1.代码可读性变差

2.代码安全性降低

5.编写一个函数

判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可以倒读。例如:上海自来水来自海上)

【方法一】

def palindrome(string):length = len(string)last = length - 1length = length // 2flag = 1for each in range(length):if string[each] != string[last]:flag = 0last = last -1if flag == 1:return 1else:return 0string = 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 = 0space = 0digit = 0others = 0for each in param[i]:if each.isalpha():letters += 1elif each.isdigit():digit += 1elif each == ' ':space += 1else:others += 1print('第%d个字符串有:英文字母%d个,数字%d个,空格%d个,其他字符%d个。'%(i+1,letters, digit, space, others))count('adsfasfasdf','水电 费剪短发卡机了33','3433241')

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。