函数中(参数类型+返回值+递归函数)2020-11-16

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]

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46738467/article/details/109718412