Day3----匿名函数、递归函数、类和对象

目录

一、匿名函数

1、基础知识

2、具体实现 

二、递归函数

1、基础知识

2、递归函数训练

题目1 [加强训练]

题干

有如下代码:

请问这段代码最终输出的值是多少?

训练目标

分清全局变量与局部变量

训练提示

全局变量与局部变量有什么区别

参考方案

对于在函数内部的变量,如果改变没有global声明的变量,那么相当于是重新定义了一个与全局变量同名的局部变量

题目2 [加强训练]

题干

有如下代码:

现在要调用abnum函数,但是怕在调用的时候将参数的位置传错,如何避免这个情况?写一段代码示范下

训练目标

关键字参数的使用

训练提示

题中已经给了现有的函数以及形参,但是要怎么才能保证实参能够一对一传入,不发生错误呢?

参考方案

明确要用关键字参数,来指定参数位置

操作步骤

在调用函数的时候,直接标明参数的值

参考答案

题目3 [加强训练]

题干

在填写个人资料时,如果选了女性,那么性别是女;如果不选性别,那就是默认是男,那么这个功能用函数怎么实现?

要求如下:定义一个函数gender,并在函数中将“所选性别为*”,并可以成功调用运行。

训练目标

练习缺省参数的使用,事实上缺省参数也是很常使用的

训练提示

在定义函数的时候,如何声明形参是缺省参数?

缺省参数的意义是什么呢?

参考方案

在声明函数时直接声明缺省参数。

缺省参数意味着,如果不传参数的话,那就按照默认的值来进行使用,并且程序不会报错。

操作步骤

参考答案

题目4 [加强训练]

题干

要求实现一段代码:

声明一个函数num,并且在调用函数的时候,不管输入多少个非关键字参数,函数都可以运行,且在函数内部还要把每个参数输出到屏幕上。

训练目标

不定长元组类型参数的使用

元组的遍历

训练提示

不定长参数有什么作用?

参考方案

在不确定参数的个数的时候,用不定长参数做形参,可以接受多个可以接受的参数。

操作步骤

定义一个函数num,形参为*args,然后在函数内部进行对元组遍历输出即可

参考答案

题目5 [综合训练]

题干

如下所示这是一个字典,{"name":"电脑","price":7000}

请定义这样一个函数num,讲上述字典中的键值对传入到函数num中,要求用不定长参数来接收,并在函数中打印键值对输出

输出格式为:

训练目标

不定长参数字典类型的使用 遍历字典

训练提示

字典类型的不定长参数的关键字什么?

调用函数时应如何传参?

如何对字典完成遍历并输出?

参考方案

​ 1.不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些

​ 2.传入关键字参数

​ 3.可以对字典的键,值,以及键值对进行遍历

操作步骤

不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些

遍历选择用dict.items()

调用时传入关键字参数,将键值对传入即可

参考答案

题目6 [综合训练]

题干

对于一个函数num,当调用nun(1,2,a=3,b=4)和调用num(3,4,5,6,a=1)以及num(a=1,b=2)的时候都可以正常运行,并且可以对元组以及字典类型进行遍历输出,对字典类型进行输出字典的键值对(形式为:key:a,value:1),

请写出这个函数并完成调用。

训练目标

元组类型不定长参数与字典类型不定长参数的混合使用

训练提示

当有元组以及字典两个不定长参数的时候,顺序要怎么放?如何传参?参数顺序有没有什么顺序?

参考方案

可以采用args与*kwargs两个形参

定义一个函数num,调用时将关键字参数放在最后面,其他参数放在前面在函

操作步骤

定义函数num时,参数顺序应该是*args,**kwargs

在函数内部分别执行遍历操作即可

参考答案

三、类和对象

1、基础知识

2、类添加和获取对象属性

3、魔法方法


一、匿名函数

1、基础知识

lambda 形参1,形参2,... : 表达式

不能用while、if

无参无返回值
lambda :函数代码

无参有返回值
lambda :1.txt+2

有参无返回值
lambda a,b.txt:函数代码

有参有返回值
lambda a,b.txt,c:a+b.txt

2、具体实现 

# 1.txt. 无参无返回值
def func1():
    print('hello')


(lambda: print('hello lambda'))()
func1()
f1 = lambda: print('hello lambda')
f1()


# 2. 无参有返回值
def func2():
    return 1 + 2


f2 = lambda: 1 + 2
print(f2())


# 3. 有参无返回值
def func3(name):
    print(name)


f3 = lambda name: print(name)
f3('hwllo')


# 4. 有参有返回值
def func4(*args):
    return args


