第二周Python学习小结

一、函数的定义和调用

1.函数的作用

函数是带有名字的代码块,其用于完成具体的工作,有时候需要在程序中多次执行同一项任务,如果每次都写相同的代码,程序就会显得又长又繁琐,可读性也不好,此时可以将这一项特定的任务写为函数体,在程序需要的时候调用执行该函数即可,这样一来程序的编写、可读性、测试和修改都将变得更加容易。

2.创建函数的语法

在这里插入图片描述
2.1上面显示的是一个函数定义,它由以下组件组成:
①关键字def标记函数头的开始。
②用于唯一标识它的函数名称。函数命名遵循在Python中编写标识符的相同规则。
③参数(参数),我们通过它将值传递给函数。它们是可选的。
④冒号(:)标记函数头的结尾。
⑤用于描述函数功能的可选文档字符串(docstring)。
⑥构成函数体的一个或多个有效的python语句。语句必须具有相同的缩进级别(通常为4个空格)。
⑦用于从函数返回值的可选return语句。

2.2定义函数时需要注意以下两点:
(1)函数定义必须放在函数调用前,否则编译器会由于找不到该函数而报错。
(2)返回值不是必需的,如果没有return语句,则Python默认返回值None。

3.如何调用函数

一旦我们定义了一个函数,我们就可以从另一个函数,程序甚至Python提示符中调用它。要调用函数,我们只需使用适当的参数接入函数名称。
先看一段简单定义的函数代码:

在这里插入图片描述
这段代码仅仅是对函数的定义,并没有调用执行。这条定义语句运行后会新建一个名为repeator的变量名,其类型为function,即函数。

在这里插入图片描述
内置函数一样,定义完函数后,可以通过函数名调用执行。

在这里插入图片描述
在很多情况下,函数需要将计算的结果返回到调用处。在这类函数的函数体中,通常包含一条return语句

在这里插入图片描述
在创建函数时, 没有在函数体中添加return语句,Python 也会默默地在函数体最后添加一条return None。

在这里插入图片描述
函数如果以返回值来输出:

在这里插入图片描述
在 Python 中, 还允许在函数中返回多个值。 只需将返回值以逗号隔开, 放在return关键字后面即可。

在这里插入图片描述
函数调用的四个步骤
①程序执行到函数调用时,在调用处暂停,等待函数执行完毕;
②将实参赋值给函数的形参;
③执行函数体中的语句;
④调用结束后,回到调用前暂停处继续执行,如果函数体中执行了return语句, return关键字后的值会返回到暂停处,供程序使用,否则函数返回None值。

二、函数参数

在Python中定义函数,可以用位置参数、默认参数、可变参数、关键字参数,这4种参数都可以组合使用。但是要注意,参数定义的顺序必须是:位置参数、默认参数、可变参数、关键字参数

1.参数传递

参数的传递过程,实际上是一个赋值的过程。在调用函数时,调用者的实际参数自动赋值给函数的形式参数变量。

在这里插入图片描述
参数传递方式:
(1)传值(call by value)调用:表示在调用函数时,会将自变量的值逐个复制给函数的参数,在函数中对参数值所做的任何修改都不会影响原来的自变量值。
(2)传址(pass by reference)调用:表示在调用函数时,所传递函数的参数值是变量的内存地址,参数值的变动连带着也会影响原来的自变量值。
在Python语言中,当传递的数据是不可变对象(如数值、字符串)时,在传递参数时,会先复制一份再进行传递。
但是,如果所传递的数据是可变对象(如列表),Python在传递参数时,会直接以内存地址来传递。
简单地说,如果可变对象在函数中被修改了内容值,因为占用的是同一个地址,所以会连带影响函数外部的值。

2.不可变和可变类型参数

目前我们所学习的不可变类型包括:整型、浮点型、字符串和元组可变类型有:列表、字典和集合等这些都可以作为参数的类型。但参数在函数中使用时,这两种类型的表现有所不同。

下面的代码调用时,传递的是不可变类型的参数:

