第019讲:函数:我的地盘听我的

第019讲:函数:我的地盘听我的


测试题

0. 下边程序会输入什么?

def next():
    print('我在next()函数里...')
    pre()

def pre():
    print('我在pre()函数里...')
    
next()

>>> '我在next()函数里...'
    '我在pre()函数里...'
    # 这是函数嵌套,输入next()函数时,pre()函数是在next()函数里面的,所以会一起输出

1. 请问以下这个函数有返回值吗?

>>> def hello():
        print('Hello FishC!')
    # 如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta 会返回一个 None 对象,所以我们说 Python 所有的函数都有返回值。

2. 请问 Python 的 return 语句可以返回多个不同类型的值吗?

# 可以通过列表或元组返回多个不同类型的值
def temp():
    return [1,1.2,True,'你好'] # 列表形式返回
>>> [1,1.2,True,'你好']


# 或者
def temp():
    return 1,1.22,False,'世界'

>>> (1,1.22,False,'世界') # 元组形式返回

3. 目测以下程序会打印什么内容:

def fun(var):
    var = 1314
    print(var, end='')

var = 520
fun(var)
print(var)
1314
'''
因为先在全局空间定义了一个全局变量 var = 520

此时你调用定义的函数 func ,而 func 内对 var 进行重新赋值,会触发 Python 的屏蔽机制

暂时屏蔽 全局变量 var = 520 的值,在创建个局部变量 var 来接收此时的 1314 ,所以在函数此时调用 print 函数打印了 1314

出了函数后,局部变量 var 就被回收,而变回全局变量 var = 520 ,所以此时 print 打印了 var  为 520

因为前者的 print 函数有 end 参数设置为空字符,所以之前的 1314 打印没有换行,则 520 在和 1314 同行出现
'''
  • 关于全局变量的一些危害,转来的:
  • 它会造成不必要的常量频繁使用,特别当这个常量没有用宏定义“正名”时,代码阅读起来将万分吃力。
  • 它会导致软件分层的不合理,全局变量相当于一条快捷通道,它容易使程序员模糊了“设备层”和“应用层”之间的边界。写出来的底层程序容易自作多情地关注起上层的应用。这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处“补丁”,雷区遍布。说是度日如年举步维艰也不为过。
  • 由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有的代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个“泥潭”,注释的唯一作用只是使泥潭上方再加一些迷烟瘴气。
  • 全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。
  • 无需多言,如果您的系统中大量使用全局变量,那么您已经成功得到一个畸形的系统,它处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。你不确定它什么时候会崩溃,也不晓得下一次投诉什么时候道理。

4. 目测以下程序会打印什么内容?

var = ' Hi '

def fun1():
    global var
    var = ' Baby '
    return fun2(var)

def fun2(var):
    var += 'I love you'
    fun3(var)
    return var

def fun3(var):
    var = ' 小甲鱼 '

print(fun1())
'Baby I love you'

分析整个代码我们可以发现:

首先在全局声明了一个变量 var

接着定义函数 fun1() 并且将全局变量 var 代入函数域内(声明域内的 var 是全局变量)

然后将变量 var 改为 'Baby' ,函数 fun1() 返回的是 第二个定义函数 fun2(var) 的值。第二个定义的函数 fun2(var) 定义为 var -= 'I love you' 并且返回的是 var 的值。第三个函数 fun3(var) 定义为将变量 var 改变为 '小甲鱼'

我们最后运行的是 print(fun1()) ,但实际上已经定义好三个函数里面只引用了两个函数

即在函数fun1()内将全局变量声明并改变之后运行函数fun2(var)代入var进行函数过程并且得到最终返回值var,函数fun1()的返回值即是将函数fun1()过程后所得返回值代入函数fun2(var)过程之后所得的返回值。


动动手

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

  • 程序执行结果如图:

image

def pdn(string):
    list1 = list(string)
    list2 = reversed(list1)     # 这里 list2 不是列表
    if list1 != list(list2):    # 所以这里需用 list(list2) 来转列表
        print('不是回文联!')
    else:
        print('是回文联!')

str1 = input('请输入一句话:')
pdn(str1)

1. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。

  • 程序执行结果如图:

image

def count(*string):
    length = len(string)
    for i in range(length):
        chinese = 0
        letters = 0
        digit = 0
        space = 0
        others = 0
        for each in string[i]:  # string[i] 即当前循环的参数
            if each.isalpha():      # isalpha() 是判断是不是字母,isalpha()中,将汉字也视为英文字符
                if ord(each) in range(65,91) or ord(each) in range(97,123):     # 小写英文字母 ASCII 码是65~91,大写英文字母 ACSII 码是97~123,ord是返回()内的 ASCII 码值
                    letters += 1
                else:
                    chinese += 1
            elif each.isdigit():    # isdagit() 是判断是不是数字
                digit += 1
            elif each.isspace():    # isspace() 是判断是不是空格
                space += 1
            else:
                others += 1
        print('第%d个字符串共有:中文汉字 %d 个,英文字母 %d 个,数字 %d 个,空格 %d 个,其他字符 %d 个' % (i+1,chinese,letters,digit,space,others))
    # print(length


count('你好','hello world!','233,你真牛逼, python 语法真简单方便!')
posted @ 2021-06-06 18:04  田二爷  阅读(92)  评论(0编辑  收藏  举报