函数的代码和复用

文章目录

  • 一、函数的理解和定义
  • 二、代码的复用与函数递归
  • 习题巩固

一、函数的理解和定义

1.熟悉函数的使用及调用过程
2.熟悉函数的参数传递
3.熟悉局部变量和全局变量
4.了解lambda匿名函数

函数的理解和定义

​ ·函数是一段具有特定功能的、可重复的语句组

​ ·函数是一种功能的抽象,一般函数表达特定功能

​ ·函数定义时,所指定的参数是一种占位符,定义后,如果不调用,不会被执行

"""
def <函数名>(<参数(0个或多个)>):
			<函数体>

"""
#定义一个函数实现整数的幂运算,用以计算 x 的 n 次方。

def computer(x,n):
    return pow(x,n)

a,b=map(int,input().split())
print(computer(a,b))

函数的调用

def computer(x,n):#函数定义
    return pow(x,n)#函数调用后得返回值

a,b=map(int,input().split())
print(computer(a,b))#computer函数调用

函数参数传递

  • 函数可以有参数,也可以没有,但必须保留括号
"""
def <函数名>():
	<函数体>
	return <返回值>
"""
def  f():
    print("test")
  • 函数定义时可以为某些参数指定默认值,构成可选参数
"""
def <函数名>(<非可选参数>,<可选参数>):
	<函数体>
	return <返回值>
"""
def fact(n,m=1):#m=1 可选参数
    s=1
    for i in range(1,n+1):
        s*=i
    return s//m

>>>fact(10)
3628800
>>fact(10,5)
725760
  • 可变参数传递:函数定义时可以设计可变数量参数,即不确定参数总量
"""
def <函数名>(<参数>,*b):
	<函数体>
	return <返回值>
"""

def fact(n,*b):
    s=1
    for i in range(1,n+1):
        s*=i
    for item  in b:
        s*=item 
    return s

>>>fact(10,3)
10886400
>>>fact(10,3,5,8)
435456000	
  • 参数传递的两种方式,位置传递、名称传递
def fact(n,m):
    s=1
    for i in range(1,n+1):
        s*=i
    for item  in b:
        s*=item 
    return s

>>>fact(10,3)#位置传递
10886400
>>>fact(m=10,n=3)#名称传递

函数返回值

  • ​ return保留字用来传递返回值

  • ​ 函数可以有返回值,也可以没有,可以有return,也可以没有

  • ​ return可以返回0个返回值,也可以返回任意多个返回值(返回时一个元组类型)

局部变量和全局变量

​ 规则1:局部变量和全局变量是不同变量

  • ​局部变量是函数内部的占位符,与全局变量可能重名但不同
  • 函数运算结束后,局部变量被释放
  • 可以使用global 保留字在函数内部使用全局变量
n,s=10,100
def fact(n):
    s=1#局部变量s
    for i in range(1,n+1):
        s*=i
    return s#此时是局部变量运算的结果3628800
print(fact(n),s)#此时是局部变量返回值3628800和全局变量s=100



n,s=10,100
def fact(n):
    global s#此时s是全局变量
    for i in range(1,n+1):
        s*=i
    return s#此处为全局变量
print(fact(n),s)#此时s为全局变量值

规则2:局部变量为组合数据类型且未创建,等于全局变量

ls=["a","b"]
def func(a):
    ls.append(a)
    return
func("c")#全局变量被修改
print(ls)# ls=["a","b","c"]

ls=["a","b"]
def func(a):
    ls=[]#ls是局部变量
    ls.append(a)
    return
func("c")
print(ls)# ls=["a","b"]

lambda函数

  • lambda函数是一种匿名函数,即没有名字的函数
  • 使用lambda保留字定义,函数名是返回结果
  • lambda函数用于定义简单的、能够在一行内表示的函数
"""
<函数名>=lambda <参数>:<表达式>

等价于

def <函数名>(<参数>):
	函数体
	return <返回值>
"""

二、代码的复用与函数递归

1.了解代码复用和模块化设计
2.理解函数递归

代码复用

  • 代码资源化:程序代码是一种用来表达计算的资源
  • ​ 代码抽象化:使用函数等方法对代码赋予更高级别的定义
  • ​ 代码复用:同一份代码在需要的时候可以被重复使用

模块化设计

  • ​ 通过函数或对象封装将程序划分为模块及模块间的表达
  • ​ 具体包括:主程序、子程序和子程序间关系
  • ​ 分而治之:分层抽象、体系化的设计思想

函数递归的理解

​函数定义中调用函数自身的方式

​ 两个关键特征

  • 链条:计算过程存在链条

  • 基例:存在一个或多个不需要再次递归的基例

"""

斐波那契数列	
f(n)={
1 n=1
1 n=2
f(n-1)+f(n-2) otherwise }
"""

def f(n):#函数+分支
    if n==1 or n==2:
        return 1		#递归基例
    else:
        return	f(n-1)+f(n-2) #链条

习题巩固

1.下面关于函数返回值的描述中,正确的是()

​ A python函数的返回值使用很灵活,可以没有返回值,可以一个或多个返回值