在这里插入图片描述
如果不确定该给自定义函数传入多少个参数值时,就需要Python提供可变参数。在使用可变参数时,函数体中可以改变参数的元素:

在这里插入图片描述
因此,在使用可变类型参数时需要特别注意,如果在函数中修改了参数的元素,这种修改会影响调用者的变量。 如果想消除这种影响,可以使用列表copy方法或者使用分片操作创建新列表。

3.位置参数

位置参数是调用函数为形参赋值的一种默认方式。实参与形参按照从左到右的位置顺序依次赋值。这些实参的数目应与形参完全匹配。

在这里插入图片描述
赋值顺序改变将得到不同的结果:

在这里插入图片描述

4.关键字参数

虽然一个可变参数可以接受多个实参,但是这些实参都被捆绑为元组了,而且无法将具体的实参指定给具体的形参,那么有没有一种参数既可以接受多个实参,又可以把多个实参指定给各自的实参名呢?
为了避免位置参数赋值带来的混乱,Python 允许调用函数时通过关键字参数的形式指定形参与实参的对应关系。
而且这种参数会把带参数名的参数值组装到一个字典中,键就是具体的实参名,值就是传入的参数值。
调用者使用name=value的形式来指定函数中的哪个形参接受某个值:

在这里插入图片描述

5.指定默认参数值

默认参数是指在构造自定义函数的时候已经给某些参数赋予了各自的初值,当调用函数时,这样的参数可以不用传值,默认参数必须指向不变对象
这样当函数调用者没有提供对应参数值时,就可以使用指定的默认值。 指定默认参数值在 Python 的函数中广泛存在。例如,打印函数print,在查看其帮助时,其函数的部分描述如下:

在这里插入图片描述
可以看到,print函数的sep、end、file和flush参数都指定了默认值。

在这里插入图片描述
如果调用时指定了sep参数的值,则会使用该值来连接每个打印的值。

在这里插入图片描述
在定义函数时, 为形参指定默认值, 就可以让该形参在调用时变为可选:

在这里插入图片描述

6.任意数量参数

Python 允许在定义函数时使用单星号*来收集位置参数双星号**收集关键字参数
(1)单个星号将一组可变数量的位置参数组合成参数值的元组。在函数内部可以通过访问元组中的每个元素来使用参数。

在这里插入图片描述
(2)针对形参的关键字参数赋值形式, 利用 Python 定义函数时, 在形参前面加上双星号**来定义收集关键字参数的形参。此时形参是字典类型。

在这里插入图片描述

7.解包参数

在调用函数时,实参也可以使用和**语法。此时不是收集参数,正好相反, 实参前加上执行的是参数解包。 通常来说, 在列表、元组等类型的实参值前加上*, 将这些类型的元素解包成位置参数的形式;在字典类型的实参值前加上将字典的元素解包成关键字参数的形式
(1)当调用者的数据存储在列表中时, 可以通过在列表前加上*对列表解包来实现位置参数形式的调用。
(2)当调用者的数据存储在字典中时, 可以通过在字典前加上**对字典解包来实现关键字参数形式的调用。
但需要注意的是,如果使用字典作为实参,则默认使用字典的键,如果需要将字典中的键-值对作为参数则需要使用items()方法,如果需要将字典的值作为参数则需要调用字典的values()方法。
最后,要保证实参中元素个数与形参个数相等,否则会出现错误。

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

8.常用函数总结

