第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. 编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用回文形式写成的对联,既可顺读,也可倒读。例如:上海自来水来自海上)
- 程序执行结果如图:
def pdn(string):
list1 = list(string)
list2 = reversed(list1) # 这里 list2 不是列表
if list1 != list(list2): # 所以这里需用 list(list2) 来转列表
print('不是回文联!')
else:
print('是回文联!')
str1 = input('请输入一句话:')
pdn(str1)
1. 编写一个函数,分别统计出传入字符串参数(可能不只一个参数)的英文字母、空格、数字和其它字符的个数。
- 程序执行结果如图:
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 语法真简单方便!')
Python语言学习菜鸟 老家四川南充,来玩留言,嘻嘻
话说觉得这个主题难受的请下面评论