​ B函数定义中最多含有一个return语句

​ C 在函数定义中使用return语句时,至少给一个返回值

​ D 函数只能通过print语句和return语句给出运行结果

2.以下关于函数优点的描述中,正确的是()

​ A 函数可以表现程序的复杂度

​ B 函数可以使程序更加模块化

​ C 函数可以减少代码多次使用

​ D 函数便于书写

3.以下关于Python函数的描述中,错误的是()

​ A Python程序的main函数可以改变其他名称

​ B 如果Python程序包含一个函数main(),这个函数与其它函数地位相同

​ C Python程序可以不包含main函数

​ D Python程序需要包含一个主函数且只能包含一个主函数

4.函数定义了3个参数,其中2个参数都指定了默认值,调用函数时参数个数最少是()

A 0

B 2

C 1

D 3

5.关于以下代码的描述中,正确的是()

def func(a,b):
    c=a**2+b
    b=a
    return c
a=10
b=2
c=func(b,a)+a

​ A 执行该函数后,函数c的值为112

​ B 该函数名称为fun

​ C 执行该函数后,变量b的值为2

​ D 执行该函数后,变量b的值为10

6.关于Python全局变量和局部变量的描述中,错误的是()

​ A 局部变量在使用后立刻被释放

​ B 全局变量一般没有缩进

​ C 全局变量和局部变量的命名不能相同

​ D 一个程序中的变量包含两类:全局变量和局部变量

7.以下的函数定义中,错误的是()

​ A def vfunc(s,a-1,*b)

​ B def vfunc(a=3,b)

​ C def vfunc(a,**b)

​ D def vfunc(a,b=2)

8.关于函数定义的描述,正确的是()

​ A 函数必须要有返回值

​ B 函数定义可以定义无限多个参数

​ C 函数定义的关键字是class

​ D 函数定义时默认值的参数是在非可选参数前面的

9.关于函数的定义与编写的描述,错误的是()

​ A 函数是代码复用的一种方式

​ B 在Python中,使用关键字define定义函数

​ C 定义函数时,即使函数不需要接收任何参数,也必须保留一对空括号来表示这个是个函数

​ D 编写函数时,一般建议先对参数进行合法性检查,然后进行编写

10.下面代码Dog这个类中的init方法共包含几个形参?

Class  Dog:
    def __init__(self,name,age):
        self.name=name
        self.age=age

A 0个

B 1个

C 2个

D 3个

答案 D

11.下面哪一种定义是类的私有成员()

A __xx

B xx

C__xxx

D xxx

一个下划线开头的是保护成员,两个下划线开头和结尾的是特殊成员,以两个和多个下划线开头并且不以两个或多个结尾的是私有成员

12.一个类继承另一个类,那么被继承的这个类称为()

A 超类

B 子类

C 类

D 继承类

13.Python中类定义中,对函数变量的访问形式为()

​ A <对象>.<变量>

​ B <对象>.方法(变量)

​ C <类名>.<变量>

​ D <对象>.方法

14.下面这条语句的输出结果是()

f=(lambda a="hello",b="python",c="world":a+b.split("o")[1]+c)
print(f("hi")

A hellopythonworld

B hipythworld

C hellonworld

D hinworld

15.关于递归函数,描述错误的是()

​ A 递归函数必须有一个明确的约束条件

​ B 递归函数就是一个函数在内部调用自身本身

​ C 递归效率不高,递归层次过多会导致栈溢出

​ D 每进入更深一层的递归时,问题规模相对于前一次是不变的

16.关于Python中实参和形参的说法错误的是()

​ A 在函数定义时的参数被称为形参,形参不是实际存在的变量

​ B 可选参数一般都放置在非可选参数的后面

​ C 实参必须是一个常量

​ D 形参存在的目的是用来接收调用函数时传入的实参


答案

  1. A 。 函数中return函数没有限制;函数也可以通过yield给出运行结果。
  2. B。 函数可以使程序更加模块化。
  3. D。 Python没有严格的主函数入口。
  4. C。三个参数,两个默认值,则调用函数参数最少为1个。
  5. C。 函数执行后c的值为24;函数名称func;b的值为2.
  6. C。 全局变量和局部变量的命名可以相同。
  7. B。 考查参数位置 <非可选参数> <可选参数>
  8. B。 函数可以定义任意个参数。
  9. B。 在Python中使用关键字def 定义函数
  10. D。 self、name、age 三个形参
  11. C。 一个下划线开头的是保护成员,两个下划线开头和结尾的是特殊成员,以两个和多个下划线开头并且不以两个或多个结尾的是私有成员
  12. A 。 一个类继承另一个类,那么被继承的这个类称为超类。
  13. A。 对函数变量访问形式 对象.变量
  14. D。 lambda函数的使用。a=hi b.split(“o”)[1]=n c=world 即D项
  15. D。 递归函数,更深一层,问题规模会增加。
  16. C。 实参没有要求,不一定是一个常量。

注:Python基础课件完整电子书版可添加下面微信获取

函数的代码和复用_第1张图片

你可能感兴趣的:(python,python)