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)   #输出;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')

运行结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值