f4 = lambda *args: args
print(f4(1, 2, 3, 4, 5))

# 匿名函数作为参数使用

# 四则运算
def my_cala(a,b,func):
    print('其他函数代码')
    num=func(a,b)
    print(num)


my_cala(10,20,lambda a,b:a+b)
my_cala(10,20,lambda a,b:a-b)
my_cala(10,20,lambda a,b:a*b)
my_cala(10,20,lambda a,b:a/b)

二、递归函数

1、基础知识

# 递归函数条件:函数自己嵌套调用本身,有一个终止条件


# A比B大2岁,B比C大2岁,.....,F年龄为18岁,求A年龄
def get_age(num):
    # 求第num个人的年龄=num-1个人的年龄+2
    if num==1:
        return 18
    age=get_age(num-1)+2
    return age

# 求阶乘
def jiecheng(num):
    if num==1:
        return 1
    result=jiecheng(num-1)*num
    return result

2、递归函数训练

题目1 [加强训练]

题干

有如下代码:

num = 10
def anum():
    num = 20
    
print(num)

请问这段代码最终输出的值是多少?

训练目标

  1. 分清全局变量与局部变量

训练提示

  1. 全局变量与局部变量有什么区别

参考方案

对于在函数内部的变量,如果改变没有global声明的变量,那么相当于是重新定义了一个与全局变量同名的局部变量

题目2 [加强训练]

题干

有如下代码:

def abnum(big, small, middle):
    .....#此处省略一千行代码

现在要调用abnum函数,但是怕在调用的时候将参数的位置传错,如何避免这个情况?写一段代码示范下

训练目标

关键字参数的使用

训练提示

  1. 题中已经给了现有的函数以及形参,但是要怎么才能保证实参能够一对一传入,不发生错误呢?

参考方案

  1. 明确要用关键字参数,来指定参数位置

操作步骤

  1. 在调用函数的时候,直接标明参数的值

参考答案

abnum(big=5, small=1, middle=1)

题目3 [加强训练]

题干

在填写个人资料时,如果选了女性,那么性别是女;如果不选性别,那就是默认是男,那么这个功能用函数怎么实现?

要求如下:定义一个函数gender,并在函数中将“所选性别为*”,并可以成功调用运行。

训练目标

  1. 练习缺省参数的使用,事实上缺省参数也是很常使用的

训练提示

  1. 在定义函数的时候,如何声明形参是缺省参数?

  2. 缺省参数的意义是什么呢?

参考方案

  1. 在声明函数时直接声明缺省参数。

  2. 缺省参数意味着,如果不传参数的话,那就按照默认的值来进行使用,并且程序不会报错。

操作步骤

参考答案

def gender(g="男"):
	print("您的性别是:"+g)
gender()
# 经过上述例子以及代码,是不是说明我们的缺省参数是可以缺少可以省去的?

题目4 [加强训练]

题干

要求实现一段代码:

声明一个函数num,并且在调用函数的时候,不管输入多少个非关键字参数,函数都可以运行,且在函数内部还要把每个参数输出到屏幕上。

训练目标

  1. 不定长元组类型参数的使用

  2. 元组的遍历

训练提示

  1. 不定长参数有什么作用?

参考方案

  1. 在不确定参数的个数的时候,用不定长参数做形参,可以接受多个可以接受的参数。

操作步骤

  1. 定义一个函数num,形参为*args,然后在函数内部进行对元组遍历输出即可

参考答案

def num(*args):
    for i in args:
        print(i)

题目5 [综合训练]

题干

如下所示这是一个字典,{"name":"电脑","price":7000}

请定义这样一个函数num,讲上述字典中的键值对传入到函数num中,要求用不定长参数来接收,并在函数中打印键值对输出

输出格式为:

key: name value: 电脑
key: price value: 700

训练目标

不定长参数字典类型的使用 遍历字典

训练提示

  1. 字典类型的不定长参数的关键字什么?

  2. 调用函数时应如何传参?

  3. 如何对字典完成遍历并输出?

参考方案

​ 1.不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些

​ 2.传入关键字参数

​ 3.可以对字典的键,值,以及键值对进行遍历

操作步骤

  1. 不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些

  2. 遍历选择用dict.items()

  3. 调用时传入关键字参数,将键值对传入即可

参考答案

def num(**kwargs):
    for key,value in kwargs.items():
        print("key:",key,"value:",value)
num(name="电脑", price=700)

题目6 [综合训练]

题干

对于一个函数num,当调用nun(1,2,a=3,b=4)和调用num(3,4,5,6,a=1)以及num(a=1,b=2)的时候都可以正常运行,并且可以对元组以及字典类型进行遍历输出,对字典类型进行输出字典的键值对(形式为:key:a,value:1),

