FIsh论坛《零基础入门学习Python》| 第019讲:函数:我的地盘听我的 | 课后测试题及答案 -
0.下面的程序运行结果:
def next():
print('我在next()函数里……')
pre()
def pre():
print('我在pre()函数里……')
next()
输出结果:
我在next()函数里……
我在pre()函数里……
```python
1.这个函数有返回值吗?
```python
def hello():
print('Hellp Fishc!')
hello()
输出结果:
Hellp Fishc!
2.return的返回多个不同类型的值吗?
可以,返回值无个数限制,可用逗号分开多个任意类型的返回值
0个:返回None 1个:返回值就是值本身。
多个:返回值为元组
返回值
函数的返回值
1.什么是返回值:
返回值是一个函数的处理结果
2.为什么要有返回值
如果需要在程序中拿到函数的处理结果,做进一步的处理,则需要函数必须有返回值
3.函数返回值的应用:
函数的返回值用return定义
格式: return x
注意:1.return是一个函数结束的标志,可有多个return,但只要执行一次,函数就会结束运行
2.return的返回值五类型限制,可任意数据类型
3.返回值无个数限制,可用逗号分开多个任意类型的返回值
0个:返回None 1个:返回值就是值本身
多个:返回值为元组
4.不写return,默认会在最后return None
3.下面程序的输出结果是什么:
def fun(var):
var=1314
print(var,end='')
var=520
fun(var)
print(var)
输出结果:
1314520
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())
输出结果:
BabyI love you
global
想要更好的了解global关键字,首先要熟悉python的全局变量与局部变量的概念。global关键字的作用是可以申明一个局部变量为全局变量,下面看一下实例:
**全局变量:**定义在函数外的变量称之为全局变量,他的作用域范围为全局。
局部变量:定义在函数内部的变量称为局部变量,他的作用域范围为函数内,也就是出了函数外就无效
全局变量与局部变量两者的本质区别就是在于作用域
用通俗的话来理解的话,
全局变量是在整个py文件中声明,全局范围内都可以访问
局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了
如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全
无论你在函数内怎样改动这个函数的值,只有在函数内生效,对全局来说是没有任何影响的。也可以从侧面推测出,函数内定义的局部变量优先级大于全局变量。
global关键字:
如果真的想要在函数体内修改全局变量的值,就要使用global关键字,使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思:
def fun1():
global num1
num1 = 2
print("函数内修改后num1=", num1)
num1 = 1
print("初始num1=", num1)
fun1()
print("运行完函数后num1=", num1)
输出结果:
函数内修改后num1= 2
初始num1= 1
运行完函数后num1= 1
nonlocal关键字
关键字nonlocal,字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持
这个技能的好处应该是如果你内层函数需要引用到外部函数的局部变量时不用再定义一次,能节省点系统资源吧。
def fun():
num2=3
def fun2():
num2*=2
print("num2=",num2)
return fun2()
fun()
输出结果:
Traceback (most recent call last):
File "D:/PycharmProjects/pythonProject/venv/001.py", line 17, in <module>
fun()
File "D:/PycharmProjects/pythonProject/venv/001.py", line 14, in fun
return fun2()
File "D:/PycharmProjects/pythonProject/venv/001.py", line 11, in fun2
num2 *= 2
UnboundLocalError: local variable 'num2' referenced before assignment
使用global:
def fun():
global num2
num2 = 3
def fun2():
num2 *= 2
print("num2=", num2)
return fun2()
fun()
输出结果:
Traceback (most recent call last):
File "D:/PycharmProjects/pythonProject/venv/001.py", line 18, in <module>
fun()
File "D:/PycharmProjects/pythonProject/venv/001.py", line 15, in fun
return fun2()
File "D:/PycharmProjects/pythonProject/venv/001.py", line 12, in fun2
num2 *= 2
UnboundLocalError: local variable 'num2' referenced before assignment
如果这样使用global:
def fun():
global num2
num2 = 3
def fun2():
global num2
num2 *= 2
print("num2=", num2)
return fun2()
fun()
输出结果:
num2= 6
错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错(不信你试试)
这时候需要使用nonlocal关键字:
def fun():
num2 = 3
def fun2():
nonlocal num2
num2 *= 2
print("num2=", num2)
return fun2()
fun()
输出结果:
num2= 6
代码分析:
在函数的内部使用一个变量
遵循一个规则: 先在函数内部找 找到直接使用 如果找不到到函数外部找 如果还是找不到 就报错(由内到外)
函数内部对全局变量的值进行修改 global
标识下函数内部的num不是一个局部变量 而是对全局变量重新赋值
可以对全局变量的值进行修改
num = 10
def my_func():
# 标识下函数内部的num不是一个局部变量 而是对全局变量重新赋值
global num
# 可以对全局变量的值进行修改
num = 20
print("2", num)
my_func()
# 当打印的时候 必须打印的是 3, 20
print("3", num)
动动手
自己的代码:
方法一:(有错误待完善)
def reback():
str= input("请输入一句话:")
length=len(str)
for i in range(length):
if str[i]==str[(length-i)]
print("是回文联")
输出结果:
File "D:/PycharmProjects/pythonProject/venv/001.py", line 11
if str[i]==str[(length-i)]
^
SyntaxError: invalid syntax
方法二:(有错误待完善)
def reback():
str= input("请输入一句话:")
length=len(str)
for i in range(length):
#nonlocal str
str1=[]
str1=str1.append(str.pop())
if str1==str:
print("是回文联")
reback()
参考代码:
方法一:
def palindrome(string):
length=len(string)
last=length-1
length//=2
flag=1
for each in range(length):
if string[each]!=string[last]:
flag=0
last-=1
if flag==1:
return 1
else:
return 0
string=input('请输入一句话:')
if palindrome(string)==1:
print('是回文联!')
else:
print('不是回文联!')
palindrome(string)
输出结果:
请输入一句话:上海自来水来自海上
是回文联!
方法二:
def palindrome(string):
list1=list(string)
list2=reversed(list1)
print(type(list2))
if list1==list(list2):#list类型
return'是回文联!'
else:
return'不是回文联!'
print(palindrome('上海自来水来自海上'))
输出结果:
<class 'list_reverseiterator'>
是回文联!
def count(*param):
length = len(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('I love fish.com.', 'I lobe you,you love me.')
输出结果:
第1个字符串共有:英文字母12个,数字0个,空格0个,其他字符4个。
第2个字符串共有:英文字母17个,数字0个,空格0个,其他字符6个。
* 用于函数形参
python函数传递参数的方式有两种:
位置参数(positional argument)
关键词参数(keyword argument)
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
*args 表示任何多个无名参数,它本质是一个 tuple
**kwargs 表示关键字参数,它本质上是一个 dict
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
>>> def fun(*args, **kwargs):
... print('args=', args)
... print('kwargs=', kwargs)
...
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
args= (1, 2, 3, 4)
kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}