print(abs(-3))
#返回-3的绝对值
print(pow(2,3))
#返回2的3次幂
print(round(71.1425,2))
#返回71.1425的四舍五入的值,参数2指定保留的小数位数
print(divmod(5,3))
#返回5除以3的商和余数,返回一个元组。
str = “I am a student”
print(str.lower())
#将字符串str中的所有字母转换为小写字母
print(str.upper())
#将字符串str中的所有字母转换为大写字母
print(str.swapcase())
#将字符串str中的所有字母大小写互换
print(str.capitalize())
#字符串str中的首字母大写,其余字母小写
print(str.title())
#将字符串str中的每个单词的首字母大写,其余为小写
print(str.ljust(20,“"))
#将str左对齐输出,字符串的总宽度为20,不足的部分以
填充
print(str.rjust(20,”"))
#将str右对齐输出,字符串的总宽度为20,不足的部分以
填充
print(str.center(20,“"))
#将str居中输出,字符串的总宽度为20,不足的部分以
填充
print(str.zfill(20))
#将字符串的宽度填充为20,并且右对齐,不足的部分用0补充
print(str.find(“s”))
#从str字符串中检索是否存在s,如果存在,则返回出现s的第一个字母的位置;如果str中没有s,则返回-1
print(str.index(“u”))
#与find()函数相同,只是在str中没有u时,返回一个运行时的错误
print(str.rfind(“s”))
#从str字符串右侧检索是否存在s,如果存在则返回出现字串s的第一个字母的位置;如果str中没有s,则返回-1
print(str.rindex(“u”))
#与rfind()函数相同,如果没有u时,返回一个运行时错误
print(str.count(“s”))
#计算s在str中出现的次数
print(str.replace(” “,”"))
#把str中的空格位置替换为

list = str.split(" ")
print(list)
#以空格为分隔符,把str分割成一个列表
strl = ""
print(strl.join(list))
#把list代表的字符串序列,用
连接起来

三、两种特殊函数

Python有两类特殊函数:匿名函数和递归函数
①匿名函数是指没有函数名的简单函数,只可以包含一个表达式,不允许包含其他复杂的语句,表达式的结果是函数的返回值。
②递归函数是指直接或间接调用函数本身的函数。递归函数反映了一种逻辑思想,用它解决某些问题时显得很简练。

1.匿名函数

Python 中提供了一项非常有用的功能:利用 lambda 函数来替代 def, 创建一个临时简单函数。
请注意, 与 def 语句不同,lambda 是一个表达式。 这就使得 lambda 能够出现在函数调用的参数中。而 def 语句则不能作为参数传递给函数。
lambda函数的定义和调用示例:

在这里插入图片描述
lambda表达式创建一个函数,它会返回函数本身。 这也是lambda被称为匿名函数的原因,它本身是没有名称的。如果需要在后面代码中使用该匿名函数,也可以将它赋值给一个变量。这个变量的类型就是一个函数。

(1)应用一:列表排序
对于列表的sort()方法,可以通过key来传入一个函数,sort()方法将利用这个函数对列表每个元素的返回结果来排序。

在这里插入图片描述
(2)应用二:映射函数 map
map()函数, 可以对序列中的每个元素应用某个内置函数, 并把函数结果收集起来,构成一个可迭代的map对象。 除了内置函数,常常会使用一些自定义的匿名函数来对序列元素进行映射。

在这里插入图片描述
(3)应用三:选择函数 filter
与map函数类似,filter函数也可以接受一个返回结果为布尔值的函数和可迭代对象作为实参。其作用是将可迭代对象中每一个元素都应用到传入的函数中,并将函数返回为True的元素添加到结果中,即对可迭代对象中的元素进行过滤。

在这里插入图片描述

2.递归函数

递归函数是指一个函数的函数体中又直接或间接地调用该函数本身的函数。
如果函数a中又调用函数a本身,则称函数a为直接递归。
如果函数a中先调用函数b,函数b中又调用函数a,则称函数a为间接递归。
程序设计中常用的是直接递归。

在这里插入图片描述
编写递归程序要注意两点:
(1)找出正确的递归算法,这是编写递归程序的基础;
(2)要确定算法的递归结束条件,这是决定递归程序能否正常结束的关键。

当一个问题蕴含了递归关系且结构比较复杂时,采用递归函数可以使程序变得简洁、紧凑,能够很容易地解决一些用非递归算法很难解决的问题。
但递归算法是以牺牲存储空间为代价的,因为每一次递归调用都要保存相关的参数和变量。
而且递归函数也会影响程序执行速度,由于反复调用函数,会增加时间开销。

下周继续肝!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值