请写出这个函数并完成调用。

训练目标

元组类型不定长参数与字典类型不定长参数的混合使用

训练提示

  1. 当有元组以及字典两个不定长参数的时候,顺序要怎么放?如何传参?参数顺序有没有什么顺序?

参考方案

  1. 可以采用args与*kwargs两个形参

  2. 定义一个函数num,调用时将关键字参数放在最后面,其他参数放在前面在函

操作步骤

  1. 定义函数num时,参数顺序应该是*args,**kwargs

  2. 在函数内部分别执行遍历操作即可

参考答案

def num(*args, **kwargs):
    for i in args:
        print(i)
    for key,value in kwargs.items():
        print("key:",key,"value:",value)
num(1,2,3,a=1, b=2)
# num(a=1.txt, b.txt=2)  此种情况也可

三、类和对象

1、基础知识

编程思想:对待同一个问题,解决问题的方式
    面向过程: 函数
    面向对象: 封装、继承、多态
面向对象:
    当实现ige功能时,看重的不是过程和步骤,而是关心谁帮我做这件事
类: 泛指的,指代多个。由对象抽象而来
    模型
    属性、行为
    class
对象:特指的,指代一个。具体存在的事物
     模具
     由类创建

类的组成:类名
        类属性:特性、变量
        类方法:行为、函数
类的抽象:名词提炼法、所见即所得
类的定义:
object:所有类的基类,最初始的类
 class 类名(object):  大驼峰命名规范
    代码
class Dog(object):
class Dog():
class Dog:

新式类:直接或间接继承object,python3中默认继承object,都是新式类
类与类直接两个空行
类中定义的函数叫方法
创建对象: 变量=类名()
调用方法:对象.方法名()

2、类添加和获取对象属性

类外部添加和获取对象属性
class Dog:
    def play(self):
        print('小狗快乐拆家中...')
    pass

# 创建对象: 变量=类名()
dog=Dog()
# 调用方法:对象.方法名()
dog.play()
# 对象添加属性 对象.属性名=属性值
dog.name='大黄'
dog.age=2
# 获取属性值 对象.属性名
print(dog.name)
# 修改属性值 与增添一样,存在就修改,不存在就添加
dog.age=4
'''

'''
类内部使用self获取属性值
self 代表对象  形参的名字 通过对象调用方法时,不需手动传递实参
class Dog:
    def play(self):
        print(f'小狗{self.name}快乐拆家中...')
    pass

dog=Dog()
dog.name='大黄'
dog.age=2
dog.play()
'''

3、魔法方法

魔法方法:两个下划线开头,两个下划线结尾,满足某种特定情况下会自动调用

__init__()的使用
调用时机:创建对象后立即调用
作用:给对象添加属性
传递init里的形参:类名(实参)
class Dog:
    def __init__(self,name,age):
        # 对象.属性名=对象.属性值
        self.name=name
        self.age=age
    def play(self):
        print(f'小狗{self.name}快乐拆家中...')
    pass

# 创建对象 类目(实参值)
dog=Dog('大黄',3)
print(dog.name)
print(dog.age)

__str__()的使用
调用时机:print(对象)自动调用,结果为次方法返回值
        str(对象)将自定义对象转换为字符串时,自动调用此方法
方法必须返回一个字符串,只有一个self参数
没有定义时,使用print()、str()默认输出对象的引用地址
class Dog:
    def __init__(self,name,age):
        # 对象.属性名=对象.属性值
        self.name=name
        self.age=age
    def __str__(self):
        # 返回一个字符串
        return f'小狗的名字为{self.name},小狗的年龄为{self.age}'
    def play(self):
        print(f'小狗{self.name}快乐拆家中...')
    pass

# 创建对象 类目(实参值)
dog=Dog('大黄',2)
print(dog)
str_dog=str(dog)
print(str_dog)

__del__()的使用  析构函数
调用时机:对象在内存中被销毁或删除的时候(引用计数为0)
        程序代码运行结束,在程序运行过程中,创建的所有对象、变量被销毁
        使用__del__变量,将对象的引用计数变为0
引用计数:python内存管理的一种机制,指一块内存,有多少变量在引用
    当一个变量引用一块内存,引用计数+1
    当删除一个变量,引用计数-1
    当内存的引用计数为0,内存被删除,内存中的数据被销毁

__repr__()的使用  与__str__()类似,必须返回一个字符串

猜你喜欢

转载自blog.csdn.net/m0_46493223/article/details/126090800