函数-我的地盘听我的
测试题:
0. 下边程序会输入什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
有些编程语言不够 “聪明”,向这类向前引用的方式会导致报错,但Python足够 “醒目”,这段代码是正确的!
会输出:
我在next()函数里...
我在pre()函数里...
1. 请问以下这个函数有返回值吗?
>>> def hello():
print('Hello China!')
如果没有使用 return 语句指定返回值,Python 也不是什么都不返回的,Ta会返回一个 None 对象,所以我们说 Python所有的函数都有返回值
>>> def hello():
print('Hello China!')
>>> temp = hello()
Hello China!
>>> temp
>>> print(temp)
None
>>> type(temp)
<class 'NoneType'>
2. 请问 Python 的 return 语句可以返回多个不同类型的值吗?
可以,默认用逗号隔开,是以元组的形式返回,你当然也可以用列表包含起来返回:
>>> def myFun():
return '啦啦啦啦', 306, 3.14, True
>>> myFun()
('啦啦啦啦', 306, 3.14, True)
>>> def myFun2():
return ['小甲鱼', 1314, 5.12, False]
>>> myFun2()
['小甲鱼', 1314, 5.12, False]
>>>
3. 目测以下程序会打印什么内容?
def fun(var): # 创建fun(var)函数,一个形参
var = 1314 # 给形参赋值,成为实参
print(var, end = '') # 打印 var 实参,不换行
var = 520 # 定义变量,赋值 520
fun(var) # 调用fun(var)函数
print(var) # 打印变量 var
会打印:1314520
4. 目测以下程序会打印什么内容?
var = ' Hi ' # 定义变量,值为字符串
def fun1(): # 创建函数 fun1()
global var # 因为需要在函数内部对函数外的变量var进行操作,所以要在函数内部声明其为全局:global
var = ' China ' # 修改 var 变量的值
return fun2(var) # 返回函数 fun2()以及Ta的实参var
def fun2(var): # 创建函数 fun2(),形参为var
var += 'I love you' # 给形参赋值,成为实参,并且进行字符串拼接
fun3(var) # 调用函数fun(),以及Ta的实参
return var # 返回实参var
def fun3(var): # 创建函数 fun3(),形参为var
var = '小甲鱼' # 给形参赋值,成为实参
print(fun1()) # 调用函数fun1()并打印输出
会打印:
China I love you
我建议不到万不得已不要使用全局变量,简洁的概括为
:
(0) 代码可读性变差
(1) 代码安全性降低
以下关于全局变量的危言耸听是转来的,如下:
(0) Ta会造成不必要的常量频繁使用,特别当这个常量没有用宏定义 “正名” 时,代码阅读起来将万分吃力。
(1) 它会导致软件分层的不合理,全局变量相当于一条快捷通道,他容易使程序员模糊了 “设备层” 和 “应用层” 之间的边界。
写出来的底层程序容易自作多情地关注起上层地应用。
这在软件系统的构建初期的确效率很高,功能调试进度一日千里,但到了后期往往bug一堆,处处 “补丁”,雷区遍布。
说是度日如年举步维艰也不为过。
(2) 由于软件的分层不合理,到了后期维护,哪怕仅是增加修改删除小功能,往往要从上到下掘地三尺地修改,涉及大多数模块,而原有地代码注释却忘了更新修改,这个时候,交给后来维护者的系统会越来越像一个 “泥潭”,注释的唯一作用只是使 “泥潭” 上方再加一些迷烟瘴气。
(3) 全局变量大量使用,少不了有些变量流连忘返于中断与主回圈程序之间。
这个时候如果处理不当,系统的bug就是随机出现的,无规律的,这时候初步显示出病入膏肓的特征来了,没有大牛来力挽狂澜,注定慢性死亡。
(4) 无需多言,如果你的系统中大量使用全局变量,那么你已经成功得到一个畸形的系统,Ta处于一个神秘的稳定状态!你看着这台机器,机器也看着你,相对无言,心中发毛。
你不确定Ta什么时候会崩溃,也不晓得下一次投诉什么时候到来。
动动手:
0. 编写一个函数,判断传入的字符串参数是否为 “回文联”
(回文联即用回文形式写成的对联,即可顺读。例如:上海自来水来自海上)
程序执行结果:
>>>
请输入一句话:上海自来水来自海上
是回文联!
>>>
请输入一句话:啦啦啦操操操
不是回文联!
>>>
方法一:
def palindrome(string): # 创建回文联函数 palindrome(),形参为string
lenght = len(string) # 取出字符串长度
last = lenght - 1 # 定义变量,存放字符串长度减1
lenght //= 2 # 注意这里用地板除
flag = 1 # 定义变量标签,初始值 1
for each in range(lenght): # 将字符串的长度依次赋值给each
if string[each] != string[last]: # if判断,当字符串的长度不等于字符串的长度减1时
flag = 0 # 标签值为 0
last -= 1 # 此时长度减1
if flag == 1:
return 1 # 为真
else:
return 0 # 为假
string = input('请输入一句话:') # 用户输入一句话
if palindrome(string) == 1:
print('是回文联!')
else:
print('不是回文联!')
方法二:
def palindrome(string): # 创建回文联函数 palindrome(),形参为string
list1 = list(string) # 将形参转换成列表
list2 = reversed(list1) # 返回一个反转的列表迭代器
if list1 == list(list2): # if判断列表是否等于反转的列表迭代器时
return '是回文联!' # 是
else:
return '不是回文联' # 否
string = input('请输入一句话:') # 用户输入一句话
print(palindrome(string)) # 调用函数 palindrome(),此时形参string已经成为实参
1. 编写一个函数,分别统计出传入字符串参数(可能不止一个参数)的英文字母、空格、数字和其它字符的个数
程序执行结果:
count('I love China.com.', 'I love you, you love me.')
>>>
第 1 个字符串共有 : 英文字母 13 个 , 数字 0 个 , 空格 2 个 , 其他字符 2 个。
第 2 个字符串共有 : 英文字母 17 个 , 数字 0 个 , 空格 5 个 , 其他字符 2 个。
>>>
def count(*param): # 创建计数函数 count(),*param为收集参数
lenght = len(param) # 取出收集到的参数的长度
for i in range(lenght): # 将收集到的参数的长度依次赋值给 i
letters = 0 # 定义字母变量,初始值为 0
space = 0 # 定义空格变量,初始值为 0
digit = 0 # 定义数字变量,初始值为 0
others = 0 # 定义其他字符变量,初始值为 0
for each in param[i]: # 再将收集到的参数依次赋值给 each
if each.isalpha(): # if判断字符串是否由字母组成
letters += 1 # 是,则开始统计字母的个数
elif each.isdigit(): # elif判断字符串是否由数字组成
digit += 1 # 是,则开始统计数字的个数
elif each == ' ': # elif判断字符串是否由空格组成
space += 1 # 是,则开始统计空格的个数
else: # 否则属于其他字符组成
others += 1 # 开始统计其他字符的个数
# 打印提示,将字符串格式化输出
print('第 %d 个字符串共有 : 英文字母 %d 个 , 数字 %d 个 , 空格 %d 个 , 其他字符 %d 个。' % (i+1, letters, digit, space, others))
count('I love China.com.', 'I love you, you love me.') # 调用计数函数count(),给Ta加入实参