1. 实参的类型
1.1 实参可以接受任何类型的数据
实参可以接受任何类型的对象,包括整数,字符串,布尔值,甚至函数。调用函数的时候,但解析器是不会检查实参的类型的,所以传递的时候要自己检查合法性。
可以看到前两个参数都是很好的运行了,后面的字符串实不能和整数运算的,但是在传入函数的时候并没有报错。
1.2 在形参中重新赋值不会影响其他变量
调用函数把c=20传入时,输出是20.
现在更改了形参的值,再次将实参c=20传入的时候,发现输出的仍然是形参的值,对其他变量并没有影响。
1.3 用函数修改列表
将实参传入一个列表看结果
将形参设置一下,再将实参c=[1,2,3]传入,发现列表指向的对象被改变了。
这就相当于用设置一个函数修改了列表。就是说,当函数执行的形参是一个对象时,当我们通过形参去修改对象时,会影响到所有指向该对象的变量。
可以看到,形参a和实参c是指向同一个对象的。
2. 不定长参数
在定义函数的时候,在形参前加上一个*这个形参就可以获取所有的实参。
在没有对形参进行设置的情况下,我们看到调用函数的时候结果是一个空的元组。
那我们就可以在这个元组里面装一些东西进去。
可以看到,*a会接受所有的实参,并且保存到一个元组当中。
2.1 这样我们可以对元组中的数据进行遍历操作,如:
2.2 注意,带*号的形参只能有一个
且一般带*号的形参放在其他参数的后面。如果放在其他会位置,那其他的形参要用关键字设置。
如下面,放在其他位置,而且其他形参没有用关键字设置,就会报错。
像下面这样在传递时设置关键字就可以了。
不定长参数不一定都放在后面,但是后面的参数都要用关键字传递。
2.3 **形参可以接受其他关键字参数
**形参可以接受其他关键字参数,它可以将这些参数保存到一个字典当中。key就是参数的名字,字典的value就是参数的值。并且 这种形参只能写在所有参数的后面。
3. 函数的返回值
3.1 return语句后面的代码都不会执行
例题:
用return语句,return后面的代码都不会执行,函数自动结束运行。
3.2 return语句给函数设置返回值
这次函数有返回值,返回值是r=fn4(1,2,3)的值。
3.3 help()调用函数文档
定义一个函数后,英文状态下三个单引号加回车,可以给函数添加说明文本。如:
3.4 变量的作用域
在函数内部定义的变量只能在函数内部使用,如果在函数外部使用会报错:变量没有被定义
如果我该了内部变量,外部变量不会受影响。
如果我们想在函数内部定义一个变量,并且希望它在函数外部也能用,则需要用到global关键字
总结,如果函数内部嵌套函数,那么在函数内的变量的作用域规律是,可以从内往外看,但不能从外往内看。意思就是,某个函数外部的变量可以被函数使用,但是函数内部定义的变量,在函数外部却不能使用。有个同学总结的好“内部的自己用,外部的,大家用”。如果内部的要大家用,就要用global关键字声明一下,这样就可以共享。
4. 递归函数
4.1 求阶乘的例子
求10的阶乘,一般是这样的:
print(1*2*3*4*5*6*7*8*9*10)
结果:
这样如果求大的数的阶乘就麻烦了。
我们写个代码来解决:
def fn():
n = 10
for i in range(1,10):
n*=i # n=i*n
print(n)
fn()
结果:
3628800
现在我们定义一个求任意数阶乘的函数:
可以看到设置一个形参就解决问题了。调用函数的时候,再把想求阶乘的数当作实参传入,这里我传入的是10,结果一样。
4.2 递归思想
把之前的求阶乘的函数也可以这样写在下面备用:
def fn(n):
# n 为我们要求阶乘的数
result=n 为我们要保存的结果
for i in range(1,10):
result*=i
return result
递归是一种解决问题的思想,他和循环很相似。如要给老故事:从前有座山,山里有座庙,庙里有个老和尚和三个小和尚,老和尚在讲故事,讲什么故事呢?从前有座山,山里有座庙… …
递归式函数就是在函数中自己调用自己,将一个大问题变成若干小问题。
递归式函数需要满足两个条件:
- 基线条件:问题可以被分解成最小的问题,当满足基线条件时递归就不再执行了。
- 递归条件:就是可以将问题继续分解的条件。
4.3 我们用递归的方式求任意数的阶乘
10!=10*9!
9!=9*8!
8!=8*7!
... ...
找到这个规律,我们看到满足递归思想的两个条件,可以用递归思想解决。
def fn(n):
#参数n是要求阶乘的数字
#1. 基线条件
if n == 1:
return 1
#2. 递归条件
# 10!=9*8!
return n*fn(n-1)
fn(10)
结果:
5. 作业
5.1 写博客梳理课堂知识
5.2 课堂代码敲三遍
5.3 定义一个函数
定义一个函数用来识别一个字符串是否为回文字符串,如果不是返回False,是返回True。
注释:会问字符串:如TNT是一个回文字符串,正反读都一样。
5.3 .1 作业答案
def fn():
g=0
a=input('请输入一个字符串:')
r1=len(a)
for i in range(r1):
if a[i]!=a[r1-i-1]:
g=1
if g==0:
print('该字符串是回文字符串')
else:
print('该字符串不是回文字符串')
fn()
5.3 .1 老师的答案
def fn(s):
#s为要判断的字符串
n=len(s)
if n<2:
return True
elif s[0]!=s[-1]:
return False
return fn(s[1:-1]