目录
对于在函数内部的变量,如果改变没有global声明的变量,那么相当于是重新定义了一个与全局变量同名的局部变量
现在要调用abnum函数,但是怕在调用的时候将参数的位置传错,如何避免这个情况?写一段代码示范下
题中已经给了现有的函数以及形参,但是要怎么才能保证实参能够一对一传入,不发生错误呢?
在填写个人资料时,如果选了女性,那么性别是女;如果不选性别,那就是默认是男,那么这个功能用函数怎么实现?
要求如下:定义一个函数gender,并在函数中将“所选性别为*”,并可以成功调用运行。
缺省参数意味着,如果不传参数的话,那就按照默认的值来进行使用,并且程序不会报错。
声明一个函数num,并且在调用函数的时候,不管输入多少个非关键字参数,函数都可以运行,且在函数内部还要把每个参数输出到屏幕上。
在不确定参数的个数的时候,用不定长参数做形参,可以接受多个可以接受的参数。
定义一个函数num,形参为*args,然后在函数内部进行对元组遍历输出即可
如下所示这是一个字典,{"name":"电脑","price":7000}
请定义这样一个函数num,讲上述字典中的键值对传入到函数num中,要求用不定长参数来接收,并在函数中打印键值对输出
1.不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些
不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些
当有元组以及字典两个不定长参数的时候,顺序要怎么放?如何传参?参数顺序有没有什么顺序?
定义一个函数num,调用时将关键字参数放在最后面,其他参数放在前面在函
定义函数num时,参数顺序应该是*args,**kwargs
一、匿名函数
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)
请问这段代码最终输出的值是多少?
训练目标
-
分清全局变量与局部变量
训练提示
-
全局变量与局部变量有什么区别
参考方案
对于在函数内部的变量,如果改变没有global声明的变量,那么相当于是重新定义了一个与全局变量同名的局部变量
题目2 [加强训练]
题干
有如下代码:
def abnum(big, small, middle):
.....#此处省略一千行代码
现在要调用abnum函数,但是怕在调用的时候将参数的位置传错,如何避免这个情况?写一段代码示范下
训练目标
关键字参数的使用
训练提示
-
题中已经给了现有的函数以及形参,但是要怎么才能保证实参能够一对一传入,不发生错误呢?
参考方案
-
明确要用关键字参数,来指定参数位置
操作步骤
-
在调用函数的时候,直接标明参数的值
参考答案
abnum(big=5, small=1, middle=1)
题目3 [加强训练]
题干
在填写个人资料时,如果选了女性,那么性别是女;如果不选性别,那就是默认是男,那么这个功能用函数怎么实现?
要求如下:定义一个函数gender,并在函数中将“所选性别为*”,并可以成功调用运行。
训练目标
-
练习缺省参数的使用,事实上缺省参数也是很常使用的
训练提示
-
在定义函数的时候,如何声明形参是缺省参数?
-
缺省参数的意义是什么呢?
参考方案
-
在声明函数时直接声明缺省参数。
-
缺省参数意味着,如果不传参数的话,那就按照默认的值来进行使用,并且程序不会报错。
操作步骤
参考答案
def gender(g="男"):
print("您的性别是:"+g)
gender()
# 经过上述例子以及代码,是不是说明我们的缺省参数是可以缺少可以省去的?
题目4 [加强训练]
题干
要求实现一段代码:
声明一个函数num,并且在调用函数的时候,不管输入多少个非关键字参数,函数都可以运行,且在函数内部还要把每个参数输出到屏幕上。
训练目标
-
不定长元组类型参数的使用
-
元组的遍历
训练提示
-
不定长参数有什么作用?
参考方案
-
在不确定参数的个数的时候,用不定长参数做形参,可以接受多个可以接受的参数。
操作步骤
-
定义一个函数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.不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些
2.传入关键字参数
3.可以对字典的键,值,以及键值对进行遍历
操作步骤
-
不定长参数关键字没有固定的关键字,但是一般用 **kwargs多一些
-
遍历选择用dict.items()
-
调用时传入关键字参数,将键值对传入即可
参考答案
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),
请写出这个函数并完成调用。
训练目标
元组类型不定长参数与字典类型不定长参数的混合使用
训练提示
-
当有元组以及字典两个不定长参数的时候,顺序要怎么放?如何传参?参数顺序有没有什么顺序?
参考方案
-
可以采用args与*kwargs两个形参
-
定义一个函数num,调用时将关键字参数放在最后面,其他参数放在前面在函
操作步骤
-
定义函数num时,参数顺序应该是*args,**kwargs
-
在函数内部分别执行遍历操作即可
参考答案
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__()类似,必须返回一个字符串